我正在尝试将图片作为输入,然后处理所述图片(我特别想使其成为灰度),然后输出新图像。这是我正在编辑的代码的片段,但我被卡住了。关于我接下来可以更改/执行的操作的任何想法。非常感激!

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;
}

最佳答案

我将尝试尽可能地靠近您已经拥有的东西。因此,我假设您正在寻找如何在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()方法的其他版本。

关于java - 拍摄图片作为输入,进行灰度调整,然后输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8979908/

10-12 15:29
查看更多