【问题标题】:Convert 2D array in Java to Image将Java中的二维数组转换为图像
【发布时间】:2013-06-28 22:03:35
【问题描述】:

我需要将灰度图像的像素强度数据的二维数组转换回图像。我试过这个:

BufferedImage img = new BufferedImage(
    regen.length, regen[0].length, BufferedImage.TYPE_BYTE_GRAY);  
for(int x = 0; x < regen.length; x++){
    for(int y = 0; y<regen[x].length; y++){
        img.setRGB(x, y, (int)Math.round(regen[x][y]));
    }
}
File imageFile = new File("D:\\img\\conv.bmp");
ImageIO.write(img, "bmp", imageFile);

其中“regen”是一个二维双精度数组。我得到一个相似但不准确的输出。很少有像素与它必须是完全相反的(对于值为 255 的像素,我得到黑色)。很少有灰色阴影也被视为白色。你能告诉我我做错了什么吗?

【问题讨论】:

  • 黑暗中的一枪:从 double 到 int 可能存在舍入问题?
  • 不,我猜这不是问题..大多数像素已经是整数。它们只是在一个双数组中。同样对于剩下的几个,像素值太接近整数了。例如:我有 254.9999999999 为 255,所以它必须四舍五入到 255。

标签: java image image-processing


【解决方案1】:

试试这样的代码:

public void writeImage(int Name) {
    String path = "res/world/PNGLevel_" + Name + ".png";
    BufferedImage image = new BufferedImage(color.length, color[0].length, BufferedImage.TYPE_INT_RGB);
    for (int x = 0; x < 200; x++) {
        for (int y = 0; y < 200; y++) {
            image.setRGB(x, y, color[x][y]);
        }
    }

    File ImageFile = new File(path);
    try {
        ImageIO.write(image, "png", ImageFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案2】:

    BufferedImage.TYPE_BYTE_GRAY 是无符号且无索引的。此外,

    当具有非不透明 alpha 的数据存储在这种类型的图像中时,必须将颜色数据调整为非预乘形式并丢弃 alpha,如AlphaComposite 文档中所述。

    您至少需要排除符号扩展并将除第三个参数的最低八位之外的所有位屏蔽到setRGB()。重现问题的样本数据将是决定性的。

    【讨论】:

    • 我认为 alpha 组件可能不是问题所在。因为即使我在双精度数组中将所有值都设为 255.0,我仍然会得到带有黑色像素的图像。
    • 您可以验证图像尺寸并编辑您的问题以包含一个显示问题的sscce
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2012-07-11
    • 2019-08-13
    相关资源
    最近更新 更多