MacOS – Using ImageMagick’s identify to determine DPI of a document

image processingmacospdf

Ultimately, I'm trying to determine the size of an image in inches so I can be certain it lays out properly on the printer.

If I use the command identify document.pdf I get the following output:

document.pdf PDF 612x792 612x792+0+0 16-bit sRGB 29289B 0.000u 0:00.000

If I divide 612 and 792 each by 72 respectively, I get 8.5×11 which tells me the size. I know this is correct because I printed it. The problem is, it's not always going to be 8.5×11 nor will the DPI always be the same (and I won't be there to "know" how it was printed/saved).

From ImageMagic's page on using Identify they have a -verbose output flag and an example of "calculating an image size at 72 DPI" but they don't say how they got the DPI!

How can I programmatically determine the DPI of an image?

(Graphics are bit out of my wheelhouse and with the sheer volume of ImageMagick's options along with terms I'm not familiar with is a bit like drinking from the fire hose.)

Best Answer

(Thanks to Tetsujin for his helpful comments leading me to the answer)

ImageMagick can get a little confusing with their myriad of options when you're attempting to do something. There's a couple of ways that you can find out the DPI of an image. Both of them use the identify command.

For the examples below, I'm using a sample, royalty free photo of an Apple iMac saved natively as a JPG and exported as a PNG.

  • Manually calculating the size. To do this, we need two pieces of information, the resolution and the Units. In this case, we lucked out because the the units are in PPI (pixels per inch) so the resolution makes sense - it's 72 PPI or 72 DPI

    identify -verbose apple_photo.jpeg | grep -E -i "resolution|units"                         
    Resolution: 72x72
    Units: PixelsPerInch
    

    However, if the image file is a PNG, things are stored as PPCM or pixels per centimeter. Issuing the same command:

    % identify -verbose apple_photo.png | grep -E -i "resolution|units"
      Resolution: 28.34x28.34
      Units: PixelsPerCentimeter
    

    This tells us that it's 28.34 PPCM. To get DPI we have to do a little calculation. 1in = 2.54cm, so to get DPI we multiply that to the resolution as follows:

    2.54 * 28.34 = 71.9836 or 72DPI
    


  • Real-time Calculation. Again, using JPEG, we know that it's resolution is in DPI, so we just need to get the resolution value using the -format flag and the the percent (%) escape sequences:

    identify -format "%[fx:resolution.x]" apple_photo.jpeg
    

    Since PNG files are in PPCM, we can use the calculated FX expressions and the percent (%) escape sequences, to calculate this value. Here, we're getting the resolution value and multiplying it by 2.54 to get DPI.

    % identify -format "%[fx:resolution.x*2.54] DPI" apple_photo.png
    71.9836 DPI
    

    Note: You can get the units using the %[units] escape sequence here:

    % identify - identify -format `"%[units]"` apple_photo.jpeg
    

Calculate the size. We can now calculate the size (inches) of the image. Here, we use the %[w] escape sequence to get the width in DPI or PPCM

    % identify -format "%[fx:w]" apple_photo.jpeg
    3004

Divide by 72 to get inches

    % identify -format "%[fx:w/72] inches" apple_photo.jpeg
    41.7222 inches