5

Delphi2006のTImageはPNGを完全にはサポートしていません。フォームにアルファ透明度の画像を表示するには、実行時に画像を読み込む必要があります。設計時にロードすることはできますが、PNGがDFMファイルに保存されていないため、存続しないと思います。最新のDelphiでは、これはすべて厄介なことだと確信していますが、現時点ではアップグレードできません。

とにかく、私は実行時にそれらをロードしていました:

Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;

PNGImageCollectionコンポーネントは、さまざまなサイズのすべてのPNGを保持し(これらは設計時に作成およびロードされます)、FormCreateイベントでそれぞれのTImageに割り当てます。

フォームで使用した後、これらの画像の1つを別の場所で再利用しようとして問題が発生するまで、これは問題なく機能しました。TPictureを割り当てる行為により、Assignの結果としてTPictureが空の画像に設定されていることがわかりました。これは、ルーチンTPicture.ForceTypeで発生していました。このルーチンは、AFAICTがFGraphicのタイプをチェックし、目的のタイプでない場合は、FGraphicを解放して、要求されたタイプの新しいインスタンスを作成します。

わかった。少しスクラッチした後、多分私は本当にこれを行うべきであることがわかります:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

これは、Assignが画像を覆い隠さなかったという点でトリックを行いましたが、画像は半透明のビットで不透明として表示されます。

Image1.Picture.Bitmap.Assignで割り当てられた場合のTImage

それ以外の:

Image1.Picture.Assignで割り当てられた場合のTImage

この画像でアルファ透明ビットを正しく表示するにはどうすればよいですか?(および補足の質問:Image1.Picture.Bitmap.Assignはそれを行う正しい方法ですか?)

コードをもう少し詳しく説明します。

TImageの「再利用」に問題があったコードでは、シーケンスは次のとおり
でした。

LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ; 

(PNGIMageは会社のロゴであり、LogoImage1はメインフォームにあります)。

印刷レポートヘッダー:

procedure PrintLogo (Report : TBaseReport) ;

var
    X1, Y1, LogoHeightMM    : Double ;

begin
with Report do
    begin
    LogoHeightMM  := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ;
    X1            := PageWidth - MarginRight - LogoWidthMM ;
    Y1            := SectionBottom - LogoHeightMM ;
    PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ;
    end ;
end ;

ロゴを印刷するルーチンが最初に呼び出されると、エラーなしで実行されますが、PrintBitmapRectの呼び出し後、LogoImage.Pictureはクリアされたままになります。次に印刷ヘッダールーチンが呼び出されると、画像の幅と高さがゼロであるため、CalcGraphicHeightの呼び出しは失敗します。

Picture.AssignをPicture.Bitmap.Assignに変更すると、ヘッダー印刷ルーチンのRTEが修正されますが、同じ「修正」をPNGから割り当てられた他の静止画像(上記の歯車など)に移植すると、aplhaチャネルが失われました。

4

1 に答える 1

5

コードの本当に関連する部分を示していません。特定のタイプを持つ原因となる画像をどのように再利用していますか。

TImage に TPngObject を割り当てると、画像のグラフィックは png オブジェクトを保持します。具体的にビットマップを要求した場合にのみ、そのグラフィックをビットマップ タイプに強制します。たとえば、これ、

  Bmp.Assign(Image1.Picture.Bitmap);

Image1 にビットマップ グラフィックを強制します。そのグラフィックが png オブジェクトの場合は解放されます。この間、

  Bmp.Assign(Image1.Picture.Graphic);

Image1 にビットマップ グラフィックを強制することはなく、png オブジェクトが割り当てを実行し、そこにとどまります。

Delphi のビットマップ (少なくとも最近のバージョンまで) はアルファ チャネルをサポートしていないためImage1.Picture.Bitmap.Assign(..、部分的に透明なイメージには使用しないでください。


ところで、画像内のグラフィックを再利用する代わりに、おそらくpng画像コレクション内の画像をソースとして使用できます..

于 2011-03-21T03:12:53.073 に答える