Java:BuffereImage上的getHeight()返回图像宽度,getWidth()返回图像高度

Java:BuffereImage上的getHeight()返回图像宽度,getWidth()返回图像高度,java,image,metadata,Java,Image,Metadata,我正在用Java压缩一幅图像进行Jpeg压缩,然后在存储之前调整它们的大小。我将存储高度保持为480,并根据纵横比计算高度,以保持原始的高度:宽度比率不变 这是我正在使用的代码 String inputImagePath = "1.JPG"; String outputImagePath = "Test Compression\\" + "1.JPG"; File imageFile = new File(inputImagePath); File compressedImageFile =

我正在用Java压缩一幅图像进行Jpeg压缩,然后在存储之前调整它们的大小。我将存储高度保持为
480
,并根据纵横比计算
高度
,以保持原始的
高度:宽度
比率不变

这是我正在使用的代码

String inputImagePath = "1.JPG";
String outputImagePath = "Test Compression\\" + "1.JPG";

File imageFile = new File(inputImagePath);
File compressedImageFile = new File(outputImagePath);

int height = 640;

System.out.print("Conversion Start!\n");

if (imageFile != null)
{

    InputStream is = new FileInputStream(imageFile);
    OutputStream os = new FileOutputStream(compressedImageFile);

    float quality = 0.2 f;

    BufferedImage image = ImageIO.read(is);

    double aspectRatio = (double) image.getWidth() / image.getHeight();

    width = (int)(height * aspectRatio);
    System.out.println("Original height = " + image.getHeight() + " Original  width = " + image.getWidth());
    System.out.println(" aspect ratio = " + aspectRatio);
    System.out.println("height = " + height + " width = " + width + " aspect ratio = " + aspectRatio);

    BufferedImage resizedImage = new BufferedImage(width, height, image.getType());
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(image, 0, 0, width, height, null);
    g.dispose();

    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");

    if (!writers.hasNext())
        throw new IllegalStateException("No writers found");

    ImageWriter writer = (ImageWriter) writers.next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(os);
    writer.setOutput(ios);

    ImageWriteParam param = writer.getDefaultWriteParam();
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(quality);

    writer.write(null, new IIOImage(resizedImage, null, null), param);
}

System.out.print("Conversion compete!");

我将代码应用到其他实际上有
宽度>高度的图像上,并且没有旋转问题。这个旋转问题只发生在具有
height>width
的图像上。据我所知,我的代码中没有任何错误,我一定是缺少了与getHeight()和getWidth()函数相关的内容。请帮我解决一下

jpeg图像中可能存在Java默认无法识别的旋转元数据

它看起来像:jpeg属性中的
方向:旋转90


您需要一个第三方库来处理它,请参见

以获取将来的参考资料,我通过Sergey Grinev提供的参考资料对代码进行了一些修改,并获得了预期的结果。这是密码

元数据元数据=ImageMetadataReader.readMetadata(imageFile); Directory Directory=metadata.getFirstDirectoryOfType(exiffd0directory.class); int方向=1; 试一试{ 方向=directory.getInt(exiffd0directory.TAG\u方向); }捕获(MetadataException me){ System.out.println(“无法获取方向”); } int orgWidth=image.getWidth(); int orgHeight=image.getHeight(); 双orgAspectRatio=(双)orgWidth/orgHeight; AffineTransform AffineTransform=新的AffineTransform(); 仿射变换器仿射变换器; BuffereImage orientedImage=新的BuffereImage(image.getHeight(),image.getWidth(),image.getType()); 布尔旋转=假; 开关(方向){ 案例1: 定向图像=图像; 打破 案例2://翻转X 仿射变换比例(-1.0,1.0); 仿射Transform.translate(-orgWidth,0); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例3://PI旋转 仿射Transform.translate(orgWidth,orgHeight); 仿射变换旋转(数学PI); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例4:Y 仿射变换尺度(1.0,-1.0); 仿射变换.translate(0,-orgHeight); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例5://-PI/2和翻转X 旋转=真; 仿射变换旋转(-Math.PI/2); 仿射变换比例(-1.0,1.0); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例6://-PI/2和-width 旋转=真; 仿射Transform.translate(orgHeight,0); 仿射变换旋转(数学PI/2); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例7://PI/2和Flip 旋转=真; 仿射变换比例(-1.0,1.0); 仿射Transform.translate(-orgHeight,0); 仿射变换.translate(0,orgWidth); 仿射变换旋转(3*Math.PI/2); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 案例8://PI/2 旋转=真; 仿射变换.translate(0,orgWidth); 仿射变换旋转(3*Math.PI/2); affineTransformOp=新的affineTransformOp(affineTransform,affineTransformOp.TYPE_双线性); orientedImage=仿射Transformop.filter(图像,orientedImage); 打破 违约: 定向图像=图像; 打破 } 双方面; 如果(旋转){ aspectRatio=(双精度)orientedImage.getWidth()/orientedImage.getHeight(); 宽度=向外宽度; 高度=(int)(宽度/纵横比); } 否则{ aspectRatio=(双精度)orientedImage.getWidth()/orientedImage.getHeight(); 宽度=(int)(高度*纵横比);
}
您能用身高变量更新代码样本吗?它似乎丢失了。我用
height
变量更新代码。顺便说一句,我用Sergey Grinev的建议得到了预期的结果。我把它贴在下面。