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 は次のようになります。
出力は次のとおりです。
画像が真っ黒になると思っていましたが、一番下に変更されていない行がいくつかあります。どうやら、バイトバッファの終わりに達していません。
さらに調査すると、配列に余分なバイトがあるようです。
width = 810, height = 723
-> width * height / 8 = 73203
byte_buffer.length = 73746
残念ながら、最初の 543 バイトをスキップすると、画像の先頭に変更されていない行が数行残るため、これらの余分な 543 バイトは単に先頭にあるわけではありません。
私は何が欠けていますか?個々のピクセルに正しくインデックスを付けるにはどうすればよいですか?