coobird / thumbnailator

Thumbnailator - a thumbnail generation library for Java
MIT License
5.16k stars 786 forks source link

Incorrect cropping when specifying sourceRegion and an image that has exif orientation #207

Closed double0scotty closed 1 year ago

double0scotty commented 1 year ago

Expected behavior

Using a source region with an image that has exif orientation should effectively crop the region where specified after the orientation has been applied.

Actual behavior

The output image has the wrong area of the source image.

Steps to reproduce the behavior

Using a source image that has exif orientation (in this case it was top right orientated) use the following code to read the image from inputStream and write to outputStream:

Thumbnails
    .of(inputStream)    
    .useExifOrientation(true)                                   
    .size(256, 256)     
    .sourceRegion(cropX, cropY, cropWidth, cropHeight)          
    .outputFormat("JPEG")
    .outputQuality(1)
    .toOutputStream(outputStream);

This will produce an incorrect result.

Looking at the code during the readImage method of InputStreamImageSource it adds a filter to work with the orientation. However, it then calculates the source region a bit further down before any filters are run and is using the original width and height. I'm assuming this maybe why it doesn't correctly produce the cropped image.

Workaround

My current workaround for this is to first create a BufferedImage to correct the orientation, and then create the cropped version from this BufferedImage as follows:

BufferedImage img = Thumbnails
    .of(inputStream)    
    .scale(1)
    .useExifOrientation(true)
    .outputFormat("JPEG")
    .outputQuality(1)
    .asBufferedImage();

Thumbnails
    .of(img)                                        
    .size(256, 256)
    .sourceRegion(cropX, cropY, cropWidth, cropHeight)          
    .outputFormat("JPEG")
    .outputQuality(1)
    .toOutputStream(outputStream);

Environment

coobird commented 1 year ago

@double0scotty, thank you for filing this issue. This is a confirmed bug and should be fixed in the next version of Thumbnailator.

coobird commented 1 year ago

This bug has been fixed in the 0.4.20 release.