首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查加载到FMX.TBitmap中的PNG图像是否有alpha通道?

如何检查加载到FMX.TBitmap中的PNG图像是否有alpha通道?
EN

Stack Overflow用户
提问于 2011-12-28 16:26:16
回答 2查看 2.1K关注 0票数 1

我将PNG图像加载到Delphi-XE2 Update3 FireMonkey HD应用程序的FMX.Type.TBitmap中。如何检查加载的PNG图像是否有alpha通道?

目前,如果我加载一个带有alpha通道的图像,它会以$AABBGGRR的形式在Bitmap.Scanline[Y]^[X]中包含alpha信息。然而,如果我加载没有alpha的PNG图像,那么上述记录只有$00BBGGRR条目(AA = 0),就像具有透明alpha的图像一样。因此问题来了--如何确定它是RGBA图像与alpha完全透明,还是它是RGB图像(在这种情况下,我将处理它使alpha完全不透明)。注意:检查所有像素不是一个选项。

FMX TBitmap没有PixelFormat属性,我也找不到HasAlpha标志。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-03 06:53:47

你可能不会喜欢这个。

FMX中的所有位图都是32位的,它们是使用操作系统中的代码加载和保存的,它们都是32位的。

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

但是,你真正想知道的是位图是否使用了alpha通道,唯一的方法是遍历每个像素,看看是否有一个alpha通道是<> 255。

我推荐下面这样的东西(未经测试):

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2017-09-22 06:56:03

下面的函数检查PNG文件是否有透明度通道。这很容易,因为主PNG报头具有固定的长度,并且数据信息块IHDR必须是第一个出现的块。

代码语言:javascript
复制
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之后使用,然后可以将其用于透明度支持的布尔值存储在例如TImage的Tag属性中(或您想要的任何位置)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8653521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档