Ticket #5605: ImageDisplay.java.diff

File ImageDisplay.java.diff, 3.6 KB (added by *Martin*, 15 years ago)

patch

  • src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java

     
    99import java.awt.Dimension;
    1010import java.awt.FontMetrics;
    1111import java.awt.Graphics;
     12import java.awt.Graphics2D;
    1213import java.awt.Image;
    1314import java.awt.MediaTracker;
    1415import java.awt.Point;
     
    1920import java.awt.event.MouseMotionListener;
    2021import java.awt.event.MouseWheelEvent;
    2122import java.awt.event.MouseWheelListener;
     23import java.awt.geom.AffineTransform;
    2224import java.awt.geom.Rectangle2D;
     25import java.awt.image.BufferedImage;
    2326import java.io.File;
    2427
    2528import javax.swing.JComponent;
    2629
    2730import org.openstreetmap.josm.Main;
    2831
     32import com.drew.imaging.jpeg.JpegMetadataReader;
     33import com.drew.imaging.jpeg.JpegProcessingException;
     34import com.drew.metadata.Directory;
     35import com.drew.metadata.Metadata;
     36import com.drew.metadata.MetadataException;
     37import com.drew.metadata.exif.ExifDirectory;
     38
    2939public class ImageDisplay extends JComponent {
    3040
    3141    /** The file that is currently displayed */
     
    8999                    tracker.removeImage(img);
    90100                    return;
    91101                }
     102
    92103                ImageDisplay.this.image = img;
    93104                visibleRect = new Rectangle(0, 0, img.getWidth(null), img.getHeight(null));
     105
     106                int orientation = -1;
     107                try {
     108                    final Metadata metadata = JpegMetadataReader.readMetadata(file);
     109                    final Directory dir = metadata.getDirectory(ExifDirectory.class);
     110                    orientation = dir.getInt(ExifDirectory.TAG_ORIENTATION);
     111                } catch (JpegProcessingException e1) {
     112                    e1.printStackTrace();
     113                } catch (MetadataException e) {
     114                    e.printStackTrace();
     115                }
     116
     117                final int w = (int) visibleRect.getWidth();
     118                final int h = (int) visibleRect.getHeight();
     119
     120                outer: {
     121                    final int hh, ww, q;
     122                    final double ax, ay;
     123                    switch (orientation) {
     124                    case 8:
     125                        q = -1;
     126                        ax = w / 2;
     127                        ay = w / 2;
     128                        ww = h;
     129                        hh = w;
     130                        break;
     131                    case 3:
     132                        q = 2;
     133                        ax = w / 2;
     134                        ay = h / 2;
     135                        ww = w;
     136                        hh = h;
     137                        break;
     138                    case 6:
     139                        q = 1;
     140                        ax = h / 2;
     141                        ay = h / 2;
     142                        ww = h;
     143                        hh = w;
     144                        break;
     145                    default:
     146                        break outer;
     147                    }
     148
     149                    final BufferedImage rot = new BufferedImage(ww, hh, BufferedImage.TYPE_INT_RGB);
     150                    final AffineTransform xform = AffineTransform.getQuadrantRotateInstance(q, ax, ay);
     151                    final Graphics2D g = rot.createGraphics();
     152                    g.drawImage(image, xform, null);
     153                    g.dispose();
     154
     155                    visibleRect.setSize(ww, hh);
     156                    image.flush();
     157                    ImageDisplay.this.image = rot;
     158                }
     159
    94160                selectedRect = null;
    95161                errorLoading = error;
    96162            }