如何在graphisc32中正确调整透明图像的大小?
问题描述:
图像是橄榄色透明颜色bmp。如何在graphisc32中正确调整透明图像的大小?
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;
该结果TBitmap
后的ImageList TImageList
与Imagelist.AddMasked(Result, clOlive);
但图像绘制用橄榄油颜色。 试图调整图像没有橄榄色的颜色(aImage.transparent := True;
),分配后Src背景变成黑色并将其用作透明色,忽略OuterColor
值。
Tryed clOlive32 as 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;
答
您应该使用Graphics32挂件橄榄颜色。这是clOlive32而不是clOlive。随着加入
aImage.transparent := True;
这应该做的伎俩或多或少。
最终你会看到一些小故障,因为重采样器可能不会将红色保留为红色,而是使用实际重采样来获得边缘之间的颜色。
你能显示真实的代码吗?例如,我们不能说出Src,Dst,aImage是参数,全局变量,本地变量还是对象成员。请给我们一个小的,可编辑的程序来显示你的问题。 – Dsm
我更新了代码。 – Andrey
可以[这个问题](https://stackoverflow.com/a/32269633/5043424)帮助你吗? –