Changeset 17872 in josm for trunk


Ignore:
Timestamp:
2021-05-06T21:47:02+02:00 (3 years ago)
Author:
simon04
Message:

see #20813 - Apply EXIF rotation in ImageEntry.load

Location:
trunk/src/org/openstreetmap/josm/gui/layer/geoimage
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java

    r17871 r17872  
    1818import java.awt.event.MouseWheelEvent;
    1919import java.awt.event.MouseWheelListener;
    20 import java.awt.geom.AffineTransform;
    2120import java.awt.geom.Rectangle2D;
    2221import java.awt.image.BufferedImage;
     
    3736import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
    3837import org.openstreetmap.josm.tools.Destroyable;
    39 import org.openstreetmap.josm.tools.ExifReader;
    4038import org.openstreetmap.josm.tools.ImageProcessor;
    4139import org.openstreetmap.josm.tools.Logging;
     
    251249                    }
    252250
    253                     boolean switchedDim = false;
    254                     if (ExifReader.orientationNeedsCorrection(entry.getExifOrientation())) {
    255                         if (ExifReader.orientationSwitchesDimensions(entry.getExifOrientation())) {
    256                             width = img.getHeight(null);
    257                             height = img.getWidth(null);
    258                             switchedDim = true;
    259                         }
    260                         final BufferedImage rot = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    261                         final AffineTransform xform = ExifReader.getRestoreOrientationTransform(
    262                                 entry.getExifOrientation(),
    263                                 img.getWidth(null),
    264                                 img.getHeight(null));
    265                         final Graphics2D g = rot.createGraphics();
    266                         g.drawImage(img, xform, null);
    267                         g.dispose();
    268                         img = rot;
    269                     }
    270 
    271251                    ImageDisplay.this.image = img;
    272252                    updateProcessedImage();
     
    274254                    ImageDisplay.this.oldEntry = ImageDisplay.this.entry;
    275255                    visibleRect = new VisRect(0, 0, width, height);
    276 
    277                     Logging.debug("Loaded {0} with dimensions {1}x{2} memoryTaken={3}m exifOrientationSwitchedDimension={4}",
    278                             entry.getFile().getPath(), width, height, width * height * 4 / 1024 / 1024, switchedDim);
    279256
    280257                    selectedRect = null;
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java

    r17871 r17872  
    33
    44import java.awt.Dimension;
     5import java.awt.Graphics2D;
    56import java.awt.Image;
     7import java.awt.geom.AffineTransform;
    68import java.awt.image.BufferedImage;
    79import java.io.File;
     
    1315import org.openstreetmap.josm.data.ImageData;
    1416import org.openstreetmap.josm.data.gpx.GpxImageEntry;
     17import org.openstreetmap.josm.tools.ExifReader;
    1518import org.openstreetmap.josm.tools.ImageProvider;
    1619import org.openstreetmap.josm.tools.Logging;
     
    139142    public BufferedImage read(Dimension target) throws IOException {
    140143        Logging.info(tr("Loading {0}", getFile().getPath()));
    141         return ImageProvider.read(getFile(), false, false,
     144        BufferedImage image = ImageProvider.read(getFile(), false, false,
    142145                r -> target == null ? r.getDefaultReadParam() : withSubsampling(r, target));
     146        Logging.debug("Loaded {0} with dimensions {1}x{2} memoryTaken={3}m exifOrientationSwitchedDimension={4}",
     147                getFile().getPath(), image.getWidth(), image.getHeight(), image.getWidth() * image.getHeight() * 4 / 1024 / 1024,
     148                ExifReader.orientationSwitchesDimensions(getExifOrientation()));
     149        return applyExifRotation(image);
    143150    }
    144151
     
    158165        }
    159166    }
     167
     168    private BufferedImage applyExifRotation(BufferedImage img) {
     169        Integer exifOrientation = getExifOrientation();
     170        if (!ExifReader.orientationNeedsCorrection(exifOrientation)) {
     171            return img;
     172        }
     173        boolean switchesDimensions = ExifReader.orientationSwitchesDimensions(exifOrientation);
     174        int width = switchesDimensions ? img.getHeight() : img.getWidth();
     175        int height = switchesDimensions ? img.getWidth() : img.getHeight();
     176        BufferedImage rotated = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     177        AffineTransform transform = ExifReader.getRestoreOrientationTransform(exifOrientation, img.getWidth(), img.getHeight());
     178        Graphics2D g = rotated.createGraphics();
     179        g.drawImage(img, transform, null);
     180        g.dispose();
     181        return rotated;
     182    }
    160183}
Note: See TracChangeset for help on using the changeset viewer.