[
https://issues.apache.org/jira/browse/SANSELAN-32?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13175886#comment-13175886
]
Damjan Jovanovic commented on SANSELAN-32:
------------------------------------------
Scratch the previous comment. updateExifMetadataLossless() tries to preserve
bytes in the TIFF file that don't belong to any parsed field. The problem here
is that the file uses a maker note which stores the values for its own fields
inside itself, but references these values using opaque TIFF-relative addresses
instead of maker note relative addresses. So even though the maker note is
parsed, when it's written into the new file it will be at a different address,
thus the values being referenced will change.
A simple workaround is to force treating the maker note as one of the byte
ranges not belonging to any parsed field, even though it is parsed. When it's
written into the new file, it will be duplicated, but the new copy will
reference values in the old copy. I've verified this works, patch is below.
However maker notes are large, and this causes a test to fail because the 64kB
APP1 size limit in JPEG is overrun by a file in Sanselan's test suite with a
28kB maker note. Maybe we shouldn't duplicate the maker note, but rather
reference the old value that's stored earlier in the file?
Index:
src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
===================================================================
---
src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
(revision 1221595)
+++
src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
(working copy)
@@ -142,6 +142,19 @@
for (int f = 0; f < fields.size(); f++)
{
TiffField field = fields.get(f);
+ if (field.tag == EXIF_TAG_MAKER_NOTE.tag) {
+ // Some maker notes reference values stored
+ // inside the maker note itself
+ // using addresses relative to the beginning
+ // of the TIFF file, making it impossible
+ // to move the note to a different location.
+ // To avoid corrupting these maker notes,
+ // pretend all maker notes are a gap in the file
+ // that must be preserved, so the copy that
+ // will be written later will reference
+ // the old copy's values. Happy days.
+ continue;
+ }
TiffElement oversizeValue =
field.getOversizeValueElement();
if (oversizeValue != null)
elements.add(oversizeValue);
> ExifRewriter.updateExifMetadataLossless corrupts maker notes
> ------------------------------------------------------------
>
> Key: SANSELAN-32
> URL: https://issues.apache.org/jira/browse/SANSELAN-32
> Project: Commons Sanselan
> Issue Type: Bug
> Environment: 0.97-incubator
> Reporter: Lulu winlumski
> Priority: Critical
> Attachments: SanselanExifWriter.java, modified.jpg, original.jpg
>
>
> rewriter.updateExifMetadataLossless(jpeg, os, outputSet);
> lead to loss of maker notes in the attached files.
> See attached files for details.
> $ exiftool -Makernotes:all original.jpg > original.txt
> $ exiftool -Makernotes:all modified.jpg > modified.txt
> $ diff -u original.txt modified.txt
> --- original.txt 2009-10-21 02:14:11.000000000 +0200
> +++ modified.txt 2009-10-21 02:14:15.000000000 +0200
> @@ -1,66 +1,8 @@
> -Focal Type : Zoom
> -Focal Plane X Size : 5.84 mm
> -Focal Plane Y Size : 4.39 mm
> -Canon Image Type : IMG:DIGITAL IXUS 60 JPEG
> -Canon Firmware Version : Firmware Version 1.00
> +Canon Image Type :
> +Canon Firmware Version :
> File Number : 100-0877
> Owner Name :
> Canon Model ID : PowerShot SD600 / Digital IXUS 60 / IXY
> Digital 70
> Thumbnail Image Valid Area : 0 0 0 0
> Date Stamp Mode : Off
> -My Color Mode : Off
> Firmware Revision : 1.00 rev 1.00
> -Macro Mode : Normal
> -Self Timer : Off
> -Quality : Superfine
> -Canon Flash Mode : Red-eye reduction (Auto)
> -Continuous Drive : Single
> -Focus Mode : Single
> -Record Mode : JPEG
> -Canon Image Size : Large
> -Easy Mode : Full auto
> -Digital Zoom : None
> -Contrast : Normal
> -Saturation : Normal
> -Sharpness : 0
> -Camera ISO : Auto
> -Metering Mode : Evaluative
> -Focus Range : Auto
> -AF Point : Auto AF point selection
> -Canon Exposure Mode : Easy
> -Lens Type : Unknown (-1)
> -Long Focal : 17.4 mm
> -Short Focal : 5.8 mm
> -Focal Units : 1000
> -Max Aperture : 2.8
> -Min Aperture : 5.6
> -Flash Bits : (none)
> -Focus Continuous : Single
> -AE Setting : Normal AE
> -Zoom Source Width : 2816
> -Zoom Target Width : 2816
> -Spot Metering Mode : Center
> -Manual Flash Output : n/a
> -Auto ISO : 148
> -Base ISO : 100
> -Measured EV : 4.19
> -Target Aperture : 2.8
> -Target Exposure Time : 1/60
> -Exposure Compensation : 0
> -White Balance : Auto
> -Slow Shutter : Off
> -Shot Number In Continuous Burst : 0
> -Optical Zoom Code : 0
> -Flash Guide Number : 0
> -Flash Exposure Compensation : 0
> -Auto Exposure Bracketing : Off
> -AEB Bracket Value : 0
> -Control Mode : Camera Local Control
> -Focus Distance Upper : 2.56
> -Focus Distance Lower : 0
> -Bulb Duration : 0
> -Camera Type : Compact
> -Auto Rotate : Rotate 90 CW
> -ND Filter : Off
> -Self Timer 2 : 0
> -Flash Output : 0
> This makes the library utterly useless for me. You can just as well use
> MediaUtil which has a smaller footprint and a (somewhat) cleaner API.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira