[英]How to check if the PNG image loaded into FMX.TBitmap has an alpha channel?
我加載PNG圖像到FMX.Type.TBitmap
在德爾福XE2 UPDATE3 FireMonkey HD應用程序。 如何檢查加載的PNG圖像是否具有Alpha通道?
目前,如果我加載帶有alpha通道的圖像,它在$ AABBGGRR形式的Bitmap.Scanline[Y]^[X]
中有alpha信息。 但是,如果我加載沒有alpha的PNG圖像,則所述記錄只有$ 00BBGGRR條目(AA = 0),就像具有清晰alpha的圖像一樣。 因此問題 - 如何確定它是否是具有完全透明的alpha的RGBA圖像,或者它是RGB圖像(在這種情況下,我將處理它以使alpha完全不透明)。 注意:無法檢查所有像素。
FMX TBitmap沒有PixelFormat
屬性,也沒有找到HasAlpha
標志。
以下功能檢查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;
因此它存儲在第3個字節中的第26個字節(或0x19為十六進制)中。
但是,出於簡化原因,此函數不檢查有效的文件結構。 所以它應該在PNG圖像加載到TBitmap之后使用,然后它的透明支持的布爾值可以存儲在例如TImage的Tag
屬性中(或者你想要的任何地方)。
你可能不會喜歡這個。
FMX中的所有位圖都是32位,它們使用來自OS的代碼加載和保存,這些代碼都是32位的。
所以,真正的答案是所有位圖都有一個alpha通道。
但是,你真正想知道的是位圖是否使用了alpha通道,而告訴它的唯一方法就是迭代每個像素並查看是否有任何<> 255的alpha通道。
我會推薦類似以下內容(未經測試):
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.