这就是我到目前为止所做的事情,我似乎无法继续前进,因为我不理解RGB上的按位操作
// Read from a file
File file = new File("src/a.gif");
image = ImageO.read(file);
int[] rgbarr = image.getRGB(0, 0, 13, 15, null, 0, 13);// image is 13*15
System.out.println(rgbarr.length);
for (int i : rgbarr)
{
System.out.println(i);
}
输出:是-16777216和-1之类的值因为我已经制作了黑白图像以便于理解
但在我们的例子中,我们假设它只是随机图像,我如何从普通RGB图像到每个像素的二进制值(0或1)。
答案 0 :(得分:2)
我打赌数组中的每个int都是打包的ARGB值;
boolean [] output = new boolean[rgbarr.length];
for ( int i=0; i<rgbarr.length; ++i ) {
int a = (rgbarr[i] >> 24 ) & 0x0FF;
int r = (rgbarr[i] >> 16 ) & 0x0FF;
int g = (rgbarr[i] >> 8 ) & 0x0FF;
int b = (rgbarr[i] ) & 0x0FF;
output[i] = (0.30*r + 0.59*g + 0.11*b) > 127;
}
我选择的输出方程取自维基百科的Luminance定义。只要系数加起来为1,就可以更改比例。
答案 1 :(得分:1)
你可以做这样的事情,
BufferedImage img = (BufferedImage) image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img , "jpg", baos);
byte[] previewByte = baos.toByteArray();
希望这会有所帮助!!
答案 2 :(得分:0)
你已经在int []中有RGB值,即每个像素的颜色。您可以将其与特定背景颜色(如黑色)进行比较,以获得1位像素值。然后可能在另一个适当大小的byte []数组中设置一个位......