Java:BuffereImage上的getHeight()返回图像宽度,getWidth()返回图像高度
我正在用Java压缩一幅图像进行Jpeg压缩,然后在存储之前调整它们的大小。我将存储高度保持为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 =
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的建议得到了预期的结果。我把它贴在下面。