使用TYPE_USHORT_GRAY在java中读取黑/白图像

时间:2014-09-29 06:01:19

标签: java image bufferedimage

我有以下代码来阅读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到25​​5之间的数字。但我会看到'-1'和另一个大整数。有人可以突出我的错误吗?

2 个答案:

答案 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提供的第二个链接可能仍然是一个好主意,以获得正确的颜色到灰色转换。 ; - )