2017-10-11 3 views
0

イメージはオリーブ透明色のbmpです。その結果TBitmapgraphisc32の透過イメージのサイズを正しく変更する方法は?

type 
    TForm1 = class(TForm) 
    ImageList: TImageList; // 
    MainMenu: TMainMenu; //Standart parameters 
    MenuItem: TMenuItem; // 
    procedure FormCreate(Sender: TObject); 
... 
function ScaleImage(aImage: TBitmap): TBitmap; 
var 
    Src, Dst: TBitmap32; 
    R: TKernelResampler;  
begin 
    Src := TBitmap32.Create; 
    Src.SetSize(16, 16); 
    Src.DrawMode := dmTransparent; 
    Src.OuterColor := clOlive; 
    Src.Assign(aImage); 
    Dst := TBitmap32.Create; 
    Dst.SetSize(24,24); 
    R := TKernelResampler.Create(Src); 
    R.Kernel := TLanczosKernel.Create; 
    Dst.DrawMode := dmTransparent; 
    Dst.OuterColor := clOlive; 
    Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src); 
    Result.Assign(Dst); 
end; 

procedure AddImage; 
var 
    Image: TBitmap; 
begin 
    Image := TBitmap.Create; 
    Image.LoadFromResourceName(hInstance, 'BMPNOFILTER'); 
    ImageList.AddMasked(ScaleImage(Image), clOlive);  
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    AddImage; 
    MainMenu.Images := ImageList; 
    MenuItem.ImageIndex := 0; 
end; 

Imagelist.AddMasked(Result, clOlive);TImageListをイメージリストするが、画像はオリーブ色で描画されます。 オリーブ色(aImage.transparent := True;)を使用せずに画像のサイズを変更しようとすると、Src背景が黒になり、透明色として使用され、OuterColorの値は無視されます。

試しclOlive32をOuterColorとしました。結果:

私が使用したコード:

var 
R: TKernelResampler; 
Src, Dst: TBitmap32; 
fImage: TBitmap; 
OriginalImage, TranOriginalImage: TImage //16x16 
SrcImage, DstImage, ResultImage: TImage //24x24 
... 
fImage := TBitmap.Create; 
fImage.LoadFromResourceName(hInstance, 'BMPNOFILTER'); 
OriginalImage.Picture.Bitmap := fImage; 
fImage.Transparent := True; 
fImage.TransparentColor := clOlive; 
TranOriginalImage.Picture.Bitmap := fImage; 
TranOriginalImage.Transparent := True; 
Src := TBitmap32.Create; 
Src.SetSize(16, 16); 
Src.OuterColor := clOlive32; 
Src.Assign(fImage); 
Src.DrawMode := dmTransparent; 
Src.OuterColor := clOlive32; 
SrcImage.Picture.Bitmap.Assign(Src); 
Dst := TBitmap32.Create; 
Dst.SetSize(24, 24); 
Dst.DrawMode := dmTransparent; 
Dst.OuterColor := clOlive32; 
R := TKernelResampler.Create(Src); 
R.Kernel := TLanczosKernel.Create; 
Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src); 
DstImage.Picture.Bitmap.Assign(Dst); 
ResultImage.Picture.Bitmap.Assign(Dst); 
ResultImage.Transparent := True; 
+0

実際のコードを表示できますか?たとえば、Src、Dst、aImageがパラメータ、グローバル、ローカルまたはオブジェクトメンバであるかどうかを判断することはできません。あなたの問題を示す小さな、コンパイル可能なプログラムを私たちに教えてください。 – Dsm

+0

私はコードを更新しました。 – Andrey

+0

[この質問](https://stackoverflow.com/a/32269633/5043424)でお手伝いできますか? –

答えて

0

あなたはオリーブ色にGraphics32のペンダントを使用する必要があります。これはclOliveの代わりにclOlive32です。追加と一緒に

aImage.transparent := True; 

これは多かれ少なかれトリックを行う必要があります。

最終的には、リサンプラは赤を赤として保存しないかもしれませんが、実際の再サンプリングを使用してエッジ間の色を取得するため、いくつかの不具合が発生します。

+0

'Src.OuterColor'と' Dst.OuterColor'にclOlive32を設定し、 'Src.Assign(aImage)'の前に 'Image.Transparent:= True'を設定してください。私はメインの投稿に新しい結果を追加します。 – Andrey

+0

結果をメイン画像に追加しました。問題は元の画像のピクセル形式にあると私は思う。その値pf4bitをロードした後。元の画像をpf32bitで保存しようとしましたが、すべての画像にオリーブの背景がありました。 – Andrey

関連する問題