我正在研究一种图像冲突机制,它使用长值作为每个图像的位掩码,如果不排除像素,则将每个位设置为1(在大多数情况下是透明的),否则为0。我写了一个测试方法,将位掩码写入文本文件为1和0。在我看来,理论上,因为图像是逐行读取的,所以1和0应该与图像本身相似。
这不是我得到的。我的位分配代码或我的打印代码有问题吗?或者它应该看起来像那样?
图片解析
int[] data = ColorUtils.getImageData(img);
bounds = new Rectangle(img.getWidth(), img.getHeight());
int wt = (int) bounds.getWidth();
int ht = (int) bounds.getHeight();
bitmasks = new long[ht];
for(int y = 0; y < ht; y++) {
long bitmask = 0;
for(int x = 0; x < wt; x++) {
if(data[x + y * wt] != excludedColor)
bitmask = (bitmask << 1) + 1;
else
bitmask = bitmask << 1;
}
bitmasks[y] = bitmask;
}
文件打印
PrintWriter pw = null;
try {
pw = new PrintWriter(new File("/home/brian/Desktop/imageModel.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
for(int y = 0; y < bounds.getHeight(); y++) {
long bitmask = bitmasks[y];
for(int x = 0; x < bounds.getWidth(); x++) {
pw.print(String.valueOf((bitmask >> (x + y * (int) bounds.getWidth())) & 1));
}
pw.println();
pw.println();
}
pw.close();
图片:
生成的文字文件: View
答案 0 :(得分:1)
你的图像解析对我来说看起来很好,假设你实际上可以将整行存储成长而不会溢出它(并且假设你正在通过正确考虑所有通道来查看数据,这对我来说是错误的码)。但在“文件打印”上,我看不出它是如何正确的。您每行存储一个bitmask
,因此如果我们可以为其编制索引,bitmask[width - 1]
将代表给定行中的第一列,bitmask[width - 2]
代表第二列,......和{{ 1}}代表该行的最后一列。因此,在解包阶段需要纠正两件事:1)从bitmask[0]
=宽度 - 1循环到0; 2)然后通过x
解压缩它。
将图片尺寸调整为50x50后,考虑到alpha值((mask >> x) & 1)
代表背景,我就是这样:
<= 2
答案 1 :(得分:-1)
嗯,从我的观点来看,它似乎有效。如果你看看你的文本文件,你会在开头有一堆零,一些零和一堆零(第一行中有很多透明像素)。在文件的中间,您几乎找不到零(许多红色像素)。你到底对什么不满意?