Search code examples
python-imaging-libraryexifdpiexiftool

Where exactly is the DPI information of an image stored (other than Exif)?


We have been using a program called Onyx RIPCenter to manage poster printing for few years now. The images were generated using Photoshop and loaded onto the Onyx application on Windows.

Recently we dedcied to automate the workflow by eliminating Photoshop and automatically processing the images through a custom application built in python (using pillow python - https://pillow.readthedocs.io/en/latest/)

Now the problem I have is that when I open the images created through the custom application in RIPCenter, I get wrong sizes in millimetre.

The actual size of the image is, 924mm x 2108mm instead I get, 2309.99mm x 5269.79mm

The reason for this is the wrong DPI read by the application, instead of 180, it reads 72 (actual size in pixels - 6548 x 14938).

The custom application does set all relevant information to the Exif data including DPI. This can be verified by checking the property of the image file in Windows. But somehow when opening the image in RIPCenter, it shows the wrong DPI value.

Here is the code that saves the image.

def save_image(modified_image, image_file, source_image):
    """
    Store the processed image into a file
    :param modified_image: <Obj> modified image object
    :param image_file: <String> output filename
    :param source_image: <Obj> original image object
    :return: <Boolean> True if saved
    """

    # fix Onyx printer error
    # https://media.readthedocs.org/pdf/piexif/latest/piexif.pdf
    exif_dict = piexif.load(source_image.info["exif"])
    exif_dict["0th"][piexif.ImageIFD.XResolution] = (180.0, 1)
    exif_dict["0th"][piexif.ImageIFD.YResolution] = (180.0, 1)
    exif_bytes = piexif.dump(exif_dict)

    # if this is not set, then the save option will throw an error for setting subsampling='keep'
    modified_image.format = source_image.format

    try:
        modified_image.save(
            image_file,
            icc_profile=source_image.info.get('icc_profile'),
            dpi=source_image.info.get('dpi'),
            exif=exif_bytes,
            format=source_image.format,
            subsampling='keep',
            quality=95
        )

        del source_image
        del modified_image

        return True
    except IOError as e:
        print(e)

    return None

If the same image is opened and saved in Photoshop, then it shows the correct DPI. I have also tried Gimp and I get the same result. The image with the wrong DPI suddenly gets the right DPI when opened and saved in Gimp.

My understanding is that the pixels (height and width) and the DPI values read from the Exif data across different platforms and applications. But could it be possible that the Onyx RIPCenter application is looking for DPI in a different place?

Below is the exif data of the images.

Exif data of the image that's saved in Photoshop,

[ExifTool]      ExifTool Version Number         : 11.10
[System]        File Name                       : A3-VictoriaGlenManor-RH-Copper-92.4x210.8-R.jpg
[System]        Directory                       : /Users/vinodsudharshan/Downloads
[System]        File Size                       : 34 MB
[System]        File Modification Date/Time     : 2018:08:24 14:37:25+02:00
[System]        File Access Date/Time           : 2018:08:27 23:27:08+02:00
[System]        File Inode Change Date/Time     : 2018:08:27 22:56:37+02:00
[System]        File Permissions                : rw-r--r--
[File]          File Type                       : JPEG
[File]          File Type Extension             : jpg
[File]          MIME Type                       : image/jpeg
[File]          Exif Byte Order                 : Big-endian (Motorola, MM)
[File]          Current IPTC Digest             : cdcffa7da8c7be09057076aeaf05c34e
[File]          Image Width                     : 6550
[File]          Image Height                    : 14940
[File]          Encoding Process                : Baseline DCT, Huffman coding
[File]          Bits Per Sample                 : 8
[File]          Color Components                : 4
[IFD0]          Image Width                     : 6130
[IFD0]          Image Height                    : 8400
[IFD0]          Bits Per Sample                 : 8 8 8
[IFD0]          Photometric Interpretation      : RGB
[IFD0]          Orientation                     : Horizontal (normal)
[IFD0]          Samples Per Pixel               : 3
[IFD0]          X Resolution                    : 180
[IFD0]          Y Resolution                    : 180
[IFD0]          Resolution Unit                 : inches
[IFD0]          Software                        : Adobe Photoshop CS5.1 Macintosh
[IFD0]          Modify Date                     : 2018:08:23 17:32:21
[ExifIFD]       Exif Version                    : 0221
[ExifIFD]       Color Space                     : Uncalibrated
[ExifIFD]       Exif Image Width                : 6550
[ExifIFD]       Exif Image Height               : 14940
[IFD1]          Compression                     : JPEG (old-style)
[IFD1]          X Resolution                    : 72
[IFD1]          Y Resolution                    : 72
[IFD1]          Resolution Unit                 : inches
[IFD1]          Thumbnail Offset                : 394
[IFD1]          Thumbnail Length                : 2261
[IFD1]          Thumbnail Image                 : (Binary data 2261 bytes, use -b option to extract)
[IPTC]          Coded Character Set             : UTF8
[IPTC]          Application Record Version      : 0
[Photoshop]     IPTC Digest                     : cdcffa7da8c7be09057076aeaf05c34e
[Photoshop]     X Resolution                    : 180
[Photoshop]     Displayed Units X               : inches
[Photoshop]     Y Resolution                    : 180
[Photoshop]     Displayed Units Y               : inches
[Photoshop]     Print Style                     : Centered
[Photoshop]     Print Position                  : 0 0
[Photoshop]     Print Scale                     : 1
[Photoshop]     Global Angle                    : 30
[Photoshop]     Global Altitude                 : 30
[Photoshop]     URL List                        : 
[Photoshop]     Slices Group Name               : A3-VictoriaGlenManor-RH-Copper-92.4x210.8-R
[Photoshop]     Num Slices                      : 1
[Photoshop]     Pixel Aspect Ratio              : 1
[Photoshop]     Photoshop Thumbnail             : (Binary data 2261 bytes, use -b option to extract)
[Photoshop]     Has Real Merged Data            : Yes
[Photoshop]     Writer Name                     : Adobe Photoshop
[Photoshop]     Reader Name                     : Adobe Photoshop CS5.1
[Photoshop]     Photoshop Quality               : 12
[Photoshop]     Photoshop Format                : Standard
[Photoshop]     Progressive Scans               : 3 Scans
[XMP-x]         XMP Toolkit                     : Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01
[XMP-xmp]       Modify Date                     : 2018:08:23 17:32:21+02:00
[XMP-xmp]       Creator Tool                    : Adobe Photoshop CS5.1 Macintosh
[XMP-xmp]       Create Date                     : 2018:08:21 15:12:04+02:00
[XMP-xmp]       Metadata Date                   : 2018:08:23 17:32:21+02:00
[XMP-crs]       Already Applied                 : True
[XMP-photoshop] Color Mode                      : CMYK
[XMP-photoshop] ICC Profile Name                : U.S. Web Coated (SWOP) v2
[XMP-dc]        Format                          : image/jpeg
[XMP-xmpMM]     Instance ID                     : xmp.iid:9F9A62F1B5206811BF6AFA75AB99E0BD
[XMP-xmpMM]     Document ID                     : xmp.did:9E9A62F1B5206811BF6AFA75AB99E0BD
[XMP-xmpMM]     Original Document ID            : xmp.did:9E9A62F1B5206811BF6AFA75AB99E0BD
[XMP-xmpMM]     History Action                  : saved, saved
[XMP-xmpMM]     History Instance ID             : xmp.iid:9E9A62F1B5206811BF6AFA75AB99E0BD, xmp.iid:9F9A62F1B5206811BF6AFA75AB99E0BD
[XMP-xmpMM]     History When                    : 2018:08:23 17:32:21+02:00, 2018:08:23 17:32:21+02:00
[XMP-xmpMM]     History Software Agent          : Adobe Photoshop CS5.1 Macintosh, Adobe Photoshop CS5.1 Macintosh
[XMP-xmpMM]     History Changed                 : /, /
[ICC-header]    Profile CMM Type                : Adobe Systems Inc.
[ICC-header]    Profile Version                 : 2.1.0
[ICC-header]    Profile Class                   : Output Device Profile
[ICC-header]    Color Space Data                : CMYK
[ICC-header]    Profile Connection Space        : Lab
[ICC-header]    Profile Date Time               : 2000:07:26 05:41:53
[ICC-header]    Profile File Signature          : acsp
[ICC-header]    Primary Platform                : Apple Computer Inc.
[ICC-header]    CMM Flags                       : Not Embedded, Independent
[ICC-header]    Device Manufacturer             : Adobe Systems Inc.
[ICC-header]    Device Model                    : 
[ICC-header]    Device Attributes               : Reflective, Glossy, Positive, Color
[ICC-header]    Rendering Intent                : Media-Relative Colorimetric
[ICC-header]    Connection Space Illuminant     : 0.9642 1 0.82491
[ICC-header]    Profile Creator                 : Adobe Systems Inc.
[ICC-header]    Profile ID                      : 0
[ICC_Profile]   Profile Description             : U.S. Web Coated (SWOP) v2
[ICC_Profile]   Profile Copyright               : Copyright 2000 Adobe Systems, Inc.
[ICC_Profile]   Media White Point               : 0.7084 0.73595 0.57104
[ICC_Profile]   A To B0                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   A To B2                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   A To B1                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   B To A0                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   B To A1                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   B To A2                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   Gamut                           : (Binary data 37009 bytes, use -b option to extract)
[Adobe]         DCT Encode Version              : 100
[Adobe]         APP14 Flags 0                   : [14]
[Adobe]         APP14 Flags 1                   : (none)
[Adobe]         Color Transform                 : YCCK
[Composite]     Image Size                      : 6550x14940
[Composite]     Megapixels                      : 97.9

Exif data of the image that's saved in the Python Application,

[ExifTool]      ExifTool Version Number         : 11.10
[System]        File Name                       : A3-TEST_2_EXIF-RH-Copper-92.4x210.8-R.jpg
[System]        Directory                       : /Users/vinodsudharshan/Desktop
[System]        File Size                       : 36 MB
[System]        File Modification Date/Time     : 2018:08:27 21:55:25+02:00
[System]        File Access Date/Time           : 2018:08:31 16:59:05+02:00
[System]        File Inode Change Date/Time     : 2018:08:27 22:56:37+02:00
[System]        File Permissions                : rw-r--r--
[File]          File Type                       : JPEG
[File]          File Type Extension             : jpg
[File]          MIME Type                       : image/jpeg
[File]          Exif Byte Order                 : Big-endian (Motorola, MM)
[File]          Image Width                     : 6548
[File]          Image Height                    : 14938
[File]          Encoding Process                : Baseline DCT, Huffman coding
[File]          Bits Per Sample                 : 8
[File]          Color Components                : 4
[Adobe]         DCT Encode Version              : 100
[Adobe]         APP14 Flags 0                   : (none)
[Adobe]         APP14 Flags 1                   : (none)
[Adobe]         Color Transform                 : Unknown (RGB or CMYK)
[IFD0]          Image Width                     : 6130
[IFD0]          Image Height                    : 8400
[IFD0]          Bits Per Sample                 : 8 8 8
[IFD0]          Photometric Interpretation      : RGB
[IFD0]          Orientation                     : Horizontal (normal)
[IFD0]          Samples Per Pixel               : 3
[IFD0]          X Resolution                    : 180
[IFD0]          Y Resolution                    : 180
[IFD0]          Resolution Unit                 : inches
[IFD0]          Software                        : Adobe Photoshop CS5.1 Macintosh
[IFD0]          Modify Date                     : 2018:07:11 17:42:24
[ExifIFD]       Exif Version                    : 0221
[ExifIFD]       Color Space                     : Uncalibrated
[ExifIFD]       Exif Image Width                : 5669
[ExifIFD]       Exif Image Height               : 14173
[IFD1]          Compression                     : JPEG (old-style)
[IFD1]          X Resolution                    : 180
[IFD1]          Y Resolution                    : 180
[IFD1]          Resolution Unit                 : inches
[IFD1]          Thumbnail Offset                : 404
[IFD1]          Thumbnail Length                : 2076
[IFD1]          Thumbnail Image                 : (Binary data 2076 bytes, use -b option to extract)
[ICC-header]    Profile CMM Type                : Adobe Systems Inc.
[ICC-header]    Profile Version                 : 2.1.0
[ICC-header]    Profile Class                   : Output Device Profile
[ICC-header]    Color Space Data                : CMYK
[ICC-header]    Profile Connection Space        : Lab
[ICC-header]    Profile Date Time               : 2000:07:26 05:41:53
[ICC-header]    Profile File Signature          : acsp
[ICC-header]    Primary Platform                : Apple Computer Inc.
[ICC-header]    CMM Flags                       : Not Embedded, Independent
[ICC-header]    Device Manufacturer             : Adobe Systems Inc.
[ICC-header]    Device Model                    : 
[ICC-header]    Device Attributes               : Reflective, Glossy, Positive, Color
[ICC-header]    Rendering Intent                : Media-Relative Colorimetric
[ICC-header]    Connection Space Illuminant     : 0.9642 1 0.82491
[ICC-header]    Profile Creator                 : Adobe Systems Inc.
[ICC-header]    Profile ID                      : 0
[ICC_Profile]   Profile Description             : U.S. Web Coated (SWOP) v2
[ICC_Profile]   Profile Copyright               : Copyright 2000 Adobe Systems, Inc.
[ICC_Profile]   Media White Point               : 0.7084 0.73595 0.57104
[ICC_Profile]   A To B0                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   A To B2                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   A To B1                         : (Binary data 41478 bytes, use -b option to extract)
[ICC_Profile]   B To A0                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   B To A1                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   B To A2                         : (Binary data 145588 bytes, use -b option to extract)
[ICC_Profile]   Gamut                           : (Binary data 37009 bytes, use -b option to extract)
[Composite]     Image Size                      : 6548x14938
[Composite]     Megapixels                      : 97.8

Solution

  • I would suspect that Onyx RIPCenter is using 72 as a default (which is a common default) and that it normally reads Photoshop:X/YResolution to get the DPI. Try copying the IFD0:X/YResolution to Photoshop:X/YResolution or simply setting the Photoshop:X/YResolution to 180.

    In exiftool, you could use
    exiftool -Photoshop:*Resolution=180 FILEorDIR

    The asterisk is a wildcard which will allow both XResolution and YResolution to be set at the same time. Replace FILEorDIR with the files/directories to be processed. This command creates backup files. Add -overwrite_original to suppress the creation of backup files. Add -r to recurse into subdirectories.