Comment savoir si un PNG est PNG-8 ou PNG-24?

Réponses:

25

L' fileutilisation de la commande dans d'autres réponses est parfois incohérente. Par exemple:

───────────────────────────────────────────────────────────────────────────────
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 première instance est probablement une photo de l'appareil photo et la deuxième que j'ai prise à l'aide d'une capture d'écran.

La identifycommande, sur laquelle ma réponse est basée, semble fonctionner correctement dans tous les cas. Par exemple, tester sur la première instance ci-dessus:

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

J'ai installé ImageMagick qui me permet d'utiliser:

$ 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

Pour un rapport de synthèse, omettez tous les paramètres:

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

Remplacez-le vnStat.pngpar votre propre .pngnom de fichier et faites- le précéder du chemin si nécessaire.


Pour comprendre PNG-24 vs PNG-32, cette réponse de SuperUser la résume:

Si votre image est en 24 bits, vous verrez:

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

Si votre image PNG est de 32 bits, vous verrez:

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

Cependant, cette réponse n'est pas complète car la couleur 8 bits affiche également 8 bits pour le rouge, le vert et le bleu, seule une palette de couleurs est utilisée pour limiter le nombre de sélections (comme dans le bon vieux Windows 2.0).


Examinez ces trois images de l'article de profondeur de Wikipedia :

8_bit.png

Nom de fichier: 8_bit.png

En utilisant:

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

On voit qu'il y a 249 couleurs utilisées. Le maximum possible avec 8 bits est de 256 couleurs.


4 bits

Nom de fichier: 4_bit.png

En utilisant:

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

Nous voyons qu'il y a 16 couleurs utilisées, ce qui correspond au maximum de combinaisons de couleurs possibles avec 4 bits.


2_bit.png

Nom de fichier: 2_bit.png

En utilisant:

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

Nous voyons qu'il y a 4 couleurs utilisées, ce qui correspond au maximum de combinaisons de couleurs possibles avec 2 bits.

WinEunuuchs2Unix
la source
2
Pour un format plus convivial pour les scripts, vous pouvez également le faire identify -format %z- voir les options de formatage d'ImageMagick pour plus.
duveteux
29

PNG 32 bits (8 bits par canal - avec alpha, également appelé «PNG 24 bits avec 8 bits d'alpha» ou «PNG24 avec alpha»):

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

PNG 24 bits (8 bits par canal - pas de canal alpha)

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

PNG 8 bits (256 couleurs):

$ file 8bit.png
PNG image data, 1060 x 821, 8-bit colormap, non-interlaced
Rinzwind
la source
Et le badge est à moi :-)
Rinzwind
1
Les PNG de palette ont toujours 8 bits par composant RGBA, ils sont juste limités à 256 entrées de palette. (Chaque pixel est un index de 8 bits ou plus petit dans la palette, plutôt que de stocker des données de pixel littéralement). Ce n'est pas totalement clair de quoi il s'agit. PNG24 est également 8 bits par composant (et non 24 bits par composant). Ce serait donc une meilleure réponse si vous montriez la sortie des deux types de PNG.
Peter Cordes
J'ai mal compris ce que vous vouliez dire par "badge" il y a 8 heures mais maintenant je fais parce que je me suis réveillé avec une médaille de bronze et d'argent :)
WinEunuuchs2Unix
Le badge du 1er au 10 est toujours le vainqueur seulement contre le 1er au 100 ;-)
Rinzwind
1
@evilSnobu> fileest mon principal outil d'identification de fichier et je suis toujours étonné de voir à quel point il peut en dire même sur les formats de fichiers exotiques. Certes, sa mise en œuvre a un peu augmenté depuis les années 80 :)
spectras
8

Si exiftool est installé, vous pouvez faire:

bash-4.3 # exiftool continents_blank_l.png 
Numéro de version ExifTool: 10.20
Nom du fichier: continents_blank_l.png
Annuaire:.
Taille du fichier: 170 kB
Date / heure de modification du fichier: 2016: 07: 05 07: 59: 28 + 05: 30
Date / heure d'accès au fichier: 2017: 08: 07 00: 35: 15 + 05: 30
Date / heure de modification de l'inode de fichier: 2016: 07: 05 07: 59: 28 + 05: 30
Autorisations de fichier: rw-r - r--
Type de fichier: PNG
Extension de type de fichier: png
Type MIME: image / png
Largeur de l'image: 1100
Hauteur de l'image: 850
Profondeur de bits: 8
Type de couleur: RVB avec Alpha
Compression: dégonfler / gonfler
Filtre: adaptatif
Entrelacé: non entrelacé
Couleur d'arrière-plan: 255 255 255
Pixels par unité X: 3937
Pixels par unité Y: 3937
Unités de pixels: mètres
Date de modification: 2016: 07: 05 02:29:28
Taille de l'image: 1100x850
Mégapixels: 0,935
Seigneur du feu
la source
5

À la manière du pirate: jetez un œil aux vrais octets à l'intérieur du morceau PNG IHDR .

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

Le premier chiffre vous indique la profondeur de bit. Le second, le type de couleur (2 est pour les images RVB, c'est-à-dire les images avec trois canaux ou trois valeurs d'échantillonnage par pixel).

Par conséquent, dans ce cas, nous avons un PNG RGB8 (24 bits par pixel).

leonbloy
la source
N'est-ce pas PNG24 (8 bits par canal)? PNG8 est une palette de couleurs 8 bits = 256 couleurs.
evilSnobu
1
Oui, RGB8 correspond à PNG24.
leonbloy
Droite. Ma faute. Je l'ai lu comme PNG8 et non RGB8. Votre réponse est tout à fait correcte.
evilSnobu
3

Comme alternative à l'utilisation ci-dessus de "fichier" qui repose sur la magie des fichiers dans l'en-tête du fichier PNG, si vous travaillez avec des fichiers PNG, il est utile d'avoir le package " pngtools " installé.

pnginfo peut ensuite être utilisé pour donner tous les détails sur les propriétés du fichier PNG, y compris BitDepth (Bits / Sample) (qui ne doit pas être confondu avec une autre propriété, 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'équivalent pour les fichiers JPEG est jpeginfo, dans son propre package jpeginfo.

Le format de la sortie de pnginfo facilite l'extraction de la valeur de BitDepth (car il se trouve sur une ligne distincte) s'il est utilisé dans un script shell.

Si le fichier n'est pas réellement un fichier PNG, parce que par exemple c'est un JPEG mal nommé, alors pnginfo rapportera "Ce fichier n'est pas un fichier PNG valide".

Comme toujours, l'outil approprié pour le travail est déterminé, entre autres, par la fréquence à laquelle vous allez utiliser l'outil et la façon dont vous souhaitez traiter la sortie.

JG Miller
la source