java如何从黑白图像中获取布尔数组

时间:2015-04-12 20:20:26

标签: java image bitmap boolean

我有这个用ms绘制的图像是106x17,我想把整个位图变成一个数字。图像本身存储为.png,我需要一种方法来读取图像并将每个像素存储为BigInteger中的一个位。我需要读取图像的方式是相当具体的,有点奇怪...图像需要从上到下从右到左读取...所以右上角的像素应该是第一位在数字和左下角,大多数像素应该是数字中的最后一位。

编辑:我应该澄清一点,因为文件存储为.png我只能将其作为数字读取,我会在发布此更新后尝试将其导出到位图图像。此外,我将其存储在BigInteger中,因为该数字应该是106x17= 1802位长,因此该数字不能首先通过int或long传递,因为它将丢失大部分信息。最后,在这种情况下,黑色像素表示1,白色像素表示0 ...对于奇怪的惯例,这或多或少都与我合作。

4 个答案:

答案 0 :(得分:0)

如果您想要一些非常简单的黑白图片,也许您可​​以以.pbm格式导出图像并将其作为文本文件使用,或者如果您将其导出为.ppm,您可能根本不需要处理它你想要什么。
看看these格式

答案 1 :(得分:0)

位图已经是一个数字。只需打开并阅读即可。

image = ImageIO.read(getClass().getResourceAsStream("path/to/your/file.bmp"));
int color = image.getRGB(x, y);
BigInteger biColor = BigInteger.valueOf(color); 

答案 2 :(得分:0)

BufferedImage bi = yourImage;

//the number of bytes required to store all bits
double size = ((double) bi.getWidth()) * ((double) bi.getHeight()) / 8;
int tmp = (int) size;
if(tmp < size)
    tmp += 1;

byte[] b = new byte[tmp];
int bitPos = 7;
int ind = 0;

for(int i = 0 ; i < bi.getHeight() ; i++)
     for(int j = 0 ; j < bi.getWidth() ; j++){
         //add a 1 at the matching position in b, if this pixel isn't black
         b[ind] |= (bi.getRgb(j , i) > 0 ? 0 : (1 << bitPos));

         //next pixel -> next bit
         bitPos -= 1;
         if(bitPos == -1){//the current byte is filled with continue with the next byte
             bitPos = 7;
             ind++;
         }
     }

BigInteger result = new BigInteger(b);

答案 3 :(得分:0)

专门针对图像处理ImageJ的Java API,这里是您可以下载必要Jar,http://imagej.nih.gov/ij/download.html和文档链接http://imagej.nih.gov/ij/docs/index.html

的链接

有几个教程和示例可用于使用此API对图像进行基本操作,我将尝试为您的任务编写基本代码

    // list of points
    List<Point> pointList = new ArrayList<>();

    ImagePlus imp = IJ.openImage("/path/to/image.tif"); 
    ImageProcessor imageProcessor = imp.getProcessor(); 

    // width and height of image
    int width = imageProcessor.getWidth();
    int height = imageProcessor.getHeight();

    // iterate through width and then through height
    for (int u = 0; u < width; u++) {
        for (int v = 0; v < height; v++) {
            int valuePixel = imageProcessor.getPixel(u, v);
            if (valuePixel > 0) {
                pointList.add(new Point(u, v));
            }
        }
    }

    // convert list to array
    pointList.toArray(new Point[pointList.size()]);

这里还有一个更多示例链接http://albert.rierol.net/imagej_programming_tutorials.html#ImageJ