2014-02-27 47 views
1

我試圖優化Java中的渲染引擎,以便不繪製被其前面繪製的「實體」子對象遮蓋的對象,即父級被其子級遮擋。檢測BufferedImage是否包含透明像素

我想知道如果從文件加載的任意BufferedImage包含任何透明像素 - 因爲這會影響我的遮擋測試。

我發現我可以使用BufferedImage.getColorModel()。hasAlpha()來查找圖像是否支持alpha,但是在這種情況下,它不會告訴我它是否包含非不透明像素。

我知道我可以遍歷所有的像素數據&測試每個人的alpha值&當我發現一個非不透明像素回來,但我想知道是否已經存在一些天然的,我可以使用,即設置一個標誌內部也許?或者比迭代像素少一點。

任何輸入讚賞,謝謝。

+4

很確定您需要遍歷每個像素並檢查Alpha值。抱歉。 – wattostudios

回答

1

不幸的是,你必須遍歷每個像素(直到找到一個透明像素)才能確定。

如果您不需要100%確定,您當然可以測試一些像素,您認爲透明度最有可能發生。

通過查看各種圖像,我認爲你會發現大多數具有透明部分的圖像都包含邊緣的透明度。這種優化將有助於許多常見情況。

不幸的是,我不認爲在最常見的情況之一有一個優化,即顏色模型允許透明度,但實際上沒有透明像素的情況下......您確實需要在這種情況下測試每個像素,以確定地知道。

訪問在它的「本地表示」α值(通過Raster/DataBuffer/SampleModel班)將是比使用BufferedImage.getRGB(x, y)更快,屏蔽掉alpha值。

1

我敢肯定,你需要遍歷每個像素並檢查Alpha值。

我可以提供的最佳選擇是編寫讀取像素數據的自定義方法 - 即您自己的Raster。在這個類中,當您從源文件讀取像素數據到數據緩衝區時,您可以隨時檢查alpha值。當然,如果你使用內置的圖像閱讀課程,這並沒有太大的幫助,並且需要付出更多的努力。