Les avis sur le DNG foisonnent, en bien comme en mal. Voici ma première question : perd-on des informations quand on convertit un RAW en DNG ?

Cet article fait partie d’une série consacrée au format DNG, introduite par la question : Le DNG, pour ou contre ?

Le DNG propose des avantages très intéressants mais comment être sûr de ne pas regretter un basculement intégral ? Au vu des innombrables discussions sur le net, je ne suis pas le seul à me cette poser. Toujours vagues et sans apporter de preuve ou une quelconque comparaison sur des bases concrètes, les réponses apportées par ces discussions ne me satisfont pas. Je couche donc sur ce papier virtuel le résultat de mes modestes recherches !

La question qui reste ouverte : les métadonnées

Les métadonnées, ces données qui permettent une foule d’automatisations et d’assistants qui nous (me) sont chers quand on traite des photos par milliers. Je n’insisterai jamais assez sur l’importance et l’avantage de métadonnées les plus complètes possible.

On sait donc qu’il y a une différence dans les métadonnées d’un RAW propriétaire tel qu’un ORF, CR2, ou un NEF, et de sa version DNG. Mais quelles sont ces différences et sont-elles assez importantes pour ne pas sauter le pas ?

Pour le savoir, j’ai réalisé une petite expérience. J’ai pris une de mes photos au hasard et je l’ai convertie en DNG, et ensuite j’ai collecté leurs métadonnées via ExifTool (si vous ne connaissez pas encore ExifTool et que les métadonnées sont l’une de vos préoccupations, je vous conseille d’y jeter un œil. Vraiment. Allez-y !).

À ce moment précis, vous avez le choix :

Le test

Si vous voulez essayer chez vous, dans le terminal (je suis sur OSX, si vous êtes sur Windows, lisez la doc :D) tapez la ligne de commande suivante :

exiftool -a -u -sort chemin/vers/mon/fichier

L’option -a signifie « on prend aussi les données dupliquées », -u, quant à elle, signifie « on prend aussi les données inconnues », bref on prend tout.

Ok, donc on a une vue sur les métadonnées mais il y en a des centaines. Pour les comparer, j’ai préféré écrire un script et j’ai utilisé une des options d’Exiftool : -json qui exporte les métadonnées au format JSON (très utile pour comparer après).

exiftool -a -u -json -sort chemin/vers/mon/fichier.CR2 > cr2.json
exiftool -a -u -json -sort chemin/vers/mon/fichier.DNG > dng.json

J’ajoute aussi l’option -sort pour trier les métadonnées par ordre alphabétique, et l’instruction pour mettre le contenu généré dans un fichier (> … à la fin de la ligne).

Nous avons nos données dans des fichiers, prêtes à être analysées. J’utilise alors Javascript, parce qu’avec des librairies comme Underscore.JS, la comparaison de collections de données est juste trop facile. Mais vous le faites avec ce que vous voulez après tout :).

Ce qui nous intéresse, ce n’est pas ce qui est identique mais bien ce qui diffère. Je récupère donc l’intersection entre les deux collections de données, et la soustrait à chacune des collections.

var cr2Keys = _.keys(cr2);
var dngKeys = _.keys(dng);
var commonKeys = _.intersection(cr2Keys, dngKeys);
var cr2OnlyKeys = _.difference(cr2Keys, commonKeys);
var dngOnlyKeys = _.difference(dngKeys, commonKeys);

Je dispose donc de trois choses :

  1. La liste des données communes (386 au total) ;
  2. La liste des données spécifiques à mon CR2 (24) ;
  3. La liste des données spécifiques à mon DNG (88).

Il me faut une quatrième chose : séparer les données communes qui ont des valeurs identiques dans les deux collections de celles dont les valeurs diffèrent. Au préalable, je retire quelques données : SourceFile, Directory, FileAccessDate, FileInodeChangeDate, FileModifyDate, FileName, FilePermissions, ModifyDate. Pourquoi ? Parce que leurs différences tiennent soit de l’emplacement sur mon disque dur, soit du moment où j’ai converti le CR2 en DNG.

