2011-12-28 56 views
1

我在Delphi-XE2 Update3 FireMonkey HD應用程序中將PNG圖像加載到FMX.Type.TBitmap中。如何檢查加載的PNG圖像是否具有Alpha通道?如何檢查加載到FMX.TBitmap的PNG圖像是否有alpha通道?

目前,如果我使用alpha通道加載圖像,它的形式爲$ AABBGGRR,其中包含Bitmap.Scanline[Y]^[X]中的alpha信息。但是,如果我加載不帶alpha的PNG圖像,則所述記錄僅具有$ 00BBGGRR條目(AA = 0),就像具有明確Alpha的圖像一樣。因此,問題 - 如何確定它是RGBA圖像與alpha完全透明或它是一個RGB圖像(在這種情況下,我會處理它,使alpha完全不透明)。注意:檢查所有像素不是一個選項。

FMX TBitmap沒有PixelFormat屬性,我也找不到HasAlpha標誌。

回答

2

你可能不會喜歡這個。

FMX中的所有位圖都是32位的,並且它們都是使用來自操作系統(全部是32位)的代碼加載和保存的。

所以,真正的答案是所有的位圖都有一個alpha通道。

但是,你真正想知道的是位圖是否使用alpha通道,唯一的辦法就是遍歷每個像素,看看是否有alpha通道,這是一個<> 255.

我會recommmend類似如下(未經測試):

function TBitmap.IsAlpha(Bitmap: TBitmap): Boolean; 
var 
    I, j: Integer; 
    Bits: PAlphaColorRecArray; 
begin 
    Bits := PAlphaColorRecArray(StartLine); 
    for j := 0 to Height - 1 do 
    for I := 0 to Width - 1 do 
    begin 
     if Bits[I + (j * Width)].A <> 255 then 
     begin 
     Result := True; 
     EXIT; 
     end; 
    end; 
    Result := False; 
end; 
+0

你說得對,我不喜歡這個解決方案,雖然我不得不使用它,但這正是我想避免的。因此,這個問題。 – Kromster 2012-01-03 19:17:18

+0

希望Embarcadero將在稍後的更新中解決此問題。同時我會使用這個解決方案。 – Kromster 2012-01-13 13:29:36

2

以下功能檢查,如果PNG文件具有透明度通道。這很容易,因爲主PNG頭部具有固定長度,並且數據信息塊IHDR必須是第一個出現的塊。

function PngHasAlphaLayer(f: String): Boolean; 
var 
    fs: TFileStream; 
    colorType: Byte; 
begin 
    fs := TFileStream.Create(f, fmOpenRead); 
    fs.Position := 25; 
    fs.Read(colorType, 1); 
    fs.Free; 
    Result := colorType and (1 shl 2) <> 0; 
end; 

所以它被存儲在第26個字節(或十六進制0x19),在第3位。

但是,出於簡單的原因,此函數不檢查有效的文件結構。所以應該在將PNG圖像加載到TBitmap之後使用它,然後將它的布爾值用於透明度支持e。 G。在TImage的Tag屬性中(或任何你想要的)。

+1

好主意,謝謝! ) – Kromster 2017-09-22 05:42:00

相關問題