; ======================================================== ; _____ _ __ ; |_ _| (_)/ _| ; | | ___ ___ _ __ _| |_ _ _ ___ ___ _ __ ___ ; | | / __/ _ \| '_ \| | _| | | | / __|/ __| '_ ` _ \ ; _| || (_| (_) | | | | | | | |_| |_\__ \ (__| | | | | | ; \___/\___\___/|_| |_|_|_| \__, (_)___/\___|_| |_| |_| ; __/ | ; |___/ ; ========================================================= ; Iconify.scm By: Giuseppe Bilotta ; ========================================================= ; Modified for Gimp 2.4.6+ by Ouch67 ; http://www.gimptalk.com/forum/broken-scripts-t33501.html ; Resubmission to Gimp Plugin Registry & GimpTalk by Gargy ; ========================================================= ; ; LICENSE ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . ; ; ========================================================= ; Description...: Iconify plug-in converts a single layer of a single image ; into a multi-layered image ready to be saved as a Windows icon. ; The new image will contain all standard sizes (16x16, 32x32, 48x48) at all ; standard bit depths (16 colors, 256 colors, 32-bit RGBA), with transparency support. ; ========================================================= ; ; This is my first plugin. ; It converts an image into a Windows/Macintosh icon (define (script-fu-iconify img drawable) ; Create a new image. We size it to 256x256 to allow for ; the future Windows Vista icons; it's also easy to add ; 128x128 Macintosh icons, or other sizes ; TODO make the sizes (and depths) parameters to the function (let* ( (new-img (car (gimp-image-new 256 256 0))) (new-name 0) (work-layer 0) (layer-x 0) (layer-y 0) (max-dim 0) (temp-layer 0) (temp-img 0) (layers 0) (layernum 0) (layers-array 0) (layer 0) (eigth-bit 0) (four-bit 0) ) ; Set the name of the new image by replacing the extension with .ico ; FIXME this doesn't work as intended for files without extension ; or files with multiple extensions. (set! new-name (append (butlast (strbreakup (car (gimp-image-get-filename img)) ".") ) '(".ico") ) ) (set! new-name (eval (cons string-append new-name))) (gimp-image-set-filename new-img new-name) ; Create a new layer (set! work-layer (car (gimp-layer-new-from-drawable drawable new-img))) ; Give it a name (gimp-layer-set-name work-layer "Work layer") ; Add the new layer to the new image (gimp-image-add-layer new-img work-layer 0) ; Autocrop the layer (plug-in-autocrop-layer 1 new-img work-layer) ; Now, resize the layer so that it is square, ; by making the shorter dimension the same as ; the longer one. The layer content is centered. (set! layer-x (car (gimp-drawable-width work-layer))) (set! layer-y (car (gimp-drawable-height work-layer))) (set! max-dim (max layer-x layer-y)) (gimp-layer-resize work-layer max-dim max-dim (/ (- max-dim layer-x) 2) (/ (- max-dim layer-y) 2)) ; Move the layer to the origin of the image (gimp-layer-set-offsets work-layer 0 0) ; Now, we create as many layers as needed, resizing to ; 16x16, 32x32, 48x48, 128x128, 256x256 (define (resize-to-dim dim) (set! temp-layer (car (gimp-layer-copy work-layer 0))) (gimp-image-add-layer new-img temp-layer 0) (gimp-drawable-transform-scale temp-layer 0 0 dim dim 0 2 1 3 0) ) ; We don't do the two biggest sizes, for now ; TODO make this a parameter (mapcar resize-to-dim '(16 32 48)) ; We can now get rid of the working layer (gimp-image-remove-layer new-img work-layer) ; These two functions allow us to create new layers which are ; clones of the existing ones but at different color depths. ; We have to use two functions and pass through intermediate ; images because otherwise the second color reduction would dupe ; the layers, thus giving an unneeded extra set of layers ; TODO a potential study should be done on whether it's better ; to go straight to the lowest number of color (as we do), or ; passing through intermediate number of colors. ; Observe that no dithering is done. This is intentional, since ; it gives the best results. (define (palettize-image pal-type num) (set! temp-img (car (gimp-image-duplicate new-img))) (gimp-image-convert-indexed temp-img 0 pal-type num 0 1 "") temp-img) (define (plop-image temp-img) (set! layers (gimp-image-get-layers temp-img)) (set! layernum (car layers)) (set! layers-array (cadr layers)) (while (> layernum 0) (set! layer (car (gimp-layer-new-from-drawable (aref layers-array (- layernum 1)) new-img) ) ) (gimp-image-add-layer new-img layer 0) (set! layernum (- layernum 1)) ) ) ; The 256 color image, using an optimized palette (set! eigth-bit (palettize-image 0 256)) ; The 16 color image, using the 'official' 'web' optimized palette ; It must be done with that palette because otherwise we can't ; save to 16-color in Windows .ico format (set! four-bit (palettize-image 2 16)) ; Now we put the new layers back in the original image (plop-image eigth-bit) (plop-image four-bit) ; We display the new image (gimp-display-new new-img) ; And we flush the display (gimp-displays-flush) )) ; TODO the plugin currently only works with truecolor images ; it could be extended to work with palettized images, thus only creating ; layers for depths up to the current image depth (script-fu-register "script-fu-iconify" "/Script-Fu/Utils/Iconify" "Use the current layer of the current image to create a multi-sized, multi-depth Windows icon file" "Giuseppe Bilotta, Fixed By Ouch for gimp 2.4+" "Giuseppe Bilotta, Fixed By Ouch for gimp 2.4+" "20051021" "RGB*" SF-IMAGE "Image to iconify" 0 SF-DRAWABLE "Layer to iconify" 0)