2015-09-05 45 views
5

Java BufferedImage類有一長串名爲圖像類型的類變量,可用作BufferedImage構造函數的參數。如何決定使用哪種BufferedImage圖像類型?

但是,Java文檔對這些圖像類型的用途做了最小限度的說明,它將如何影響要創建的BufferedImage。

我的問題是:

  1. 圖像類型如何會影響到BufferedImage中產生的呢?它是否控制用於存儲各種顏色(紅色,綠色,藍色)的位數及其透明度?

  2. 我們應該使用哪種圖像類型,如果我們只是想創建

    • 不透明圖像
    • 透明圖像
    • 半透明圖像

我閱讀了Java Doc中的描述很多次,但只是無法弄清楚我們應該如何使用它。例如,這樣一句:

TYPE_INT_BGR

表示一個具有8位RGB顏色分量的圖像,對應於Windows或Solaris風格的BGR顏色模型,與顏色藍,綠,和紅色打包成整數像素。沒有阿爾法。該圖像有一個DirectColorModel。當具有非透明alpha的數據存儲在這種類型的圖像中時,必須將顏色數據調整爲非預乘形式,並丟棄alpha,如AlphaComposite文檔中所述。

+0

什麼是半透明圖像?它與透明圖像有什麼不同? –

+0

@AndyTurner我記得我讀過一些關於使圖像的一部分透明的地方,而半透明的是調整整個圖像的不透明度。例如,gif文件允許透明但不透明,而png文件支持兩者。這是一個可能需要使用不同圖像類型的示例。沒有? – user3437460

回答

6

除非有特定的要求(例如保存存儲器或保存計算或特定的本地像素格式)只是去與具有每通道8個比特,3個通道+阿爾法默認TYPE_INT_ARGB

在每個通道處理8位時跳過alpha通道不會影響圖像佔用的總內存,因爲在任何情況下,每個像素都將打包在int中,因此8位將被丟棄。

基本上你有:每像素

  • TYPE_INT_ARGB,4個字節的alpha通道
  • TYPE_INT_ARGB_PRE,每像素4個字節,和以前一樣,但顏色已經由像素保存計算的α相乘每像素
  • TYPE_INT_RGB,4個字節沒有alpha通道
  • TYPE_USHORT_555_RGBTYPE_USHORT_565_RGB,每像素2個字節,少得多的顏色,不需要使用它UNL ess你有內存限制

然後有所有相同種類的格式與交換渠道(例如, BGR,而不是RGB)。你應該選擇一個原生的平臺,以減少轉換。

+0

感謝您的快速回復。所以我可以使用'TYPE_InT_ARGB'來獲得不透明,透明和半透明的圖像,除非我有其他特殊需求,例如您提到的那樣? – user3437460

+0

是的,半透明圖像本身不是半透明的(除非所有像素都具有alpha)。您可以通過在目標幀緩衝區上使用alpha混合繪製圖像來獲得半透明效果。 – Jack

+0

只要圖像類型支持alpha通道,它就能夠支持透明度,我是否有權這麼說?這是我最後一個問題! :d – user3437460

相關問題