В некотором Java-коде, работающем в Windows, я читаю несколько больших блоков данных RGB с диска и хочу отобразить их на экране как можно быстрее.Данные RGB составляют 8 бит на канал без альфа.В настоящее время у меня есть код, подобный следующему, для создания BufferedImage.
BufferedImage getBufferedImage(File file, int width, int height) {
byte[] rgbData = readRGBFromFile(file);
WritableRaster raster = Raster.createInterleavedRaster(
rgbData, width, height,
width * 3, // scanlineStride
3, // pixelStride
new int[]{0, 1, 2}, // bandOffsets
null);
ColorModel colorModel = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_sRGB),
new int[]{8, 8, 8}, // bits
false, // hasAlpha
false, // isPreMultiplied
ComponentColorModel.OPAQUE,
DataBuffer.TYPE_BYTE);
return new BufferedImage(colorModel, raster, false, null);
}
Проблема в том, что производительность рендеринга на экран довольно медленная.Около 250 - 300 мсЯ читал, что для лучшей производительности вы должны отобразить в BufferedImage, который совместим с экраном.Чтобы сделать это, я передаю буферизованное изображение, возвращенное вышеуказанным методом, в метод, подобный следующему.
BufferedImage createCompatibleImage(BufferedImage image)
{
GraphicsConfiguration gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
BufferedImage newImage = gc.createCompatibleImage(
image.getWidth(),
image.getHeight(),
Transparency.TRANSLUCENT);
Graphics2D g = newImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return newImage;
}
Этот метод по существу преобразует его из RGB в ARGB в Windows, и он действительно ускоряет отображение, но этометод занимает ~ 300 мс для блока данных 1600 x 1200 RGB.Так что теперь я в основном изменил снижение производительности задачи рисования на проблему конвертации.
300 мс - это примерно то же время, которое требуется для загрузки данных RGB с диска.Я думаю, я мог бы сделать что-то быстрее.
Есть ли лучший способ сделать преобразование?Или это поможет, если я изменю данные RGB и сам добавлю альфа-канал заранее?Если так, то как бы выглядел мой Raster и ColorModel.Кроме того, поскольку мои RGB-данные не содержат прозрачности, могу ли я получить какие-либо улучшения производительности, используя предварительно умноженную альфу или что-то в этом роде?
Извините, но я немного растерялся из-за этой ColorModel, Raster.
Спасибо!