java - Manipulating pixels in binary bitmap image with DataBufferByte -
i'm having trouble accessing individual pixels in bufferedimage. image binary, in black or white only. means each byte of image contains 8 pixels (1 bit per pixel).
to make sure i'm indexing image correctly, wrote quick test set pixels 1 (black):
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(); (int j = 0; j < height; j++) { (int = 0; < 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")); } }
the input image, stripes.bmp looks like:
and output is:
i expected image come out black, there few rows @ bottom weren't modified. apparently, i'm not reaching end of byte buffer.
investigating further, looks there bytes in array.
width = 810, height = 723 -> width * height / 8 = 73203 byte_buffer.length = 73746
unfortunately, these 543 bytes aren't @ beginning, because skipping first 543 bytes leaves few rows unmodified @ beginning of image.
what missing? how can index individual pixels correctly?
each image row in byte buffer array byte-aligned. means "real" bit width of each row needs multiple of 8. in image, each row rounded 816 bits. assume last 6 bits in each row discarded.
816 * 723 / 8 = 73746
so round width nearest multiple of 8 , use in inner loop:
final int width = image.getwidth(), height = image.getheight(), rowbitwidth = ((width + 7) / 8) * 8; (int j = 0; j < height; j++) { (int = 0; < width; i++) { int byte_index = (i + j * rowbitwidth) / 8; int bit_index = (i + j * rowbitwidth) % 8; byte_buffer[byte_index] |= 1 << bit_index; } }
Comments
Post a Comment