Project

General

Profile

ExifParser::encode(..) generates invalid Exif when used with Magick++

Added by Ray NA over 10 years ago

Hi,

I am manipulating ImageMagick Magick++ (mostly jpg) objects and I needed to update some of the Exif fields, which IM doesn't support so I am using exiv2 and then re-attaching the new exif data back into the IM object.

However, when I attach the encoded Exiv2::ExifData, I find that it is reported to be invalid/corrupt (verifiable via exiftool -v4). I came across [[http://dev.exiv2.org/boards/3/topics/250#message-251]] thread in the archives but no luck.

The fix I had to implement was to explicitly add the 'Exif\0\0' sequence to the Exiv2::Blob following the ExifParser::encode(). Can you tell me if this is expected behaviour or I am using the interface incorrectly?

I would have expected that the ExifParser::encode() method to create a buffer containing a valid Exif byte sequence. The following generates an updated exif as expected.

        Magick::Image  img("/tmp/foo.jpg");

        Exiv2::Blob      evraw;
        Exiv2::ExifData  evexif;
        evexif["Exif.Image.Make"]     = "my camera";
        evexif["Exif.Image.Model"]    = "model version";
        Exiv2::ExifParser::encode(evraw, Exiv2::littleEndian, evexif);

        uchar_t*  ebuf = new uchar_t[6+evraw.size()];
        ebuf[0] = 'E';
        ebuf[1] = 'x';
        ebuf[2] = 'i';
        ebuf[3] = 'f';
        ebuf[4] = 0;
        ebuf[5] = 0;
        memcpy(ebuf+6, &evraw[0], evraw.size());

        img.exifProfile(Magick::Blob(ebuf, 6+evraw.size()));
        delete [] ebuf;

        img.write("/tmp/bar.jpg");

Replies (1)

RE: ExifParser::encode(..) generates invalid Exif when used with Magick++ - Added by Andreas Huggel over 10 years ago

The fix I had to implement was to explicitly add the 'Exif\0\0' sequence to the Exiv2::Blob following the ExifParser::encode(). Can you tell me if this is expected behaviour or I am using the interface incorrectly?

Yes, this is expected behaviour.

I would have expected that the ExifParser::encode() method to create a buffer containing a valid Exif byte sequence.

It does. The 'Exif\0\0' signature is a JPEG thing, it is used to identify the APP1 segment within a JPEG image which contains the Exif data. The result of ExifParser::encode() is also used for other image formats which do not all need the leading 'Exif\0\0'.

Andreas

    (1-1/1)