如何解决我的Java代码旋转jpeg照片有什么问题?
| 我只是想让我网站的用户将提交的照片的方向从水平更改为垂直。这是我的代码:public static final void rotatePhoto(String jpgFilename){
BufferedImage originalImage = null,newImage=null;
try{
File file = new File(jpgFilename);
originalImage = ImageIO.read(file);
System.out.println(\"Photo.rotatePhoto(\" +jpgFilename +\") originalImage.getWidth(null)=\" +originalImage.getWidth(null) +\" originalImage.getHeight(null)=\" +originalImage.getHeight(null) );
java.awt.image.AffineTransformOp opRotated = new java.awt.image.AffineTransformOp( java.awt.geom.AffineTransform.getQuadrantRotateInstance(1),null );
newImage = opRotated.createCompatibleDestimage(originalImage,originalImage.getColorModel());
opRotated.filter(originalImage,newImage);
}catch (IOException e){
}
/// Write result to file::::::::::::::::::::::::::::::::::::::::::::::::::::
try{
File outputfile = new File(testFilename);
ImageIO.write(newImage,\"jpg\",outputfile);
}catch(IOException ioE){
}
}
问题是即使System.out.println将宽度和高度显示为640x480,我仍然收到此错误
java.awt.image.RasterFormatException: Transformed width (0) is less than or equal to 0.
java.awt.image.AffineTransformOp.createCompatibleDestimage(AffineTransformOp.java:447)
base.Photo.rotatePhoto(Photo.java:135)
base.ProcessContent.handleInput(ProcessContent.java:245)
servlets.ProcessServlet.doPost(ProcessServlet.java:74)
servlets.ProcessServlet.doGet(ProcessServlet.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
有什么想法或解决方法吗?
解决方法
尝试从头开始创建新的
AffineTransform
并在AffineTransformOp
构造函数中使用它:
AffineTransform tx = new AffineTransform();
tx.rotate(Math.PI / 2,originalImage.getWidth() / 2,originalImage.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(tx,AffineTransformOp.TYPE_BILINEAR);
newImage = op.filter(originalImage,newImage);
您还必须确保newImage
包含filter()
方法返回的数据。
奇怪的是,这仅在将ImageIO.write()
中的formatName
设置为\“ png \”时才有效。我尝试使用jpg
,结果是黑色图片。
, 通过使用:AffineTransform.getQuadrantRotateInstance(1);
您的AffineTransform沿轴旋转正数个象限。每当创建兼容的图像时,它就取决于x和y,这会使Transform Operation混乱。
int w = r.x + r.width;
int h = r.y + r.height;
if (w <= 0) {
throw new RasterFormatException(\"Transformed width (\"+w+
\") is less than or equal to 0.\");
}
我建议您自己做:
public final void rotatePhoto(String jpgFilename) throws IOException {
File file = new File(jpgFilename);
BufferedImage originalImage = ImageIO.read(file);
// You could use Math.PI / 2,depends on your input.
AffineTransform affineTransform = new AffineTransform();
affineTransform.rotate(Math.toRadians(90),originalImage.getHeight() / 2);
// Now lets make that transform an operation,and we use it.
AffineTransformOp opRotated = new AffineTransformOp(affineTransform,AffineTransformOp.TYPE_BILINEAR);
BufferedImage newImage = opRotated.filter(originalImage,null);
// Save the image.
File outputfile = new File(\"rotated.jpg\");
ImageIO.write(newImage,\"jpg\",outputfile);
}
更新:顺便说一句,关于如何编写旋转图像的servlet的问题已经得到解答。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。