Java 用DataBufferByte处理二值位图图像中的像素

Java 用DataBufferByte处理二值位图图像中的像素,java,image,Java,Image,我在访问BuffereImage中的单个像素时遇到问题。我的图像是二进制的,只有黑色或白色。这意味着图像的每个字节包含8个像素(每像素1位) 为了确保正确索引图像,我编写了一个快速测试,将所有像素设置为1(黑色): 不幸的是,这543个额外的字节并不仅仅是在开头,因为跳过前543个字节会在图像的开头留下一些未修改的行 我错过了什么?如何正确索引各个像素?字节缓冲区数组中的每个图像行都是字节对齐的。这意味着每行的“实际”位宽度需要是8的倍数。在您的图像中,每一行被四舍五入到816位。我假设每行的最

我在访问BuffereImage中的单个像素时遇到问题。我的图像是二进制的,只有黑色或白色。这意味着图像的每个字节包含8个像素(每像素1位)

为了确保正确索引图像,我编写了一个快速测试,将所有像素设置为1(黑色):

不幸的是,这543个额外的字节并不仅仅是在开头,因为跳过前543个字节会在图像的开头留下一些未修改的行


我错过了什么?如何正确索引各个像素?

字节缓冲区数组中的每个图像行都是字节对齐的。这意味着每行的“实际”位宽度需要是8的倍数。在您的图像中,每一行被四舍五入到816位。我假设每行的最后6位被丢弃

    816 * 723 / 8 = 73746
因此,只需将宽度四舍五入到8的最接近倍数,并在内部循环中使用:

    final int width = image.getWidth(),
              height = image.getHeight(),
              rowBitWidth = ((width + 7) / 8) * 8;

    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {
            int byte_index = (i + j * rowBitWidth) / 8;
            int bit_index = (i + j * rowBitWidth) % 8;
            byte_buffer[byte_index] |= 1 << bit_index;
        }
    }
final int width=image.getWidth(),
高度=image.getHeight(),
行位宽度=((宽度+7)/8)*8;
对于(int j=0;j字节缓冲区[字节索引]|=1图像的大小是多少?您尝试过光栅吗?可能是应用了一个填充以保持宽度为4的倍数。谢谢!是否有一个地方记录了这一点?我似乎在任何地方都找不到它。不幸的是,我也在任何地方找不到它。我刚刚将字节数组转储到System.out(如
0
s和
1
s),查找模式中的中断,并注意到每800ish位有额外的位。然而,我只是查看了文档,注意到
buffereImage
类有一个
setRGB
方法来设置单个像素。为什么不使用此方法并将
0
传递给黑色,将
0xFFFFFFFF
传递给白色?非常好的检测工作。原因如下:避免使用getRGB和setRGB方法的另一个原因是使用DataBuffer的速度要快得多(在我的测试中,至少快了10倍)。我读了更多的内容。
Raster
doc说“SampleModel描述了如何将光栅的样本存储在DataBuffer的基本数组元素中。”因此,您应该从
光栅
获取
SampleModel
,并使用它来解释
DataBuffer
。然而,实际上是
SampleModel
子类决定了数据存储格式。看起来所有子类都有一个
getScanlineStride
方法,该方法指示了数据存储格式图像中的一行是数组元素。因此,您需要确定正在使用的示例模型,并将其转换为该模型。
    816 * 723 / 8 = 73746
    final int width = image.getWidth(),
              height = image.getHeight(),
              rowBitWidth = ((width + 7) / 8) * 8;

    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {
            int byte_index = (i + j * rowBitWidth) / 8;
            int bit_index = (i + j * rowBitWidth) % 8;
            byte_buffer[byte_index] |= 1 << bit_index;
        }
    }