_.each(commonKeysWeCare, function(value) {
    if (cr2[value] === dng[value]) { … }
    else { … }
}

J’obtiens donc :

  1. La liste des données communes dont les valeurs sont identiques de parts et d’autres, et donc on s’en fout (353) ;
  2. La liste des données communes dont les valeurs diffèrent (33).

L’analyse

Les 33 données communes dont les valeurs diffèrent

 CR2DNG
BitsPerSample8 8 816
CompressionJPEG (old-style)JPEG
FOV55.0 deg54.4 deg
FileSize20 MB16 MB
FileTypeCR2DNG
FocalLength35efl35.0 mm (35 mm equivalent: 34.6 mm)35.0 mm (35 mm equivalent: 35.0 mm)
FocalPlaneResolutionUnitinchescm
FocalPlaneXResolution3810.5849581520
FocalPlaneYResolution3815.8995821520
HyperfocalDistance14.38 m14.56 m
ImageHeight36483708
ImageSize5472×36485568×3708
ImageWidth54725568
Lens35efl16.0 – 35.0 mm (35 mm equivalent: 15.8 – 34.6 mm)16.0 – 35.0 mm (35 mm equivalent: 16.0 – 35.0 mm)
LensInfo16-35mm f/016-35mm f/?
MIMETypeimage/x-canon-cr2image/x-adobe-dng
PhotometricInterpretationRGBColor Filter Array
PreviewImage(Binary data 1162203 bytes, use -b option to extract)(Binary data 25412 bytes, use -b option to extract)
PreviewImageLength116220325412
PreviewImageStart87156332826
RowsPerStrip309171
SamplesPerPixel31
ShutterSpeedValue1/491/50
StripByteCounts18701091131328
StripOffsets2109616201498

Dans ces 33 données, il faut faire la part des choses entre ce qui est important et ce qui ne l’est pas.

  1. FileType, FileSize et MIMEType sont différents… sans blague ?
  2. PreviewImage, PreviewImageLength et PreviewImageStart, c’est juste le thumbnail qui est plus petit d’un côté que de l’autre.
  3. FOV, FocalLength35efl, Lens35efl, ShutterSpeedValue sont arrondis, et LensInfo a une différence minime.
  4. La Compression, JPEG Lossless, rien de neuf là dessus.

Par contre, ces points sont intéressants et mériteraient d’être éclaircis.

  1. En quoi la différence de BitsPerSample importe-t-elle ?
  2. À unités égales (FocalPlaneResolutionUnit), FocalPlaneXResolution et FocalPlaneYResolution sont-ils différents ?
  3. HyperfocalDistance, pourquoi est-ce différent d’un côté et de l’autre ? Est-ce dû à l’arrondi ?
  4. ImageSize (et par conséquent ImageHeight et ImageWidth) est plus grand dans le DNG, pourquoi ? Est-ce lié au fait que le 6D a un taux de couverture de ±97% du viewfinder ? Les dimensions du CR2 sont de ±98% de celles du DNG, donc sauf coïncidence, j’ai ma réponse.
  5. PhotometricInterpretation : quelles sont les différences entre RGB et Color Filter Array (CFA) et leur impact sur l’image ?
  6. À quoi correspondent RowsPerStrip, SamplesPerPixel, StripByteCounts et StripOffsets ?

Les 24 données spécifiques au CR2 source

KeyValue
ComponentsConfigurationY, Cb, Cr, –
Copyright 
ExifImageHeight3648
ExifImageWidth5472
Exif_0xc5d81
Exif_0xc5d92
Exif_0xc5e01
Exif_0xc6c51
Exif_0xc6dc450 301 7 4
FlashpixVersion0100
GPSVersionID2.3.0.0
InteropIndexR98 – DCF basic file (sRGB)
InteropVersion0100
Rating0
RawImageSegmentation1 2784 2784
ResolutionUnitinches
SubSecModifyDate2014:07:30 15:11:46.96
SubSecTime96
ThumbnailImage(Binary data 7110 bytes, use -b option to extract)
ThumbnailLength7110
ThumbnailOffset80044
UserComment 
XResolution72
YResolution72

Même chose, on peut y voir des choses peu importantes.

  1. ComponentsConfiguration est présent dans les métadonnées du DNG sous YCbCrSubSampling.
  2. Copyright et UserComment sont des champs qui ne sont pas remplis par mon boitier et ne sont donc pas importants pour moi.
  3. ExifImageHeight, ExifImageWidth, ResolutionUnit, et SubSecModifyDate sont des données redondantes avec ImageHeight, ImageWidth, FocalPlaneResolutionUnit et ModifyDate. SubSecTime ne m’intéresse pas.
  4. ThumbnailImage, ThumbnailLength et ThumbnailOffset sont redondants avec PreviewImage, PreviewImageLength et PreviewImageStart.

Et de nouvelles questions à creuser.

  1. À quoi correspondent les données Exif_0xc…, RawImageSegmentation, XResolution et YResolution ?
  2. FlashpixVersion, GPSVersionID, InteropIndex et InteropVersion sont-ils utilisés et si oui dans quels cas ?
  3. Rating peut être pratique quand on s’ennuie sur la route et que l’on mettre ce temps à profit, est-ce sauvé dans le DNG sous un autre label ?

Les 88 données spécifiques au DNG

KeyValue
ActiveArea38 72 3708 5568
AnalogBalance1 1 1
AntiAliasStrength1
ApproximateFocusDistance0.38
AsShotNeutral0.497087 1 0.627067
BaselineExposure0.25
BaselineNoise0.8
BaselineSharpness1.25
BayerGreenSplit250
BestQualityScale1
BlackLevelRepeatDim2 2
CFALayoutRectangular
CFAPattern[Red,Green][Green,Blue]
CFAPattern20 1 1 2
CFAPlaneColorRed,Green,Blue
CFARepeatPatternDim2 2
CalibrationIlluminant1Standard Light A
CalibrationIlluminant2D65
CameraCalibration11.0135 0 0 0 1 0 0 0 0.9852
CameraCalibration21.0135 0 0 0 1 0 0 0 0.9852
CameraCalibrationSigcom.adobe
CameraSerialNumber033024004860
ColorMatrix10.7546 -0.1435 -0.0929 -0.3846 1.1488 0.2692 -0.0332 0.1209 0.637
ColorMatrix20.7034 -0.0804 -0.1014 -0.442 1.2564 0.2058 -0.0851 0.1994 0.5758
CreatorKarl Delandsheere
CreatorToolAdobe Photoshop Lightroom 5.5 (Macintosh)
DNGBackwardVersion1.1.0.0
DNGLensInfo16-35mm f/?
DNGVersion1.4.0.0
DateCreated2014:07:30 15:11:46.96
DefaultCropOrigin12 12
DefaultCropSize5472 3648
DefaultScale1 1
DerivedFromDocumentID27FBD1260B668C8AF1ACE4671A2BC5C2
DerivedFromOriginalDocumentID27FBD1260B668C8AF1ACE4671A2BC5C2
DocumentIDxmp.did:7c782ee2-d157-48ea-8aae-d828929eebfa
Exif_0xc7aa256
Firmware1.1.3
FlashCompensation0
Formatimage/dng
ForwardMatrix10.7763 0.0065 0.1815 0.2364 0.8351 -0.0715 -0.0059 -0.4228 1.2538
ForwardMatrix20.7464 0.1044 0.1135 0.2648 0.9173 -0.182 0.0113 -0.2154 1.0292
HasCropfalse
HistoryActionderived,saved
HistoryChanged/
HistoryInstanceIDxmp.iid:7c782ee2-d157-48ea-8aae-d828929eebfa
HistoryParametersconverted from image/x-canon-cr2 to image/dng, saved to new location
HistorySoftwareAgentAdobe Photoshop Lightroom 5.5 (Macintosh)
HistoryWhen2014:07:30 15:22:44+02:00
ImageNumber0
InstanceIDxmp.iid:7c782ee2-d157-48ea-8aae-d828929eebfa
LinearResponseLimit1
MaxApertureValue2.8
MetadataDate2014:07:30 15:22:44+02:00
NewRawImageDigest4420f120b653471fd4cdc3e3868804ca
NoiseProfile1.38033112077516e-05 1.41414007003259e-07 1.40749217975128e-05 1.421404607809e-07 1.4036774242771e-05 1.45716848609285e-07
OpcodeList2(Binary data 256 bytes, use -b option to extract)
OriginalDocumentID27FBD1260B668C8AF1ACE4671A2BC5C2
OriginalRawFileNameIMG_7692.CR2
PreviewApplicationNameAdobe Photoshop Lightroom
PreviewApplicationVersion5.5
PreviewColorSpace2
PreviewDateTime2014:07:30 15:22:44+02:00
PreviewSettingsDigestcbaeb0aaf10e0f5ea515a7000c72e0a1
ProfileCalibrationSigcom.adobe
ProfileCopyrightCopyright 2012 Adobe Systems, Inc.
ProfileEmbedPolicyAllow Copying
ProfileHueSatMapData1(Binary data 137566 bytes, use -b option to extract)
ProfileHueSatMapData2(Binary data 138373 bytes, use -b option to extract)
ProfileHueSatMapDims90 30 1
ProfileLookTableData(Binary data 89143 bytes, use -b option to extract)
ProfileLookTableDims36 8 16
ProfileNameAdobe Standard
RawDataUniqueID10383B18B0CFFFA3314789C216101FE7
ReferenceBlackWhite0 255 128 255 128 255
ShadowScale1
SoftwareAdobe Photoshop Lightroom 5.5 (Macintosh)
SubfileTypeReduced-resolution image
TileByteCounts7513
TileLength176
TileOffsets665020
TileWidth256
UniqueCameraModelCanon EOS 6D
WhiteLevel15000
XMPToolkitAdobe XMP Core 5.5-c002 1.148022, 2012/07/15-18:06:45
YCbCrCoefficients0.299 0.587 0.114
YCbCrPositioningCo-sited
YCbCrSubSamplingYCbCr4:2:0 (2 2)

La première chose à noter dans ce tableau, ce sont les données spécifiques au DNG qui sont soit des duplications (UniqueCameraModel, MaxApertureValue, …), soit des données d’historique ou sur le logiciel qui a généré le DNG. À noter que le DNG conserve les dimensions originales du CR2 dans les données DefaultCropOrigin et DefaultCropSize.

Mon inquiétude à l’origine de cette expérience était la perte d’information, pas le fait d’en avoir encore plus.

Bien qu’intéressantes, les données spécifiques au DNG ne pèsent pas pour moi dans la balance. Je ne vais donc pas passer en détail tout ce dernier tableau mais si vous avez des infos, elles sont les bienvenues :).

