2012-04-14 158 views
0

我有一个RGB图像,我想转换二进制图像0-255。rgb图像在java中转换二进制图像bufferedImage

我计算rgb图像和灰度图像大于阈值的像素阈值,我设置红色= 255绿色= 255和蓝色= 255并低于阈值我设置红色= 0绿色= 0和蓝色= 0

private static int colorToRGB(int alpha, int red, int green, int blue) { 
    int newPixel = 0; 
    newPixel += alpha; 
    newPixel = newPixel << 8; 
    newPixel += red; newPixel = newPixel << 8; 
    newPixel += green; newPixel = newPixel << 8; 
    newPixel += blue; 
    System.out.println("asd" + newPixel); 
    return newPixel; 
} 

newPixel的价值-16777216如果像素是白色 newPixel的值-1,如果像素是黑色

阿尔法值是恒定的255 如果我错了,因为我想像素的值0, 255.

BufferedImage的类型为TYPE_INT_ARGB

谢谢你帮

回答

0

int newPixel = (alpha << 24) | (red << 16) | (green << 8) | blue;

这导致编码为0xAARRGGBB的颜色,这可能是你想要的。

+0

我创建新的bufferedImage TYPE_BYTE_BINARY,我想像素的值为0和1或0和255.但是这个计算结果的黑色-1和如果白色-16777216 – user1291468 2012-04-14 21:09:07

1

老实说你的问题对我没有多大意义。 所以我回答你的问题做一些假设:

  1. 你有一个全球性的阈值[0-255]
  2. ,所以你需要将RGB像素转换为灰度值
  3. 门槛应该适用于灰度值
  4. 的程序应该是尽可能快地
  5. 要做到这一点在Java

该函数将RGB颜色和阈值,并返回黑色或白色。

public static int treshold(final int sourceColor, final int treshold) { 
    // green channel is a good approximation of rgb intensity 
    int green = (sourceColor >> 8) & 0xFF; 
    if (green < treshold) { 
     return 0xFF000000; 
    } else { 
     return 0xFFFFFFFF; 
    } 
} 
+0

最好的解决方案! – 2015-02-18 14:38:51

0

除非透明蓝色(0 alpha,0 red,0 green,0-255 blue),否则像素将不具有值0 - 255。 阿尔法,红色,绿色,蓝色可能在0到255范围内,但是放在一起它们会变得更大。在alpha值为255的情况下,您最终会在您的整数上领先1。领先的表示整数是负数。你的最终价值是正确的。另外,Torious只是缩短你的等式,但是你的两个计算都能正常工作。

相关问题