我的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.getWidth() / 2, 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的问题已经得到解答。     

要回复问题请先登录注册