SHARE
TWEET

Parsing EXIF DPI

a guest Feb 18th, 2019 101 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. if (exif_id == ExifIdentifierCode)
  2.                     {
  3.                         // See EXIF specification: http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf
  4.  
  5.                         ubyte[] tiffFile = exifData.dup; // save exif chunk from "start of TIFF file"
  6.  
  7.                         ushort byteOrder = popBE!ushort(exifData);
  8.                         if (byteOrder != 0x4949 && byteOrder != 0x4D4D)
  9.                             stop_decoding(JPGD_DECODE_ERROR);
  10.                         bool littleEndian = (byteOrder == 0x4949);
  11.                         ushort version_ = littleEndian ? popLE!ushort(exifData) : popBE!ushort(exifData);
  12.                         if (version_ != 42)
  13.                             stop_decoding(JPGD_DECODE_ERROR);
  14.  
  15.                         uint offset = littleEndian ? popLE!uint(exifData) : popBE!uint(exifData);
  16.  
  17.                         double resolutionX = 72;
  18.                         double resolutionY = 72;
  19.                         int unit = 2;
  20.  
  21.                         // parse all IFDs
  22.                         while(offset != 0)
  23.                         {
  24.                             if (offset > exifData.length)
  25.                                 stop_decoding(JPGD_DECODE_ERROR);
  26.                             exifData = tiffFile[offset..$];
  27.                             ushort numEntries = littleEndian ? popLE!ushort(exifData) : popBE!ushort(exifData);
  28.  
  29.                             foreach(entry; 0..numEntries)
  30.                             {
  31.                                 ushort tag = littleEndian ? popLE!ushort(exifData) : popBE!ushort(exifData);
  32.                                 ushort type = littleEndian ? popLE!ushort(exifData) : popBE!ushort(exifData);
  33.                                 uint count = littleEndian ? popLE!uint(exifData) : popBE!uint(exifData);
  34.                                 uint valueOffset = littleEndian ? popLE!uint(exifData) : popBE!uint(exifData);
  35.  
  36.                                 if (tag == 282 || tag == 283) // XResolution  
  37.                                 {
  38.                                     ubyte[] tagData = tiffFile[valueOffset..$];
  39.                                     double num = littleEndian ? popLE!uint(tagData) : popBE!uint(tagData);
  40.                                     double denom = littleEndian ? popLE!uint(tagData) : popBE!uint(tagData);
  41.                                     double frac = num / denom;
  42.                                     if (tag == 282)
  43.                                         resolutionX = frac;
  44.                                     else
  45.                                         resolutionY = frac;
  46.                                 }
  47.  
  48.                                 if (tag == 296) // unit  
  49.                                     unit = valueOffset;
  50.                             }
  51.                             offset = littleEndian ? popLE!uint(exifData) : popBE!uint(exifData);
  52.                         }
  53.  
  54.                         if (unit == 2) // inches
  55.                         {
  56.                             m_pixelsPerMeterX = convertMetersToInches(resolutionX);
  57.                             m_pixelsPerMeterY = convertMetersToInches(resolutionY);
  58.                         }
  59.                         else if (unit == 3)
  60.                         {
  61.                             m_pixelsPerMeterX = resolutionX * 100;
  62.                             m_pixelsPerMeterY = resolutionY * 100;
  63.                         }
  64.                     }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top