![]() | |
"read all gif images, make all colors, except black, transparent, open as a SketchMorph - like from FileList menu"
| slash dir image transparent black dirName |
slash _ FileDirectory slash.
black _ Color r:0 g:0 b: 0.
dirName _ (*2184* default pathName), slash, 'kanji', slash, 'matrix_kanji', slash.
dir _ FileDirectory on: dirName.
dir fileNames withIndexDo: [:fname :fid | (fname asLowercase endsWith: '.gif')
ifTrue: [image _ GIFReadWriter formFromFileNamed: dirName, fname.
transparent _ (image colors select: [:c | c isTransparent]) first.
image colors withIndexDo: [:c :i |
(c isTransparent not and: [(c = black) not])
ifTrue: [image colors at: i put: transparent]].
World addMorph: (image _ SketchMorph new form: image).
image position: (fid*10)@(fid*10)]].
Note the use of #readOnlyFileNamed:, #baseNameFor, and #directoryNamed: to build up fully qualified filenames, rather than platform-specific string concatenation. nb #readOnlyFileNamed: is useful in that it won't silently create files when your logic isn't correct!
scaleImagesOnPath: aPath toSize: anExtent
| dir form filename |
dir := FileDirectory on: aPath.
Transcript cr; show: dir pathName.
(dir fileNames
select: [:each |
(each asLowercase endsWith: '.jpg')
and: [(each includesSubString: 'thumb') not]])
do: [:key |
form := Form fromBinaryStream: (dir readOnlyFileNamed: key).
filename := dir fullPathFor: (FileDirectory baseNameFor: key) , '-thumb.jpg'.
dir deleteFileNamed: filename.
JPEGReadWriter2
putForm: (form scaledToSize: anExtent)
onFileNamed: filename].
"recurse"
dir directoryNames
do: [:each |
self scaleImagesOnPath:
(dir directoryNamed: each) pathName toSize: anExtent]
Based on an example from Ramon Leon's excellent blog.
Separate the directory traversal from the processing, thus:
traverse: aFileDirectory doing: aBlockWithFileArgument aFileDirectory fileNames do: [ :p | aBlockWithFileArgument value: (aFileDirectory fullPathFor: p)]. aFileDirectory directoryNames select: [ :d | (d startsWith: '.') not] thenDo: [ :d | self traverse: (aFileDirectory directoryNamed: d) doing: aBlockWithFileArgument ].
Call this code, eg:
self traverse: (FileDirectory on: 'c:\') doing: [ :fp | Transcript show: fp; cr.].