我有以下代码来阅读java中的黑白图片。
imageg = ImageIO.read(new File(path));
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_USHORT_GRAY);
Graphics g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
int w = img.getWidth();
int h = img.getHeight();
int[][] array = new int[w][h];
for (int j = 0; j < w; j++) {
for (int k = 0; k < h; k++) {
array[j][k] = img.getRGB(j, k);
System.out.print(array[j][k]);
}
}
如您所见,我已将BufferedImage的类型设置为TYPE_USHORT_GRAY,我希望在两个D数组mattrix中看到0到255之间的数字。但我会看到'-1'和另一个大整数。有人可以突出我的错误吗?
答案 0 :(得分:0)
类型为BufferedImage
的{{1}}名称表示使用16位存储像素(TYPE_USHORT_GRAY
的大小为16位)。范围short
仅为8位,因此颜色可能远远超过255
并且0..255
不会返回这16个像素数据位,而是从其javadoc引用
返回默认RGB颜色模型(TYPE_INT_ARGB)和默认sRGB颜色空间中的整数像素。
BufferedImage.getRGB()
将始终以RGB格式返回像素,而不管getRGB()
的类型。
答案 1 :(得分:0)
正如在评论和答案中已经提到的,错误是使用getRGB()
方法将默认的sRGB颜色空间(int
)中的像素值转换为压缩TYPE_INT_ARGB
格式。在这种格式中,-1
与'0xffffffff`相同,这意味着纯白色。
要直接访问未签名的short
像素数据,请尝试:
int w = img.getWidth();
int h = img.getHeight();
DataBufferUShort buffer = (DataBufferUShort) img.getRaster().getDataBuffer(); // Safe cast as img is of type TYPE_USHORT_GRAY
// Conveniently, the buffer already contains the data array
short[] arrayUShort = buffer.getData();
// Access it like:
int grayPixel = arrayUShort[x + y * w] & 0xffff;
// ...or alternatively, if you like to re-arrange the data to a 2-dimensional array:
int[][] array = new int[w][h];
// Note: I switched the loop order to access pixels in more natural order
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
array[x][y] = buffer.getElem(x + y * w);
System.out.print(array[x][y]);
}
}
// Access it like:
grayPixel = array[x][y];
PS:看看@blackSmith提供的第二个链接可能仍然是一个好主意,以获得正确的颜色到灰色转换。 ; - )