Come faccio a sapere se un PNG è PNG-8 o PNG-24?


Risposte:


25

Il filecomando utilizzato in altre risposte è talvolta incoerente. Per esempio:

───────────────────────────────────────────────────────────────────────────────
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

La prima istanza è probabilmente un'immagine della fotocamera e la seconda che ho preso usando una cattura dello schermo.

Il identifycomando, su cui si basa la mia risposta, sembra funzionare correttamente in tutti i casi. Ad esempio test sulla prima istanza sopra:

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

Ho ImageMagick installato che mi permette di usare:

$ 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

Per un rapporto di riepilogo omettere tutti i parametri:

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

Sostituisci vnStat.pngcon il tuo .pngnome file e prefiguralo con il percorso, se necessario.


Per capire PNG-24 vs PNG-32 questa risposta di SuperUser la riassume:

Se la tua immagine è a 24 bit vedrai:

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

Se la tua immagine PNG è a 32 bit vedrai:

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

Tuttavia questa risposta non è completa perché il colore a 8 bit mostra anche 8 bit per Rosso, Verde e Blu, solo una tavolozza di colori viene utilizzata per limitare il numero di selezioni (come nella buona vecchia Windows 2.0).


Esamina queste tre immagini dall'articolo di approfondimento di Wikipedia :

8_bit.png

Nome del file: 8_bit.png

usando:

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

Vediamo che ci sono 249 colori utilizzati. Il massimo possibile con 8 bit è di 256 colori.


4 bit

Nome del file: 4_bit.png

usando:

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

Vediamo che ci sono 16 colori usati, che è la massima combinazione di colori possibile con 4 bit.


2_bit.png

Nome del file: 2_bit.png

usando:

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

Vediamo che ci sono 4 colori usati, che è la massima combinazione di colori possibile con 2 bit.


2
Per un formato più intuitivo puoi anche fare identify -format %z- vedi le opzioni del formato di ImageMagick per ulteriori informazioni.
soffice

29

PNG a 32 bit (8 bit per canale - w / alpha, chiamato anche "PNG a 24 bit con 8 bit di alfa" o "PNG24 con alfa"):

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

PNG a 24 bit (8 bit per canale - nessun canale alfa)

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

PNG a 8 bit (256 colori):

$ file 8bit.png
PNG image data, 1060 x 821, 8-bit colormap, non-interlaced

E il distintivo è mio :-)
Rinzwind

1
I PNG palette hanno ancora 8 bit per componente RGBA, sono limitati a 256 voci di palette. (Ogni pixel è un indice di 8 bit o più piccolo nella palette, anziché archiviare i dati dei pixel alla lettera). Non è del tutto chiaro quale sia. PNG24 è anche 8 bit per componente (non 24 bit per componente). Quindi questa sarebbe una risposta migliore se mostrassi l'output di entrambi i tipi di PNG.
Peter Cordes,

Ho capito male cosa intendevi per "distintivo" 8 ore fa, ma ora lo faccio perché mi sono svegliato con un bronzo e argento :)
WinEunuuchs2Unix

Il badge da 1 a 10 è sempre il vincitore superato solo dal 1 a 100 ;-)
Rinzwind

1
@evilSnobu> fileè il mio principale strumento di identificazione dei file e sono sempre stupito di quanto possa dire anche su formati di file esotici. Certo, la sua implementazione è cresciuta un po 'dagli anni '80 :)
extra il

8

Se hai installato exiftool , puoi fare:

bash-4.3 # exiftool continents_blank_l.png 
Numero versione ExifTool: 10.20
Nome file: continents_blank_l.png
Directory:.
Dimensione file: 170 kB
Data / ora modifica file: 2016: 07: 05 07: 59: 28 + 05: 30
Data / ora di accesso al file: 2017: 08: 07 00: 35: 15 + 05: 30
Data / ora modifica file Inode: 2016: 07: 05 07: 59: 28 + 05: 30
Autorizzazioni file: rw-r - r--
Tipo di file: PNG
Estensione tipo file: png
Tipo MIME: image / png
Larghezza immagine: 1100
Altezza immagine: 850
Profondità bit: 8
Tipo di colore: RGB con alfa
Compressione: sgonfia / gonfia
Filtro: adattivo
Interlacciato: non interlacciato
Colore di sfondo: 255 255 255
Pixel per unità X: 3937
Pixel per unità Y: 3937
Pixel: metri
Data modifica: 2016: 07: 05 02:29:28
Dimensione dell'immagine: 1100x850
Megapixel: 0.935

5

La via dell'hacker: sbirciare nei byte reali all'interno del blocco PNG IHDR .

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

Il primo numero indica la profondità di bit. Il secondo, il tipo di colore (2 è per le immagini RGB, ovvero le immagini con tre canali o tre valori campione per pixel).

Quindi, in questo caso abbiamo un PNG RGB8 (24 bit per pixel).


Non è PNG24 (8 bit per canale)? PNG8 è una mappa colori a 8 bit = 256 colori.
evilSnobu

1
Sì, RGB8 corrisponde a PNG24.
leonbloy,

Giusto. Colpa mia. L'ho letto come PNG8 non RGB8. La tua risposta è del tutto corretta.
evilSnobu,

3

In alternativa all'uso sopra di "file" che si basa sulla magia dei file nell'intestazione del file PNG, se si lavora con file PNG, è utile avere installato il pacchetto " pngtools ".

pnginfo può quindi essere usato per fornire tutti i dettagli delle proprietà del file PNG incluso BitDepth (Bit / Esempio) (che non deve essere confuso con un'altra proprietà, Pixel Depth).

 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 
 ...

L'equivalente per i file JPEG è jpeginfo, nel suo pacchetto jpeginfo.

Il formato dell'output di pnginfo semplifica l'estrazione del valore di BitDepth (com'è su una riga separata) se viene utilizzato in uno script di shell.

Se il file non è in realtà un file PNG, ad esempio perché è un JPEG con nome errato, pnginfo segnalerà "Questo file non è un file PNG valido".

Come sempre lo strumento appropriato per il lavoro è determinato, tra le altre cose, dalla frequenza con cui lo userete e dal modo in cui desiderate elaborare l'output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.