2015-08-28 149 views
3

我有一個PNG,我想加載TBitmap32。透明PNG到TBitmap32

後我打開我所說的位圖:

Bitmap.DrawMode := dmTransparent; 
Bitmap.OuterColor := Bitmap.PixelS[0,0]; 

但後來所有的白色像素是透明的。我怎樣才能做到這一點只是爲了PNG圖像的透明部分?這是我的圖像,以標準方式指示的圖像邊緣周圍的alpha透明度。

enter image description here

這是實際的圖像:

enter image description here

+0

你爲什麼要設置'DrawMode'和'OuterColor'?這聽起來像你得到了你所要求的。換句話說,「TBitmap32」肯定會尊重圖片的Alpha透明度。 –

回答

4

似乎TBitmap32可能失去阿爾法信息,同時加載PNG圖像

您可以考慮使用一個文件摘錄如下,其中的GR32_PNG

。 。 。
由於讀寫使用中間TBitmap對象,因此需要不必要的額外內存來存儲位圖數據。另外,通過將數據轉換爲TBitmap格式和從其轉換數據,附加信息可能會丟失或處理錯誤。
。 。 。
要使用Graphics32本地處理PNG文件,可以使用第三方庫GR32 PNG庫。該庫使用本地PNG格式作爲中間存儲。通過分配一個TBitmap32對象,數據在運行中被編碼/解碼到/從PNG中。使用這個庫也可以訪問存儲在PNG文件中的附加信息。

Graphics32


單位的代碼使用示例可以如下改變,以滿足您的需求:

var 
    AlphaChannelUsed: Boolean; 
begin 
    LoadBitmap32FromPNG(Bitmap, <your path to the PNG image>, AlphaChannelUsed); 

    if AlphaChannelUsed then 
    Bitmap.DrawMode := dmBlend 
    else 
    Bitmap.DrawMode := dmOpaque; 
end; 

BitmapTBitmap32對象。


一個TImage32組件內的形式加載的結果圖像:

enter image description here

1

的問題可能是PNG已經錯誤地轉換到TBitmap32,失去在運輸途中的透明度信息。這是調色板PNG圖像的常見情況。否則,您不必使用「Bitmap.DrawMode:= dmTransparent」和「OuterColor」。如果來自PNG的透明信息將正確傳輸到TBitmpa32,則DrawMode:= dmBlend可以工作,而不需要設置OuterColor。

最重要的是您如何將PNG加載到TBitmap32中。來自Vcl.Imaging的TPngImage。pngimage單元(在Delphi XE2和更高版本中實現)可以在位圖上透明地繪製,保留位圖上的內容,使用PNG alpha圖層組合顏色等,但不能輕鬆轉換各種PNG透明度格式(包括調色板)轉換爲TBitmap32每個像素的alpha分量。一旦TPngImage繪製圖像,您將得到每個像素的組合RGB,但alpha分量不會傳輸到目標位圖。

有跡象表明,嘗試將PNG加載與透明度TBitmap32提供幫助程序,但他們也有缺點:

(1)從http://graphics32.org/wiki/FAQ/ImageFormatRelated 「LoadPNGintoBitmap32」 - 它適用透明度的兩倍,因此與圖像除0或255以外的Alpha值與其他軟件(在玻璃效果的半透明圖像上最明顯)看起來不同。此代碼首先將alpha應用於RGB,然後將alpha設置爲單獨的圖層,因此當繪製時,alpha將再次應用。你可以在這裏找到關於這個問題的更多信息:Delphi, GR32 + PngObject: converting to Bitmap32 doesn't work as expected 。除此之外,它不會正確地將調色板圖像的透明度轉換爲TBitmap32的alpha層。他們手動爲輸出位圖(渲染爲RGB)的某個顏色的像素手動設置alpha透明度,而不是在渲染爲RGB之前執行此操作,因此當所有白色像素都透明時,實際透明度會丟失,因爲您的示例圖像會丟失實際透明度。 (2)來自gr32ex庫的「LoadBitmap32FromPNG」:https://code.google.com/archive/p/gr32ex/ - 與(1)相同的算法的稍微不同的實現,並且與(1)具有相同的問題。

因此,解決方案是:

  1. 不要使用TBitmap32;使用Vcl.Imaging.pngimage.TPngImage直接在目標位圖(屏幕等)上繪製 - 這是與各種PNG格式正確處理的最兼容的方式。
  2. 使用幫助路由將透明度信息從Vcl.Imaging.pngimage.TPngImage傳輸到TBitmap32。
  3. 使用GR32 PNG庫https://sourceforge.net/projects/gr32pnglibrary/

既然你現在在這個問題上的所有信息,你可以選擇適合您的解決方案。