O que é um arquivo ICNS?
Um arquivo ICNS é um contêiner da Apple para recursos de ícones de aplicativos. Ele pode conter várias dimensões, resoluções e representações de pixels de ícones usadas pelo macOS.
Como funcionam os arquivos ICNS
Um arquivo ICNS agrupa as representações de um ícone do macOS para diferentes tamanhos de exibição e densidades de pixels. Conforme implementado no leitor do Pillow, o arquivo começa com os quatro bytes icns e um comprimento total em big-endian, seguidos por elementos que começam, cada um, com um código de tipo de quatro caracteres e um comprimento. O código de tipo identifica a representação: ic07 é o ícone de 128 pontos, por exemplo, e ic10 é o ícone de 512 pontos na escala 2x. As ferramentas da Apple criam o arquivo a partir de uma pasta com a extensão .iconset que contém PNGs nomeados por tamanho em pontos e escala. O comando iconutil converte essa pasta em um arquivo ICNS e faz a conversão inversa, e as orientações de 2012 arquivadas pela Apple dizem que o Xcode 4.4 converte automaticamente uma pasta iconset em um projeto quando o projeto é compilado. O Info.plist do pacote indica o nome do arquivo de ícone por meio da chave CFBundleIconFile.
Informações essenciais
- Quais tamanhos devem estar no arquivo? A convenção iconset da Apple usa cinco tamanhos em pontos (16, 32, 128, 256 e 512), cada um na escala padrão e na escala
@2x, de modo que a maior imagem tem 1024 por 1024 pixels e se chamaicon_512x512@2x.png. O conjunto não precisa estar completo: as orientações da Apple dizem que o sistema escolhe a melhor representação para os tamanhos que você não fornece. Elas também dizem queicon_16x16@2x.pngeicon_32x32.pngnão são equivalentes, embora tenham a mesma quantidade de pixels, porque aparecem em tamanhos diferentes na tela e podem precisar de níveis de detalhe diferentes. Essas orientações são de 2012 e estão no acervo de documentação da Apple. - O que há dentro de cada elemento? Isso depende do código de tipo, então um analisador precisa lidar com mais de uma forma de conteúdo. No leitor do Pillow, os elementos de
ic07aic14e deicp4aicp6contêm, cada um, uma imagem PNG ou JPEG 2000 completa, enquanto tipos mais antigos, comois32eil32, contêm dados RGB, brutos ou codificados por comprimento de sequência, com o canal alfa em um elemento separado de máscara de 8 bits, comos8mkoul8mk. Isso é relevante para ferramentas que reutilizam um arquivo ICNS como origem de imagem: a documentação do electron-builder diz que ele extrai o maior quadro PNG incorporado quando um arquivo ICNS é a origem do ícone para outra plataforma. Um usuário relatou uma compilação para Linux que parou com “Could not extract a PNG frame from ICNS file” depois que a ferramenta mudou seu conversor de ícones, e contornou o problema fornecendo um PNG para a compilação para Linux. O relato não estabelece o que naquele arquivo causou a falha, e um mantenedor disse posteriormente que uma nova versão do conversor deveria corrigi-la. - Como criar ou inspecionar um? No macOS,
iconutil -c icnsconverte uma pasta.iconsetem um arquivo ICNS eiconutil -c iconsetconverte um arquivo ICNS de volta em seus PNGs; as orientações da Apple dizem que as imagens do iconset devem ser quadradas, com dimensões que correspondam aos nomes dos arquivos. Fora do macOS, o Pillow pode gravar arquivos ICNS em qualquer sistema operacional desde a versão 8.3.0. Seu gravador redimensiona a imagem que você salva para um quadrado em cada tamanho que você não fornece por meio deappend_images, e seu código de salvamento não verifica se a imagem de origem é quadrada ou tem 1024 pixels de largura. Ele associa as imagens emappend_imagespela largura em pixels, de modo que dois elementos com o mesmo tamanho em pixels compartilham uma imagem. Ele grava apenas os elementos deic07aic14, com larguras de 32 a 1024 pixels: a imagem de 32 pixels é armazenada como o ícone de 16 pontos na escala 2x, e não há elemento para o ícone de 16 pontos ou de 32 pontos na escala padrão. As orientações da Apple recomendam desenhar primeiro o ícone grande e depois decidir como reduzi-lo, ajustando o ícone quando necessário para o tamanho e a densidade de pixels em que ele aparece.
Quando os arquivos ICNS são relevantes
Um arquivo ICNS é relevante quando um pacote de aplicativo macOS é montado fora do pipeline de recursos do Xcode, por exemplo, por uma ferramenta de empacotamento multiplataforma. Talvez você não precise criar o arquivo: a documentação do electron-builder diz que ele usa um arquivo .icns pronto sem alterações e também pode converter uma imagem de origem PNG ou SVG, gerando todos os tamanhos a partir dessa única entrada. Forneça seu próprio arquivo quando sua ferramenta exigir um ou quando você quiser controlar a arte em cada tamanho. No Xcode, a documentação atual da Apple orienta você a fornecer o ícone do aplicativo por meio de um catálogo de recursos ou de um arquivo do Icon Composer. As orientações de 2012 arquivadas pela Apple dizem que um conjunto completo de tamanhos é recomendado, mas não obrigatório: o macOS escolhe a melhor representação disponível para um tamanho que você omitir, o que significa que esse tamanho é exibido a partir de uma arte desenhada para outro.
Fontes
- Acervo de documentação da Apple: otimização para alta resolução (tamanhos do iconset, iconutil, conversão pelo Xcode)
- Apple: chave CFBundleIconFile da lista de propriedades de informações
- Apple: configuração do ícone do aplicativo usando um catálogo de recursos
- Apple: criação do ícone do aplicativo usando Icon Composer
- Código-fonte do Pillow: IcnsImagePlugin.py (tipos de elementos ICNS e seus conteúdos)
- Manual do Pillow: leitura e salvamento de ICNS
- Documentação do electron-builder (v26): ícones e imagens (entradas de ícones aceitas, conversão de ICNS)
- Relato 9876 no electron-builder: Could not extract a PNG frame from ICNS file