在Windows上運行的某些Java代碼中,我正在從磁盤讀取一些大的RGB數據塊,並希望儘快將其顯示在屏幕上。 RGB數據每個通道8位,不含任何字母。目前我有如下代碼來創建BufferedImage。在BufferedImage中快速加載和繪製RGB數據
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×1200的RGB數據塊。所以現在我基本上把繪圖問題的性能問題轉化爲轉換問題。
300ms與從磁盤加載RGB數據所用的時間大致相同。我想我可以做得更快。
有沒有更好的方法可以做轉換?或者,如果我預先修改了RGB數據並添加了一個Alpha通道,它會有幫助嗎?如果是這樣,我的Raster和ColorModel會是什麼樣子。此外,由於我的RGB數據不包含透明度,我可以通過使用預乘alpha或其他東西來獲得任何性能改進?
對不起,有點在這個ColorModel,光柵的東西有點失落。
謝謝!
2意見建議:1)更改源文件中的'Compatabile' - >'Compatible'。 2)將您的答案標記爲「正確」。 – 2011-06-13 15:33:47
+1 ...我想提及的是,ColorModel的智能延遲確實減慢了一切(高達** 3在一些OS X版本**上的幅度,是的,超過1000倍的速度**!**),並提供基本上什麼都沒有(嚴肅地說,有多少專業的圖像/視頻處理編輯用Java編寫出來?這是正確的,零......)與直接使用* int [] *進行比較。這是*「zomg我們擁有物品,讓我們無緣無故地將所有東西過度包裝和包裝」*。 * int [] *對勝利進行原始操作:當速度是一個問題時,您必須這樣做。 – SyntaxT3rr0r 2011-06-13 16:07:00
是的,我的加速時間從300ms左右降到15ms以下。 – awinbra 2011-06-13 16:21:55