How to manually create icns files using iconutil?

前端 未结 18 1911
无人共我
无人共我 2020-11-29 15:08

When I\'m validating my app I get this error:

the application bundle does not contain an icon in ICNS format, containing both a 512x512

相关标签:
18条回答
  • 2020-11-29 15:38

    @dardo82's shell code is good & worked. Here is a simpler one in sh (for all *nix's) and faster (like it really matters):

    #!/bin/sh
    #   This runs silent, be as verbose as you wish
    NAME=$(basename ${1} .png)
    DIR="${NAME}.iconset"
    mkdir -p ${DIR}
    for i in 16 32 128 256 512 ; do
        x=""
        for p in $i $(($i+$i)) ; do
            sips -z $p $p ${1} --out "${NAME}.iconset/icon_${i}x${i}${x}.png"
            x="@2x"
        done
    done >/dev/null  # /dev/null in lieu of a "-s" silent option
    iconutil -—convert icns $DIR
    rm -r $DIR
    
    0 讨论(0)
  • I've refactored @Henry's script to make it look better:

    #!/bin/zsh
    NAME=$(basename $1 .png); DIR="$NAME.iconset"
    mkdir -pv $DIR
    for m r in 'n' '' '((n+1))' '@2x'; do
        for n in $(seq 4 9 | grep -v 6); do
            p=$((2**$m)); q=$((2**$n))
            OUT="$DIR/icon_${q}x${q}${r}.png"
            sips -z $p $p $1 --out $OUT
        done
    done
    iconutil -c icns $DIR
    rm -frv $DIR
    

    Update

    The -c parameter to iconutil is no longer supported. Use -—convert instead:

    #!/bin/zsh
    NAME=$(basename $1 .png); DIR="$NAME.iconset"
    mkdir -pv $DIR
    for m r in 'n' '' '((n+1))' '@2x'; do
        for n in $(seq 4 9 | grep -v 6); do
            p=$((2**$m)); q=$((2**$n))
            OUT="$DIR/icon_${q}x${q}${r}.png"
            sips -z $p $p $1 --out $OUT
        done
    done
    iconutil -—convert icns $DIR
    rm -frv $DIR
    
    0 讨论(0)
  • 2020-11-29 15:40

    Additional comment, when you create .icns file, you need to rename all the pic files with prefix "icon_", otherwise, iconutil will fail with error message: ".iconset:error: Failed to generate ICNS." which is not informative at all.

    0 讨论(0)
  • 2020-11-29 15:43

    I have written a bash script for making icns from a svg file:

    #!/usr/bin/env bash 
    sizes=(16 32 64 128 256 512)
    largfile='icon_512x512@2x.png'
    if [ ! -f "$largfile" ]; then
      convert -background none -resize 1024x1024 "$1" "$largfile"
    fi
    for s in "${sizes[@]}"; do
      echo $s
      convert -background none -resize ${s}x${s} "$largfile" "icon_${s}x$s.png"
    done
    
    cp 'icon_32x32.png'     'icon_16x16@2x.png'
    mv 'icon_64x64.png'     'icon_32x32@2x.png'
    cp 'icon_256x256.png'   'icon_128x128@2x.png'
    cp 'icon_512x512.png'   'icon_256x256@2x.png'
    
    mkdir icon.iconset
    mv icon_*x*.png icon.iconset
    iconutil -c icns icon.iconset
    

    Make sure you have imagemagick installed with librsvg support, on mac:

    brew install imagemagick --with-librsvg
    

    This script has served me quite well.


    Update

    For a more thorough treatment, I have created a command line tool (written in Swift) for generating AppIcon.appiconset with the correct layout and format:

    https://github.com/kindlychung/genicon

    0 讨论(0)
  • 2020-11-29 15:43

    When I'm validating my app I get this error:

    the application bundle does not contain an icon in ICNS format, containing both a 512x512 and a 512x512@2x image.

    I am not very good with terminal command and so maybe I'm doing something wrong. I wrote:

    iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>
    

    For one thing, as I mentioned in a comment on Anne's answer, you probably don't need to use iconutil. You should be able to just add the iconset to your project and let Xcode convert it for you as part of the build.

    Either way, this may be your problem:

    I tryed to put two PNG files togheter (512x512 and 1024x1024) … but I always get the error.

    There is no 1024 by 1024 point size. The 1024 by 1024 pixel element (which was 1024 points before Mountain Lion) is now used for 512 by 512 points @2x.

    Your PNG file must be named appropriately: icon_512x512@2x.png

    0 讨论(0)
  • 2020-11-29 15:43

    Hello, for my needs I made a droplet that works in drag and drop icons alone or icons to search in a folder (I limited to folders as the searches on Volumes of all the icons can take a lot of time ). So in drag and drop you can drop folders or application, anything that can contain an icon. The iconset created bears the name of the original icon, it is placed in a directory "/ aaaicones" and the path of the icon. Example in the folder "/ aaaicones if you submit xcode.app you will find "/aaaicones/Applications/xcode.app/access.iconset" and /aaaicones/Applications/xcode.app/access.icns (the recreated icon) there will be a text file where it is traced the full path of the icons , And the path to the corresponding iconset example "/Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn.framework/Versions/A/Resources/access.icns" "/aaaicones/Applications/xcode.app/access.iconset" in the example taken (xcode) this can create a folder at the end (with all icons and iconset) of 214 MB in size. If you treat an icon alone, it will be placed in the directory "/ aaaicones / aIconeseule /" and its original path, example /aaaicones/aIconeseule/Mac Elcapitan/.VolumeIcon.icns and /aaaicones/aIconeseule/Mac Elcapitan /.VolumeIcon.iconset with /aaaicones/aIconeseule/Mac Elcapitan/aalisticones.txt The droplet is below

    on open draggedItems
        set input to draggedItems
        set fich to draggedItems
    
    
        set media to {}
    
        set theInfo to {}
    
        set n to "0"
        repeat with currentItem in draggedItems
            set dirchoisi to POSIX path of fich
            if ".icns" is not in dirchoisi then
                if "Volumes" is not in dirchoisi then
    
                    set origi to do shell script "echo   /aaaicones" & dirchoisi
                    set fich to do shell script "echo " & fich & " | xxd -p -c 100000 | sed 's#3a#2f#g' | xxd -r -p | sed 's#" & dirchoisi & "#" & "/aaaicones" & dirchoisi & "#g' | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
                    tell application "Finder"
                        if exists (folder fich) then
                            set nn to "0"
                            repeat with nn from 1 to 5
                                set origi to do shell script "echo  " & origi & "/" & " | sed 's#//#" & nn & "/" & "#'"
                                set fich to do shell script "echo " & fich & " | sed 's#:aaaicones*.*#" & origi & "#'" & " | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
    
                                if not (exists folder (fich as Unicode text)) then
                                    try
                                        set origi to do shell script "echo  " & origi
                                        exit repeat
                                    end try
                                end if
                            end repeat
                        end if
                    end tell
                    tell application "Finder"
                        if not (exists folder (fich as Unicode text)) then
                            do shell script "mkdir -p -m 0777 " & quoted form of origi
                        end if
                    end tell
                    try
                        set theInfo to do shell script "find " & (quoted form of dirchoisi) & " -name *.icns "
                    end try
    
    
    
    
                    set AppleScript's text item delimiters to return
    
                    set theList to text items of theInfo
    
                    set AppleScript's text item delimiters to ""
    
                    set n to count theList
                    repeat with i from 1 to n
                        if "Volumes" is not in item i of theList then
                            set end of media to item i of theList
                        end if
                    end repeat
                    set n to count media
                    set cheminicns to do shell script " > " & quoted form of (origi & "aalisticones.txt") & " |  chmod 777 " & quoted form of (origi & "aalisticones.txt")
                    set cheminicns to do shell script "ls " & quoted form of (origi & "aalisticones.txt")
    
                    tell application "Finder"
                        set letext to (POSIX file cheminicns as alias)
                        set label index of letext to 2
                    end tell
    
    
    
                    repeat with i from 1 to n
    
                        set hdd to item i of media
                        try
    
                            set input to do shell script "echo   " & hdd & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                            do shell script "echo   " & quoted form of input & " >>" & quoted form of cheminicns
                            set png to do shell script "echo " & quoted form of input & " | sed 's#.*/##' "
    
                            do shell script "cp -f " & quoted form of input & " " & quoted form of origi
                            set input to do shell script "iconutil -c iconset  " & quoted form of (origi & png)
                            do shell script "echo   " & quoted form of (origi & png) & " | sed 's#.icns#.iconset#' >>" & quoted form of cheminicns
                        end try
                    end repeat
                    tell application "Finder"
                        if exists (folder fich) then
                            open fich
                        end if
                    end tell
    
                end if
            else
    
                set input to do shell script "echo   " & dirchoisi & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                set png to do shell script "echo " & quoted form of input & " | sed 's#.*/##' "
                set origi to do shell script "echo " & quoted form of ("/aaaicones/aIconeseule/" & input) & " | sed 's#/Volumes/##; s#" & quoted form of png & "##'"
                do shell script "mkdir -p -m 0777 " & quoted form of origi
                do shell script "echo   " & quoted form of input & " >>" & quoted form of origi & "aalisticones.txt"
    
                do shell script "cp -f " & quoted form of input & " " & quoted form of origi
                set input to do shell script "iconutil -c iconset  " & quoted form of (origi & png)
                do shell script "echo   " & quoted form of (origi & png) & " >>" & quoted form of origi & "aalisticones.txt"
            end if
        end repeat
    end open
    
    0 讨论(0)
提交回复
热议问题