2011-12-28 57 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

相关问题