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の「再利用」に問題があったコードでは、シーケンスは次のとおり
でした。
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チャネルが失われました。