2012-01-23 31 views
2

我试图把图片作为输入,然后操纵所述图片(我特别想让它成为灰度),然后输出新图像。这是我正在编辑的代码的一小部分,但我却陷入了困境。任何想法,我可以改变/接下来做什么。不胜感激!以图片作为输入,制作灰度和&然后输出

public boolean recieveFrame (Image frame) { 
    int width = frame.width(); 
    int height = frame.height(); 

    for (int i = 0; i < width; i++) { 
     for (int j = 0; j < height; j++) { 
      Color c1 = frame.get(i, j); 
      double greyScale = (double) ((Color.red *.3) + (Color.green *.59) + (Color.blue * .11)); 
      Color newGrey = Color.greyScale(greyScale); 
      frame.set(i, j, newGrey); 
     } 
    } 

    boolean shouldStop = displayImage(frame); 
    return shouldStop; 
} 
+0

[如何去饱和图像](http://stackoverflow.com/questions/6471340/how-do-i-desaturate-a-bufferedimage-in-java/6471524#6471524) – mre

回答

0

我要尽量贴近你已经拥有的东西。因此,我假定您正在寻找如何在Image上进行像素级处理,而不是仅仅寻找适合转换为灰度的技术。

第一步是你需要的图像是一个BufferedImage。这是你在默认情况下从ImageIO得到什么,但如果你有一些其他类型的图像,你可以创建一个BufferedImage和第一其它图像绘制到它:

BufferedImage buffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
Graphics2D g = buffer.createGraphics(); 
g.drawImage(image, 0, 0); 
g.dispose() 

然后,您可以像的像素操作这个:

public void makeGrey(BufferedImage image) { 
    for(int x = 0; x < image.getWidth(); ++x) { 
     for(int y = 0; y < image.getHeight(); ++y) { 
     Color c1 = new Color(image.getRGB(x, y)); 
     int grey = (int)(c1.getRed() * 0.3 
         + c1.getGreen() * 0.59 
         + c1.getBlue() * .11 
         + .5); 
     Color newGrey = new Color(grey, grey, grey); 
     image.setRGB(x, y, newGrey.getRGB()); 
     } 
    } 
} 

请注意,这段代码非常慢。更快的选择是将BufferedImage中的所有像素提取到int[],对其进行操作,然后将其设置回图像中。这会使用您在javadoc中找到的其他版本的setRGB()/getRGB()方法。

+0

您可以将浮点数(例如,'灰色=红色* 30 +绿色* 59 +蓝色* 11)/ 100')的点算术。不过不知道这是否能够提高速度。 –

+0

对于'white',这不会导致> 255的灰色值吗?这个公式是如何设计的? –

+0

@Andrew:使用我给出的公式,像素颜色(255,255,255)将产生255的灰度值。该公式是基于人类感知灵敏度将颜色转换为灰度的流行颜色(30%红色+ 59%绿色+ 11%蓝色)。 –

相关问题