Как использовать TYPE_BYTE_GRAY для эффективного создания буферизированного оттенка серого с использованием AWT
Мне нужно создать изображение в оттенках серого из данных в nio ShortBuffer. У меня есть функция, которая отображает данные в ShortBuffer в unsigned byte, но находится в 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);
}
ТИА
Нат
Ответы
Ответ 1
Один из подходов заключался бы в создании BufferedImage
путем записи на растр, как вы это делаете сейчас. Если у вас есть BufferedImage
, вы можете преобразовать его в TYPE_BYTE_GRAY
с помощью filter()
ColorConvertOp
, как показано в этом пример.
Ответ 2
При использовании 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().
Большой tuturial (включая инструкцию по использованию GrayFilter) можно найти здесь: http://www.tutorialized.com/tutorial/Convert-a-Color-Image-to-a-Gray-Scale-Image-in-Java/33347