TBitmap32 にロードしたい png があります。
ビットマップをロードした後、次のように呼び出します。
Bitmap.DrawMode := dmTransparent;
Bitmap.OuterColor := Bitmap.PixelS[0,0];
ただし、すべての白いピクセルは透明です。PNG画像の透明部分だけをどうすればいいですか?これは、標準的な方法で示されている画像の端の周りにアルファ透明度がある私の画像です。
そして、これが実際の画像です:
TBitmap32 にロードしたい png があります。
ビットマップをロードした後、次のように呼び出します。
Bitmap.DrawMode := dmTransparent;
Bitmap.OuterColor := Bitmap.PixelS[0,0];
ただし、すべての白いピクセルは透明です。PNG画像の透明部分だけをどうすればいいですか?これは、標準的な方法で示されている画像の端の周りにアルファ透明度がある私の画像です。
そして、これが実際の画像です:
PNG が TBitmap32 に誤って変換され、転送中に透明度情報が失われたことが問題である可能性があります。これは、パレット化された PNG 画像の一般的なケースです。そうでなければ、「Bitmap.DrawMode := dmTransparent」と「OuterColor」を使用する必要はありません。PNG からの透過情報が TBitmpa32 に正しく転送されていれば、OuterColor を設定しなくても DrawMode := dmBlend が機能していたはずです。
最も重要なのは、PNG を TBitmap32 にどのようにロードしたかです。Vcl.Imaging.pngimage ユニット (Delphi XE2 以降で実装) の TPngImage は、ビットマップ上に透過的に描画したり、そのビットマップ上にあったものを保持したり、PNG アルファ レイヤーを使用して色を組み合わせたりすることができますが、さまざまな画像を簡単に変換することはできません。 TBitmap32 の各ピクセルのアルファ コンポーネントへの PNG 透明度 (パレットを含む) のフォーマット。TPngImage が画像を描画すると、各ピクセルの結合された RGB が得られますが、アルファ コンポーネントはターゲット ビットマップに転送されません。
PNG を透明な TBitmap32 に読み込もうとするヘルパー ルーチンがありますが、欠点があります。
(1) http://graphics32.org/wiki/FAQ/ImageFormatRelatedの「LoadPNGintoBitmap32」 - 透明度を 2 回適用するため、0 または 255 以外のアルファ値を持つ画像は、他のソフトウェアとは異なって見えます (半透明で最も顕著です)。ガラス効果のある画像)。このコードは、最初にアルファを RGB に適用し、次にアルファを別のレイヤーとして設定するため、ペイントするとアルファが再度適用されます。この問題の詳細については、Delphi、GR32 + PngObject: Converting to Bitmap32 not work as expected を参照してください。 . それに加えて、透明度をパレット イメージから TBitmap32 のアルファ レイヤーに正しく変換しません。RGB にレンダリングする前にそれを行うのではなく、出力ビットマップ (RGB にレンダリング) の特定の色のピクセルのアルファ透明度を手動で設定するため、すべての白いピクセルが透明な場合、実際の透明度はサンプル イメージのように失われます。
(2) gr32ex ライブラリの「LoadBitmap32FromPNG」: https://code.google.com/archive/p/gr32ex/ - (1) と同じアルゴリズムのわずかに異なる実装で、(1) と同じ問題があります。
したがって、解決策は次のとおりです。
この問題に関するすべての情報が得られたので、適切な解決策を選択できます。