[英]Is there a faster way of iterating through pixels of BufferedImage in java?
我有一個程序,需要經常逐個像素地瀏覽BufferedImages。 通常情況下,效率不足以讓我關心,但我確實希望可以得到每一毫秒。
舉例來說,現在,我發現隔離圖像中紅色通道的最快方法如下:
int[] rgb = image.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
for(int i = 0; i < rgb.length; i ++)
rgb[i] = rgb[i] & 0xFFFF0000;
image.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0, img.getWidth());
這意味着它將遍歷圖像一次來填充數組,再次應用濾鏡,最后第三次更新像素。 同時考慮到任何alpha通道為0的像素都被完全清零,它也必須至少經過一次。
我也嘗試在更傳統的嵌套for循環中使用getRGB()和setRGB()的單個像素版本,但這甚至更慢(盡管它可能沒有RAM,因為它沒有int [])。
這是Iterable類型解決的問題,但是我找不到將這種原理應用於圖像的任何方法。 對於這個項目,如果可以,我可以接受並非“最佳實踐”的全部駭客。
有什么方法可以迭代緩沖圖像的原始數據嗎?
最快的方法是訪問DataBuffer,因為您可以直接訪問pixel值,但是必須處理所有情況/類型:
public void Test(BufferedImage img)
{
switch ( img.getType() )
{
case BufferedImage.TYPE_BYTE_GRAY :
case BufferedImage.TYPE_3BYTE_BGR :
byte[] bufferbyte = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ;
//...
break ;
case BufferedImage.TYPE_USHORT_GRAY :
short[] buffershort = ((DataBuffer)img.getRaster().getDataBuffer()).getData() ;
//...
break ;
//Other cases
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.