我有这个用ms绘制的图像是106x17
,我想把整个位图变成一个数字。图像本身存储为.png
,我需要一种方法来读取图像并将每个像素存储为BigInteger
中的一个位。我需要读取图像的方式是相当具体的,有点奇怪...图像需要从上到下从右到左读取...所以右上角的像素应该是第一位在数字和左下角,大多数像素应该是数字中的最后一位。
.png
我只能将其作为数字读取,我会在发布此更新后尝试将其导出到位图图像。此外,我将其存储在BigInteger
中,因为该数字应该是106x17= 1802
位长,因此该数字不能首先通过int或long传递,因为它将丢失大部分信息。最后,在这种情况下,黑色像素表示1,白色像素表示0 ...对于奇怪的惯例,这或多或少都与我合作。
答案 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