2009-11-13 42 views
3

在TBitmap對象上繪製半透明PNG圖像時出現問題。TBitmap在Delphi 2009中繪製透明圖像

如果TBitmap的HandleType設置爲bmDDB,則畫布被繪製爲透明。 但問題是它不適用於各種機器(例如:蘋果電腦上的Windows)。

當TBitmap的HandleType屬性設置爲bmDIB時,畫布背景被繪製爲白色。

bmp.HandleType := bmDIB; 

我試着將刷子樣式設置爲bsClear。但它以黑色繪製透明像素。

如何繪製保留其透明度和平滑曲面邊緣的圖像。

謝謝 Pavan。

回答

4

這當然是可以畫一個bmDIB位圖與透明背景的畫布:

procedure TForm1.FormPaint(Sender: TObject); 
var 
    Bmp: TBitmap; 
begin 
    Bmp := TBitmap.Create; 
    try 
    Bmp.PixelFormat := pf32bit; 
    Bmp.HandleType := bmDIB; 
    Bmp.Width := 700; 
    Bmp.Height := 400; 
    Bmp.Transparent := TRUE; 
    Bmp.TransparentColor := clMaroon; 

    with Bmp.Canvas do begin 
     Brush.Color := clMaroon; 
     FillRect(Rect(0, 0, Bmp.Width, Bmp.Height)); 

     Brush.Color := clBlue; 
     FillRect(Rect(42, 42, 200, 300)); 
    end; 

    Canvas.Draw(12, 12, Bmp); 
    finally 
    Bmp.Free; 
    end; 
end; 

注意,整個位圖與顏色設置爲TransparentColor第一填補。

但是對於更多的控制和速度,您應該研究一個不依賴於GDI(涉及顯卡和驅動程序功能)的解決方案,如Graphics32

+2

+ 1 for Graphics32 – Runner 2009-11-13 10:41:52

+0

試圖加載一個在邊緣有半透明像素的png圖像。使用上述過程,那些半透明像素被繪製成黑色。 – Pavan 2009-11-13 13:04:00

+1

@Pavan:透明<>半透明。如果您需要每個像素的alpha值,您應該使用完全支持它的圖形格式,或者查看Graphics32。或者進入GDI +。 AFAIK並不能保證你可以用GDI做你想做的事情,並確保它可以在* all *系統上運行。 – mghie 2009-11-13 13:23:05