Search code examples
pngapplescriptconvertersautomatoricns

How do I command Automator to convert the multiple images from PNG to ICNS once at all?


I use OS X Mountain 10.8.2.

I used Automator and added AppleScript, copying the command from the old app's developer at the Iconoodle - Convenient ICNS to PNG image conversion (Iconoodle isn't supported by OS X 10.8 by being a PPC app). I saved the workflow as an application. I selected the images and dropped them into the application, but the images weren't converted to ICNS. I also copied from the question Convert image to .icns file AppleScript Obj-C and it didn't work either.

I'm really frustrated with it. I want to use Automator to convert the multiple images from PNG to ICNS once at all. It's very annoying to convert each image to ICNS in the icon editor applications, one for one. The Preview.app doesn't want to convert the image in format PNG to ICNS because it has only one page, it can convert it to ICNS only if the icon has many pages.

Do you know to make it?

Thank you for your attention, help and patience!


Solution

  • Here is another approach... NOTE: Your ORIGINAL pngs will be scaled to the expected size before the icns file is created. If you want to keep a copy of the original png, duplicate it first. You can also add a line or so to the script to do so automatically.

    property expectedSizes : {16, 32, 48, 128, 256, 512, 1024, 9999999}
    
    set myFiles to choose file with multiple selections allowed
    
    repeat with aFile in myFiles
    
        tell application "System Events" to set bPath to POSIX path of (container of aFile)
        set newPath to bPath & "/" & bName(aFile) & ".icns" as text
        set aFile to quoted form of (POSIX path of aFile)
    
        set {W, H} to {paragraph 1, paragraph 2} of (do shell script "sips -g pixelWidth -g pixelHeight " & aFile & " | grep -Eo [0-9]*$")
        set {W, H} to {W as number, H as number}
    
        if W > H then
            set W to eSize(W)
            do shell script "sips " & aFile & " -Z " & W & " -p " & W & space & W & " --padColor FFFFFF -i"
            delay 1
        else if H > W then
            set H to eSize(H)
            do shell script "sips " & aFile & " -Z " & H & " -p " & H & space & H & " --padColor FFFFFF -i"
            delay 1
            -- H = W but not in expected sizes
        else if H is not in expectedSizes then
            set H to eSize(H)
            do shell script "sips " & aFile & " -Z " & H & " -p " & H & space & H & " --padColor FFFFFF -i"
            delay 1
        end if
    
        do shell script "sips -s format icns " & aFile & " --out " & quoted form of newPath
    end repeat
    
    on bName(theFile)
        tell application "Finder" to set {name:fileName, name extension:nameExtension} to theFile
        set baseName to text 1 thru ((get offset of "." & nameExtension in fileName) - 1) of fileName
    end bName
    
    on eSize(lDimen)
        repeat with i from 1 to 8
            if lDimen < item i of expectedSizes then return item (i - 1) of expectedSizes
        end repeat
    end eSize