[ 
https://issues.apache.org/jira/browse/IMAGING-319?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17490983#comment-17490983
 ] 

Gary Lucas commented on IMAGING-319:
------------------------------------

I haven't figured this out yet, but I've narrowed down the cause to 
TiffImageWriterLossless.  There is a method that attempts to update the file 
positions (offsets) of the various EXIF tags.   It's called 
updateOffsetsSteps().

The code is very confusing.  As far as I can tell, at some point some of the 
space in the output file is determined to be "unused" and updateOffsetSteps() 
attempts to reuse it by finding available space and setting the tag output 
position to the available space.  If you bypass this operation by adding a 
diagnostic call to  unusedElements.clear() right after the unusedElements list 
is established, everything works fine. 

The call stack is basically

ExifRewriter.updateExifMetadataLossles

ExifRewriter.writeExifSegment

TiffImageWriterLossless.write

TiffImageWriterLossless.updateOffsetsStep

 

 

 

> updateExifMetadataLossless lost the first character of a String
> ---------------------------------------------------------------
>
>                 Key: IMAGING-319
>                 URL: https://issues.apache.org/jira/browse/IMAGING-319
>             Project: Commons Imaging
>          Issue Type: Bug
>          Components: Format: JPEG
>    Affects Versions: 1.0-alpha2
>            Reporter: Sicheng Yang
>            Priority: Major
>         Attachments: Screen Shot 2021-11-26 at 4.01.06 PM-1.png, Screen Shot 
> 2021-11-26 at 4.01.21 PM-1.png, iPhone12-geotag.JPG
>
>
> I try to use TiffOutputSet to generate a new image. However, if a tag that 
> contains String, the program may miss the first character of the String.
>  
> import java.io.*;
> import org.apache.commons.imaging.ImageReadException;
> import org.apache.commons.imaging.ImageWriteException;
> import org.apache.commons.imaging.Imaging;
> import org.apache.commons.imaging.common.ImageMetadata;
> import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
> import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
> import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
> import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
> public class LibraryTest {
>     public static void main(String[] args) throws ImageReadException, 
> IOException, ImageWriteException {
>         File source = new File("./assets/iPhone12-geotag.JPG");
>         File result = new 
> File("./assets/results/editted-iPhone12-geotag.JPG");
>         final ImageMetadata metadata = Imaging.getMetadata(source);
>         final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
>         final TiffImageMetadata exif = jpegMetadata.getExif();
>         TiffOutputSet outputSet = exif.getOutputSet();
>         BufferedOutputStream bufferedOutputStream = new 
> BufferedOutputStream(new FileOutputStream(result));
>         new ExifRewriter().updateExifMetadataLossless(source, 
> bufferedOutputStream, outputSet);
>     }
> }
>  
> This is the sample code.
> Tag value in original image
> !image-2021-11-26-16-01-58-645.png!
> Tag value in output image
> !image-2021-11-26-16-04-12-185.png!



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to