如何在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 TImageListImagelist.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; 
+0

你能显示真实的代码吗?例如,我们不能说出Src,Dst,aImage是参数,全局变量,本地变量还是对象成员。请给我们一个小的,可编辑的程序来显示你的问题。 – Dsm

+0

我更新了代码。 – Andrey

+0

可以[这个问题](https://stackoverflow.com/a/32269633/5043424)帮助你吗? –

您应该使用Graphics32挂件橄榄颜色。这是clOlive32而不是clOlive。随着加入

aImage.transparent := True; 

这应该做的伎俩或多或少。

最终你会看到一些小故障,因为重采样器可能不会将红色保留为红色,而是使用实际重采样来获得边缘之间的颜色。

+0

在Src.OuterColor和Dst.OuterColor上设置clOlive32,在Src.Assign(aImage)之前设置Image.Transparent:True。我将在主帖中添加新的结果。 – Andrey

+0

已添加图片以及主帖子的结果。我认为问题出现在原始图像的像素格式中。加载它的值pf4bit后。试图保存原始图像在pf32bit和所有图像橄榄色的背景。 – Andrey