簡體   English   中英

如何檢查加載到FMX.TBitmap的PNG圖像是否有alpha通道?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM