java - 如何从 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") );
我错过了什么?
解决方案
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 为白色。
推荐阅读
- javascript - 在所有异步函数完成后执行函数?
- php - 如何使用 PHP 和 MySQL 在数据库中存储网络爬虫
- oracle - 加入时删除不按预期工作oracle
- unity3d - Unity-如何将触摸连接到任意控件
- angular - angular-highcharts:点击事件无法从“this”范围加载函数
- php - $_POST 不工作。当我回应它
- python - dhash.get_num_bits_different 出错
- c - 定义指向结构数组的指针
- assembly - 汇编中的堆栈溢出错误
- android - 在 WebView 中检测视频播放状态的最佳方法是什么?