Java - 将缓冲图像保存到文件旋转 90 度时出现问题

Posted

技术标签:

【中文标题】Java - 将缓冲图像保存到文件旋转 90 度时出现问题【英文标题】:Java - Problem with saving buffered image to file rotates 90 degrees 【发布时间】:2022-01-16 19:11:41 【问题描述】:

我一直在尝试完成将 Color[][] 保存到 jpg 图像文件的方法,但是解决方案将导致输出文件旋转 90 度,我尝试查找问题但没有出现对我来说很明显,以及其他具有类似解决方案的人似乎没有同样的问题。

非常感谢任何帮助!

private Color[][] image;  //  assume this field has already been populated

public  void saveImage() 
    BufferedImage saveImage = new BufferedImage(this.image.length, 
                                                this.image[0].length, 
                                                BufferedImage.TYPE_INT_RGB);
    for (int row = 0; row < this.image.length; row++) 
        for (int col = 0; col < this.image[row].length; col++) 
            saveImage.setRGB(row, col, this.image[row][col].getRGB());
        
    

    String fName = UIFileChooser.save();
    if (fName==null)return;

    File toFile = new File(fName+".jpg");

    try 
        ImageIO.write(saveImage,"jpg", toFile);
    catch (IOException e)UI.println("File save error: "+e);

感谢帮助,原来我只需要翻转尺寸和 x/y 坐标,下面是固定版本:

private Color[][] image;  //  assume this field has already been populated

public  void saveImage() 
    BufferedImage saveImage = new BufferedImage(this.image[0].length, 
                                                this.image.length, 
                                                BufferedImage.TYPE_INT_RGB);
    for (int row = 0; row < this.image.length; row++) 
        for (int col = 0; col < this.image[row].length; col++) 
            saveImage.setRGB(col, row, this.image[row][col].getRGB());
        
    

    String fName = UIFileChooser.save();
    if (fName==null)return;

    File toFile = new File(fName+".jpg");

    try 
        ImageIO.write(saveImage,"jpg", toFile);
    catch (IOException e)UI.println("File save error: "+e);

【问题讨论】:

症状表明您只是在 image 数组中交换了 x 和 y(行与列)... 【参考方案1】:

BufferedImage.setRGB 方法的签名是public void setRGB​(int x, int y, int rgb)

先是 X,然后是 Y。row 等于 ycol 等于 x

所以将该行更改为:

saveImage.setRGB(col, row, this.image[row][col].getRGB());

【讨论】:

还必须将 bufferedImage 调整为 (this.image[0].length, this.image.length,...) 以确保我有正确的尺寸,否则感谢帮助!

以上是关于Java - 将缓冲图像保存到文件旋转 90 度时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

立方体在旋转时未按预期呈现

iOS:图像在保存为 PNG 表示数据后旋转 90 度

Android:图片以 -90 度旋转上传到 Firebase

使用JS旋转图像时如何添加边距顶部

OpenCV 完整例程28. 图像的旋转(直角旋转)

裁剪 UIImage 使其在保存时逆时针旋转 90º