大家好我在使用Java将GrayScale bmp图像转换为整数2D数组(值为0-255)时遇到了问题。
我有一个pmb图像,可以看作是一个整数(0-255)2D数组,我想在Java数据结构中看到2D数组
我试过这种方式:
Image image = ImageIO.read(new File("my_img.bmp"));
BufferedImage img = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = img.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
然后使用我的BufferedImage,我以这种方式创建int [] []:
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);
}
}
但是现在所有的2D阵列都充满了像“-9211021”或类似的数字。
我认为问题出在getRGB(j,k)中,但我不知道是否可以解决它。
编辑:
我知道RGB不是灰度,所以如何从灰度BufferedImage中获取单个像素的灰度值?
答案 0 :(得分:1)
在灰度图像中, BufferedImage.getPixel(x,y)不会给出[0-255]范围内的值。相反,它返回RGB颜色空间中灰度级(强度)的对应值。这就是为什么你得到像“ - 9211021”这样的价值观的原因。
以下代码段可以解决您的问题:
Raster raster = image.getData();
for (int j = 0; j < w; j++) {
for (int k = 0; k < h; k++) {
array[j][k] = raster.getSample(j, k, 0);
}
}
其中 image 是创建的BufferedImage。 getSample 中的0表示我们正在访问第一个字节/波段(将其设置为更大的值将在灰度图像中抛出 ArrayOutOfBoundException )。
答案 1 :(得分:0)
您可以使用Catalano Framework。包含几个用于图像处理的过滤器。
http://code.google.com/p/catalano-framework/
细节:这比使用WritableRaster快。
FastBitmap fb = new FastBitmap(bufferedImage);
int[][] image = new int[fb.getHeight()][fb.getWidth];
fb.toArrayGray(image);
//Do manipulations with image
//...
//Place the image into fastBitmap
fb.arrayToImage(image);
//Retrieve in bufferedImage if you desire.
bufferedImage = fb.toBufferedImage();