1

BufferedImage 内の個々のピクセルにアクセスできません。私の画像は、黒または白のみのようにバイナリです。これは、イメージの各バイトに 8 ピクセル (ピクセルあたり 1 ビット) が含まれることを意味します。

画像のインデックスが正しく作成されていることを確認するために、すべてのピクセルを 1 (黒) に設定する簡単なテストを作成しました。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;

public class ImageTest {
    public static void main(String... args) throws Exception {
        File input = new File("stripes.bmp");
        final BufferedImage image = ImageIO.read(input);
        System.out.println(image);

        byte[] byte_buffer = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

        final int width = image.getWidth(), height = image.getHeight();

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

        ImageIO.write(image, "bmp", new File("stripes_out.bmp"));
    }
}

入力画像、stripes.bmp は次のようになります。 ストライプ.bmp

出力は次のとおりです。 ストライプアウト.bmp

画像が真っ黒になると思っていましたが、一番下に変更されていない行がいくつかあります。どうやら、バイトバッファの終わりに達していません。

さらに調査すると、配列に余分なバイトがあるようです。

width = 810, height = 723
-> width * height / 8 = 73203
byte_buffer.length = 73746

残念ながら、最初の 543 バイトをスキップすると、画像の先頭に変更されていない行が数行残るため、これらの余分な 543 バイトは単に先頭にあるわけではありません。

私は何が欠けていますか?個々のピクセルに正しくインデックスを付けるにはどうすればよいですか?

4

1 に答える 1

3

バイト バッファー配列内の各イメージ行は、バイト単位で整列されます。つまり、各行の「実際の」ビット幅は 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;
        }
    }
于 2013-08-15T21:03:58.447 に答える