写一个图像位掩码

时间:2013-01-19 22:22:13

标签: java image graphics bit-manipulation

我正在研究一种图像冲突机制,它使用长值作为每个图像的位掩码,如果不排除像素,则将每个位设置为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();

图片:

Test image being parsed

生成的文字文件: View

2 个答案:

答案 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)

嗯,从我的观点来看,它似乎有效。如果你看看你的文本文件,你会在开头有一堆零,一些零和一堆零(第一行中有很多透明像素)。在文件的中间,您几乎找不到零(许多红色像素)。你到底对什么不满意?