1

FMX.Type.TBitmapDelphi-XE2 Update3FireMonkeyHDアプリケーションにPNG画像をロードしています。ロードされたPNG画像にアルファチャンネルがあるかどうかを確認するにはどうすればよいですか?

現在、アルファチャネルを使用して画像をロードすると、Bitmap.Scanline[Y]^[X]$AABBGGRRの形式でアルファ情報が含まれます。ただし、アルファなしのPNG画像をロードすると、明確なアルファ付きの画像と同じように、上記のレコードには$ 00BBGGRRエントリ(AA = 0)しかありません。したがって、問題-アルファが完全に透明なRGBA画像であるか、RGB画像であるかを判断する方法(この場合、アルファを完全に不透明にするために処理します)。注:すべてのピクセルをチェックすることはオプションではありません。

FMX TBitmapにはPixelFormatプロパティがなく、HasAlphaフラグも見つかりませんでした。

4

2 に答える 2

2

あなたはおそらくこれを気に入らないでしょう。

FMXのすべてのビットマップは32ビットであり、OSのコード(すべて32ビット)を使用してロードおよび保存されます。

したがって、本当の答えは、すべてのビットマップにアルファチャネルがあるということです。

しかし、本当に知りたいのは、ビットマップがアルファチャネルを使用しているかどうかです。これを判断する唯一の方法は、すべてのピクセルを反復処理して、<>255のアルファチャネルがあるかどうかを確認することです。

私は次のようなものをお勧めします(テストされていません):

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;
于 2012-01-02T22:53:47.370 に答える
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番目のバイト(または16進数として0x19)の3番目のビットに格納されます。

ただし、この関数は、単純化のために有効なファイル構造をチェックしません。したがって、PNG画像がTBitmapにロードされた後に使用する必要があります。その後、透明度をサポートするためのブール値を、たとえばTagTImageのプロパティ(または必要な場所)に保存できます。

于 2017-09-21T22:56:03.193 に答える