2

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

图片:

正在解析的测试图像

生成的文本文件: 查看

4

1 回答 1

1

您的图像解析对我来说看起来大部分都很好,假设您实际上可以将整行存储到 long 中而不会溢出它(并且还假设您通过正确考虑所有通道来浏览数据,这对我来说在您的代码中是错误的)。但是在“文件打印”上,我看不出它是如何正确的。您bitmask每行存储一个,所以如果我们可以索引它,bitmask[width - 1]将表示给定行中bitmask[width - 2]的第一列,第二列,...,并bitmask[0]表示该行中的最后一列。所以在拆包阶段需要纠正两件事:1)从x=宽度-1到0的循环;2)然后通过执行解压缩它((mask >> x) & 1)

将图像大小调整为 50x50 并考虑到 alpha 值<= 2代表背景后,我得到以下结果:

00000000000000000111111111111111000000000000000000
00000000000000011111111111111111110000000000000000
00000000000001111111111111111111111100000000000000
00000000000011111111111111111111111111000000000000
00000000001111111111111111111111111111100000000000
00000000011111111111111111111111111111110000000000
00000000111111111111111111111111111111111000000000
00000001111111111111111111111111111111111100000000
00000011111111111111111111111111111111111110000000
00000011111111111111111111111111111111111111000000
00000111111111111111111111111111111111111111000000
00001111111111111111111111111111111111111111100000
00001111111111111111111111111111111111111111100000
00011111111111111111111111111111111111111111110000
00011111111111111111111111111111111111111111110000
00111111111111111111111111111111111111111111111000
00111111111111111111111111111111111111111111111000
00111111111111111111111111111111111111111111111000
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
01111111111111111111111111111111111111111111111100
00111111111111111111111111111111111111111111111100
00111111111111111111111111111111111111111111111000
00111111111111111111111111111111111111111111111000
00011111111111111111111111111111111111111111111000
00011111111111111111111111111111111111111111110000
00011111111111111111111111111111111111111111110000
00001111111111111111111111111111111111111111100000
00000111111111111111111111111111111111111111100000
00000111111111111111111111111111111111111111000000
00000011111111111111111111111111111111111110000000
00000001111111111111111111111111111111111100000000
00000001111111111111111111111111111111111100000000
00000000111111111111111111111111111111111000000000
00000000011111111111111111111111111111110000000000
00000000000111111111111111111111111111000000000000
00000000000011111111111111111111111110000000000000
00000000000000111111111111111111111000000000000000
00000000000000001111111111111111100000000000000000
00000000000000000011111111111110000000000000000000
于 2013-01-19T23:46:46.267 回答