【问题标题】:What's wrong with my java code to rotate a jpeg photo?我的 java 代码旋转 jpeg 照片有什么问题?
【发布时间】:2011-06-18 13:59:26
【问题描述】:

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

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)

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

【问题讨论】:

    标签: java image jpeg


    【解决方案1】:

    尝试从头开始创建一个新的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,结果是一张黑色的图片。

    【讨论】:

    • 感谢您的快速回复。当我使用 Mohamed 的代码(上图)时,我得到了相同的黑色结果,但是对 png 的更改解决了这个问题。真的很感激!
    • 我试过这个,当原件是风景时,我得到了一个方形图像。额外的图像区域是黑色的。
    【解决方案2】:

    通过使用:AffineTransform.getQuadrantRotateInstance(1);

    您的 AffineTransform 正在按轴旋转正数象限。这会弄乱变换操作,因为它依赖于 x 和 y,无论何时创建兼容的图像。

        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);
    }
    

    更新:顺便说一句,之前How do I write a servlet which rotates images?已经回答过

    【讨论】:

    • Mohamed:非常感谢您的快速回复。我使用了您的确切代码,但将 ImageIO.write 参数从 jpg 更改为 png(如第二个响应中的“KindOfAutomatic”所建议的那样)并且它起作用了。太感谢了。我浪费了昨天所有的时间寻找答案。再次感谢。
    • 不!是的png质量更好!在 StackOverflow 中,如果答案对您有帮助,您通常会将其标记为已接受的答案 :)
    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多