簡體   English   中英

有沒有一種更快的方法來遍歷Java中BufferedImage的像素?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM