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
相关产品推荐
相关产品推荐

