首页 > 解决方案 > 如何从 Java 中的 2D 数组创建黑白图像?

问题描述

这个 Python 代码

im_data = np.ones((100,100))
im_data[20:50,20:50]=np.zeros((30,30))

可以生成可用于创建图像的二维数组

plt.axis('off')
axi = plt.imshow(im_data, cmap='Greys')

在此处输入图像描述

我正在尝试用 Java 做同样的工作

    int[][] arr = new int[100][100];
    for(int i=0; i<arr.length; i++){
        for (int j=0; j<arr[i].length; j++){
            arr[i][j]=255;
        }
    }
    for(int i=20; i<50; i++){
        for (int j=20; j<50; j++){
            arr[i][j]=0;
        }
    }

    ImageIO.write(arr, "jpg", new File("output.jpg") );

输出此错误

no suitable method found for write(int[][],String,File)
        ImageIO.write(arr, "jpg", new File("output.jpg") );

我错过了什么?

标签: java

解决方案


ImageIO不允许您直接编写包含一些表示像素暗度的数字的二维数组。你在这里错过了很多关于图像的信息,比如它的色彩空间。

一种方法是为 2D 数组的每个元素创建BufferedImage并调用:setRGB

var image = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);

for (int i = 0 ; i < 100 ; i++) {
    for (int j = 0 ; j < 100 ; j++) {
        int rgb = arr[i][j] + (arr[i][j] << 8) + (arr[i][j] << 16);
        image.setRGB(i, j, rgb);
    }
}

ImageIO.write(image, "jpg", new File("image.jpg"));

但是,如果您有一个一维数组,那就容易多了。只需获取栅格,然后setPixels

int[] arr = new int[10000];
Arrays.fill(arr, 255);
for(int i=20; i<50; i++){
  for (int j=20; j<50; j++){
      arr[i + 100 * j] = 0;
  }
}
image.getRaster().setPixels(0, 0, 100, 100, arr);
ImageIO.write(image, "jpg", new File("image.jpg"));

另请注意,在灰度色彩空间中,0 为黑色,255 为白色。


推荐阅读