我的Java代码旋转jpeg照片有什么问题?

Dav*_*Dee 4 java jpeg image

我只是想让我网站的用户将提交的照片的方向从水平更改为垂直。这是我的代码:

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){
      }
   }
Run Code Online (Sandbox Code Playgroud)

问题是,即使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)
Run Code Online (Sandbox Code Playgroud)

有什么想法或解决方法吗?

veh*_*ehk 5

尝试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);
Run Code Online (Sandbox Code Playgroud)

您还必须确保newImage包含filter()方法返回的数据。

奇怪的是,这仅在将formatNamein 设置ImageIO.write()为“ png”时有效。我尝试使用jpg,结果是黑色图片。

  • 谢谢你的快速反应。当我使用Mohamed的代码时(如上所述),我得到了相同的黑色结果,但是对png的更改解决了该问题。真的很感激! (2认同)