Как использовать TYPE_BYTE_GRAY для эффективного создания буферизованного изображения в градациях серого с использованием AWT - PullRequest
2 голосов
/ 24 июня 2010

Мне нужно создать изображение в градациях серого из данных в nio ShortBuffer.У меня есть функция, которая отображает данные в ShortBuffer на неподписанный байт, но в int (легко изменяется)Метод, который я нашел, использует цветовую модель RGB плюс прозрачность и выглядит довольно неэффективно.Я не смог увидеть, как применить TYPE_BYTE_GRAY и изменить код.Я новичок в Java.Вот мой код:

    public void paintComponent(Graphics g) {
    final BufferedImage image;
    int[] iArray = {0, 0, 0, 255};  //  pixel

    image = (BufferedImage) createImage(WIDTH, HEIGHT);

    WritableRaster raster = image.getRaster();
    sBuf.rewind();  // nio ShortBuffer
    for (int row = 0; row < HEIGHT; row++) {
        for (int col = 0; col < WIDTH; col++) {
            int v = stats.mapPix(sBuf.get());  // map short to byte
            iArray[0] = v;  // RGBT
            iArray[1] = v;  
            iArray[2] = v;
            raster.setPixel(col, row, iArray);
        }
    }
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}

TIA Nate

Ответы [ 2 ]

4 голосов
/ 12 октября 2012

Если использовать ColorConvertOp , вы можете просто создать новую шкалу серого BufferedImage и нарисовать на ней исходное цветное изображение:

public static BufferedImage convertToGrayScale(BufferedImage image) {
  BufferedImage result = new BufferedImage(
            image.getWidth(),
            image.getHeight(),
            BufferedImage.TYPE_BYTE_GRAY);
  Graphics g = result.getGraphics();
  g.drawImage(image, 0, 0, null);
  g.dispose();
  return result;
}

Это должно работать значительно быстрее и давать лучшие результаты, чем при использовании метода filter ().

Отличное учебное пособие (включая инструкцию по использованию GrayFilter ) можно найти здесь: http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347

3 голосов
/ 24 июня 2010

Один из подходов заключается в создании BufferedImage путем записи в растр, как вы делаете сейчас.Если у вас есть BufferedImage, вы можете преобразовать его в TYPE_BYTE_GRAY, используя filter() метод ColorConvertOp, как показано на этом1014 * пример .

...