java - 写入图像位掩码

标签 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

最佳答案

你的图像解析在我看来基本上没问题,假设你实际上可以将整行存储到一个 long 而不会溢出(并且假设你通过正确考虑所有 channel 来浏览数据,这对我来说是错误的代码)。但是在“文件打印”上,我看不出它怎么可能是正确的。您正在存储一个 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

关于java - 写入图像位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14419501/

相关文章:

java - 在 JScrollPane 中重新绘制 JPanel 时闪烁

java - Java String .matches() 的奇怪输出

java - 有没有办法让 JList 的每个项目具有不同的宽度?

c# - 优化 : VB. 从文件中加载图像并即时调整大小;目标:快速

html - 如果图像宽度 = 250 CSS

背景大小调整的 Html/CSS 问题

r - 在 R 中高效绘制数亿个点

c - C中图形的一些链接

java - 充气机获取压缩方法

java - clearRect 绘制黑色而不是透明