Como descobrir se um PNG é PNG-8 ou PNG-24?

Respostas:

25

O fileuso do comando em outras respostas às vezes é inconsistente. Por exemplo:

───────────────────────────────────────────────────────────────────────────────
rick@dell:~/Pictures$ file "256 colors.jpg"
256 colors.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, baseline, precision 8, 800x800, frames 3
───────────────────────────────────────────────────────────────────────────────
rick@dell:~/Pictures$ file "vnStat.png"
vnStat.png: PNG image data, 410 x 121, 8-bit/color RGB, non-interlaced

A primeira instância provavelmente é uma foto da câmera e a segunda instância que tirei usando uma captura de tela.

O identifycomando no qual minha resposta se baseia parece funcionar corretamente em todas as instâncias. Por exemplo, teste na primeira instância acima:

rick@dell:~/Pictures$ identify "256 colors.jpg"
256 colors.jpg JPEG 800x800 800x800+0+0 8-bit sRGB 45KB 0.000u 0:00.000

Eu tenho o ImageMagick instalado, o que me permite usar:

$ identify -verbose vnStat.png
Image: vnStat.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 410x121+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 49610
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 12.0814 (0.0473779)
      standard deviation: 46.7032 (0.18315)
      kurtosis: 18.8998
      skewness: 4.49862
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 21.1804 (0.0830606)
      standard deviation: 57.5336 (0.225622)
      kurtosis: 6.68226
      skewness: 2.82613
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 14.2606 (0.0559237)
      standard deviation: 50.2969 (0.197243)
      kurtosis: 13.5573
      skewness: 3.85914
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 15.8408 (0.0621207)
      standard deviation: 51.7078 (0.202776)
      kurtosis: 11.8528
      skewness: 3.62638
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 410x121+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2017-01-24T20:04:50-07:00
    date:modify: 2017-01-24T20:04:50-07:00
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 2
    png:IHDR.color_type: 2 (Truecolor)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 410, 121
    png:sRGB: intent=0 (Perceptual Intent)
    png:text: 1 tEXt/zTXt/iTXt chunks were found
    signature: e9f31b79da6ce46cdea5da21ae8648496faa181b0621098aa2dbbdff4a9a4502
    Software: gnome-screenshot
  Artifacts:
    filename: vnStat.png
    verbose: true
  Tainted: False
  Filesize: 14.7KB
  Number pixels: 49.6K
  Pixels per second: 0B
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.8.9-9 Q16 x86_64 2017-07-31 http://www.imagemagick.org

Para um relatório resumido, omita todos os parâmetros:

$ identify vnStat.png
vnStat.png PNG 410x121 410x121+0+0 8-bit sRGB 14.7KB 0.000u 0:00.000

Substitua vnStat.pngpelo seu próprio .pngnome de arquivo e, se necessário, anteceda-o pelo caminho.


Para entender PNG-24 vs PNG-32, esta resposta do SuperUser resume:

Se sua imagem é de 24 bits, você verá:

Channel depth:
  red: 8-bit
  green: 8-bit
  blue: 8-bit

Se sua imagem PNG for 32 bits, você verá:

Channel depth:
  red: 8-bit
  green: 8-bit
  blue: 8-bit
  alpha: 8-bit

No entanto, esta resposta não está completa porque as cores de 8 bits também mostram 8 bits para vermelho, verde e azul, apenas uma paleta de cores é usada para limitar o número de seleções (como no bom e velho Windows 2.0).


Examine estas três imagens do Artigo de profundidade da Wikipedia :

8_bit.png

Nome do arquivo: 8_bit.png

Usando:

identify -verbose  8_bit.png | grep colors
    png:PLTE.number_colors: 249

Vemos que existem 249 cores usadas. O máximo possível com 8 bits é de 256 cores.


4 bit

Nome do arquivo: 4_bit.png

Usando:

identify -verbose  4_bit.png | grep colors
    png:PLTE.number_colors: 16

Vemos que existem 16 cores usadas, que são as combinações máximas de cores possíveis com 4 bits.


2_bit.png

Nome do arquivo: 2_bit.png

Usando:

$ identify -verbose  2_bit.png | grep colors
    png:PLTE.number_colors: 4

Vemos que existem 4 cores usadas, que são as combinações máximas de cores possíveis com 2 bits.

WinEunuuchs2Unix
fonte
2
Para um formato mais amigável ao script, você também pode fazer identify -format %z- consulte as opções de formato do ImageMagick para obter mais.
fofo
29

PNG de 32 bits (8 bits por canal - com alfa, também chamado de "PNG de 24 bits com 8 bits de alfa" ou "PNG24 com alfa"):

$ file zyne_zyne.png: 
PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced

PNG de 24 bits (8 bits por canal - sem canal alfa)

$ file 24.png
PNG image data, 1060 x 821, 8-bit/color RGB, non-interlaced