Conclusion

Sur les 410 données que mon CR2 embarquait, seulement 26 posent question avec divers niveaux d’importance. Et aucune d’entre elles ne représente une perte de donnée utile. L’expérience mérite bien sûr d’être reportée sur d’autres photos et d’autres formats RAW et je devrais peut-être développer ma façon de tester pour prendre plus de paramètres en compte. Mais le but était de voir si je perdrais des informations et la réponse est : oui et non.

La réponse est oui

Je perds apparemment certaines informations, le Rating n’est pas reporté dans le DNG. Mais est-ce parce qu’il n’était pas défini ? Si il l’était, serait-il présent dans les métadonnées du DNG ? Le UserComment est aussi manquant par exemple.

La réponse est non

Les données qui ne figurent pas dans le DNG ne me sont d’aucune importance (et encore, je n’ai pas approfondi la comparaison et les éventuelles traductions de valeurs). Je ne perds donc rien d’utile.

Quand j’analyse un DNG généré à partir d’un ORF (RAW de chez Olympus), je retrouve même des données telles que la focale utilisée pour la stabilisation d’image, cachées dans une foule d’autre données préfixées Olympus_ImageProcessing_ ! On peut donc dire que le passage d’information est assez complet.

Complément d’analyse

Pour les personnes utilisant des firmwares alternatifs (comme Magic Lantern sur Canon par exemple), ou des systèmes ajoutant des informations (gestion de timelapse, de pano, etc), il serait intéressant de faire des tests supplémentaires. Je n’ai pas de cas pratique à tester actuellement donc s’il y a des volontaires ;).

Et vous ?

Où en êtes-vous par rapport au DNG ? Votre avis m’intéresse !