4

D2009 では、イメージとイメージリストの PNG サポートが導入されています。

でも...

アルファ付きのpng画像を含む画像リストがあります。これらの 1 つを TImage を使用してフォームに配置したいと考えています。どうすればこれを行い、画像をうまく合成できますか?

私が直面している問題の例として、以下のコードは正しく機能せず、示されている効果を生み出します。

ImageList.GetBitmap(index, Image1.Picture.Bitmap);

代替テキスト
(出典:clip2net.com

もう少し説明するには:

フォームに Timage をドロップし、設計時に、Picture プロパティを使用してアルファ付きの PNG ファイルを読み込みます。フォーム上に完全な透明度で正しく合成されていることに注意してください。

ここで、設計時に、2 つ目の空の Timage を追加し、TImagelist を追加して、同じ PNG をイメージリストに追加します。TImageList の PNG を 2 番目の TImage に割り当てて、最初の TImage と同じように見せるにはどうすればよいですか?

4

6 に答える 6

4

私の調査によると、TImageList は画像を TBitmaps として保存するため、アルファ情報がストレージで失われ、TImageList の現在の実装では探しているものを実現できないことがわかりました。

アップデート:

もう少し実験して、以下のコードを使用すると、以下のコードで透過性を機能させることができます。

ImageList1.ColorDepth := cd32Bit;
Image2.Transparent := True;
Image2.Canvas.Pen.Style := psClear;
Image2.Canvas.Rectangle(0, 0, Image2.Width+1, Image2.Height+1);
ImageList1.Draw(Image2.Canvas, 0,0,0);

しかし、読み込まれた png ほどきれいには見えませんでした。

于 2009-02-16T20:04:14.750 に答える
2

[プロジェクト] -> [オプション] -> [アプリケーション] タブのタブで [ランタイム テーマを有効にする] をオンにします。

これにより、RAD Studio 2010 での問題が解決されました。

于 2010-09-09T19:06:31.830 に答える
1

私はこのディスカッションスレッドに出くわしました:

D2009 TImageList の透過 PNG

@Pekka Nyyssonen: ColorDepth を cd32Bit に、DrawingStyle を dsTransparent に設定するとうまくいきました。

私は自分でdelphi 2009にアクセスできないので、試していませんが...

于 2009-02-13T13:55:16.810 に答える
1

簡単なテストをしてみました。TImageList には、透明度のある PNG 画像が含まれています。次を使用して、2 番目の TImage で画像をレンダリングします。

imlImageList.Draw(img2.Canvas, 0, 0, 0);

私にとっての違いは、 img2.Transparent := true を設定することでした (コードではなくデザイナーを使用しました)。

于 2009-02-12T21:30:54.540 に答える
0

私の知る限り、これは達成できません。与えられた提案のいずれも、主要な要件である適切にアルファブレンドされた画像にはなりません。

おそらく、保護されたメソッドにアクセスできる TImageList から派生したクラスを定義することによって、何かが機能するようになる可能性があります。今のところ私の解決策は、サードパーティのカスタム ImageList コンポーネントを使用することです。

于 2009-02-19T17:48:49.410 に答える
0

イメージ リストに透明なイメージを追加するには、いくつかの方法があります。

AddMasked または InsertMasked を使用して、画像を追加し、色を透明色にタグ付けします。

procedure InsertMasked(Index: Integer; Image: TBitmap; MaskColor: TColor);
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;

Insert または Add を使用して、イメージとマスクを追加します。画像の白いピクセルのみが使用され、他のピクセルが透明な 2 色 (黒/白) の画像の場合のマスク。

function Add(Image, Mask: TBitmap): Integer;
procedure Insert(Index: Integer; Image, Mask: TBitmap);
于 2009-02-14T19:50:07.993 に答える