PNG de 8 bits (256 cores):

$ file 8bit.png
PNG image data, 1060 x 821, 8-bit colormap, non-interlaced
Rinzwind
fonte
Eo emblema é meu :-)
Rinzwind
1
Os PNGs de paleta ainda têm 8 bits por componente RGBA, estão limitados a 256 entradas de paleta. (Cada pixel é um índice de 8 bits ou menor na paleta, em vez de armazenar os dados de pixel literalmente). Não está totalmente claro o que é isso. PNG24 também é de 8 bits por componente (não de 24 bits por componente). Portanto, essa seria uma resposta melhor se você mostrasse a saída dos dois tipos de PNG.
Peter Cordes
Eu não entendi o que você quis dizer com "badge" 8 horas atrás, mas agora eu faço porque eu acordei com um bronze e prata :)
WinEunuuchs2Unix
1 a 10 crachá é sempre o vencedor única superada por 1 a 100 ;-)
Rinzwind
1
@evilSnobu> fileé minha principal ferramenta de identificação de arquivos e sempre fico impressionado com o quanto ele pode dizer sobre formatos de arquivo exóticos. Concedido, sua implementação cresceu um pouco desde os anos 80 :)
espectros
8

Se você tiver o exiftool instalado, poderá:

bash-4.3 # exiftool continents_blank_l.png 
Número da versão ExifTool: 10.20
Nome do arquivo: continents_blank_l.png
Diretório:.
Tamanho do arquivo: 170 kB
Data / hora da modificação do arquivo: 2016: 07: 05 07: 59: 28 + 05: 30
Data / Hora de acesso ao arquivo: 2017: 08: 07 00: 35: 15 + 05: 30
Data / Hora da Alteração do Inode do Arquivo: 2016: 07: 05 07: 59: 28 + 05: 30
Permissões do arquivo: rw-r - r--
Tipo de Arquivo: PNG
Extensão de tipo de arquivo: png
Tipo MIME: image / png
Largura da imagem: 1100
Altura da imagem: 850
Profundidade de bits: 8
Tipo de cor: RGB com alfa
Compressão: Desinflar / Inflar
Filtro: Adaptável
Entrelaçado: Não entrelaçado
Cor de fundo: 255 255 255
Pixels por unidade X: 3937
Pixels por unidade Y: 3937
Unidades de pixel: metros
Data da modificação: 2016: 07: 05 02:29:28
Tamanho da imagem: 1100x850
Megapixels: 0.935
Senhor do fogo
fonte
5

A maneira do hacker: espie os bytes reais dentro do bloco PNG IHDR .

 $ od -j 24 -N 2 -t u1 -An drivemount-applet_open.png
   8   2

O primeiro número indica a profundidade de bits. O segundo, o tipo de cor (2 é para imagens RGB, ou seja, imagens com três canais ou três valores de amostra por pixel).

Portanto, neste caso, temos um PNG RGB8 (24 bits por pixel).

leonbloy
fonte
Não é esse PNG24 (8 bits por canal)? PNG8 é um mapa de cores de 8 bits = 256 cores.
precisa saber é o seguinte
1
Sim, o RGB8 corresponde ao PNG24.
leonbloy
Certo. Foi mal. Eu li isso como PNG8 e não RGB8. Sua resposta está totalmente correta.
precisa saber é o seguinte
3

Como alternativa ao uso acima de "arquivo", que depende da mágica do arquivo no cabeçalho do arquivo PNG, se estiver trabalhando com arquivos PNG, é útil ter o pacote " pngtools " instalado.

O pnginfo pode ser usado para fornecer detalhes completos das propriedades do arquivo PNG, incluindo o BitDepth (Bits / Sample) (que não deve ser confundido com outra propriedade, a profundidade do pixel).

 file  Debian_Expo.png

 Debian_Expo.png: PNG image data, 1280 x 1024, 8-bit/color RGB, non-interlaced

 ---

 pnginfo Debian_Expo.png

 Image Width: 1280 Image Length: 1024
 Bitdepth (Bits/Sample): 8
 Channels (Samples/Pixel): 3
 Pixel depth (Pixel Depth): 24
 Colour Type (Photometric Interpretation): RGB 
 ...

O equivalente para arquivos JPEG é jpeginfo, em seu próprio pacote jpeginfo.

O formato da saída do pnginfo facilita a extração do valor do BitDepth (como em uma linha separada) se ele estiver sendo usado em um script de shell.

Se o arquivo não for realmente um arquivo PNG, porque, por exemplo, é um JPEG com nome incorreto, o pnginfo informará "Este arquivo não é um arquivo PNG válido".

Como sempre, a ferramenta apropriada para o trabalho é determinada, entre outras coisas, pela frequência com que você vai usar a ferramenta e como deseja processar a saída.

JG Miller
fonte