You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX ImageView中960×1280图片横置问题及垂直显示方案问询

解决JavaFX ImageView中960×1280图片自动横向旋转的问题

问题核心是图片的EXIF元数据中包含了旋转方向标记,JavaFX的Image类会自动根据该标记调整图片显示方向,导致原图垂直但显示为横向。以下是具体解决方法:

步骤1:读取图片的EXIF旋转信息

图片的EXIF Orientation标签对应不同旋转状态,我们需要读取该值来判断需要调整的角度:

  • 1: 正常显示(无需旋转)
  • 3: 图片需顺时针旋转180°
  • 6: 图片需顺时针旋转90°(显示时需逆时针转90°修正)
  • 8: 图片需逆时针旋转90°(显示时需顺时针转90°修正)

纯Java读取EXIF Orientation的方法

private int getExifOrientation(File imageFile) throws IOException, IIOException {
    try (ImageInputStream iis = ImageIO.createImageInputStream(imageFile)) {
        Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
        if (readers.hasNext()) {
            ImageReader reader = readers.next();
            reader.setInput(iis, true);
            IIOMetadata metadata = reader.getImageMetadata(0);
            String exifFormat = "javax_imageio_jpeg_image_1.0";
            if (metadata.isReadOnly() && metadata.containsMetadataFormat(exifFormat)) {
                IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(exifFormat);
                IIOMetadataNode exif = (IIOMetadataNode) root.getElementsByTagName("ExifIFD").item(0);
                if (exif != null) {
                    NodeList nodes = exif.getElementsByTagName("Orientation");
                    if (nodes.getLength() > 0) {
                        IIOMetadataNode orientationNode = (IIOMetadataNode) nodes.item(0);
                        return Integer.parseInt(orientationNode.getAttribute("value"));
                    }
                }
            }
        }
    }
    return 1; // 默认正常状态
}

步骤2:根据EXIF信息调整ImageView旋转角度

修改你的showPicture方法,读取Orientation值后设置ImageView的旋转属性,强制图片垂直显示:

ScrollPane sp = new ScrollPane();
sp.setPrefSize(900, 700);

public void showPicture(String str){
  try{
            File file = new File("pictures\\"+str+".jpg");
            // 读取图片EXIF旋转标记
            int orientation = getExifOrientation(file);
            
            Image image = new Image(file.toURI().toString());
            if(image.getWidth()>900)
            {
                Double x=image.getWidth();
                Double y=image.getHeight();
                Double z=x/900;
                if((y/z)>700)
                {
                    z=y/700;
                }
                image = new Image(file.toURI().toString(),x/z,y/z,false,false);
            }
            ImageView imageView = ImageViewBuilder.create()
                .image(image)
                .build();
            
            // 根据EXIF标记调整旋转角度,修正显示方向
            switch(orientation) {
                case 3:
                    imageView.setRotate(180);
                    break;
                case 6:
                    imageView.setRotate(90);
                    // 旋转后调整宽高适配ScrollPane
                    imageView.setFitWidth(image.getHeight());
                    imageView.setFitHeight(image.getWidth());
                    break;
                case 8:
                    imageView.setRotate(-90);
                    imageView.setFitWidth(image.getHeight());
                    imageView.setFitHeight(image.getWidth());
                    break;
                default:
                    // 无需旋转,保持默认
                    break;
            }
            
            sp.setContent(imageView);
   }catch(Exception e){System.err.println(e);}
}

补充说明

  • 旋转后必须调整ImageView的fitWidth和fitHeight,避免图片在ScrollPane中出现布局偏移。
  • 若不想手动实现EXIF读取,可引入Apache Commons Imaging库简化代码,核心逻辑是读取TIFF_TAG_ORIENTATION标签值后做对应旋转处理。

内容的提问来源于stack exchange,提问作者Seco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:30:29