Делая снимок в качестве входных данных, сделайте шкалу серого и затем выведите - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь сделать снимок в качестве входного, затем манипулировать этим изображением (я специально хочу сделать его серым) и затем вывести новое изображение.Это фрагмент кода, который я редактирую, чтобы сделать это, но я застреваю.Любые идеи о том, что я могу изменить / сделать дальше.С благодарностью!

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

1 Ответ

0 голосов
/ 24 января 2012

Я постараюсь придерживаться как можно ближе к тому, что у вас уже есть. Итак, я предполагаю, что вы ищете способ обработки на уровне пикселей на 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[], обработать его, а затем установить обратно в изображение. При этом используются другие версии методов setRGB() / getRGB(), которые вы найдете в javadoc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...