【发布时间】:2014-02-14 22:08:15
【问题描述】:
我有一个简单的TForm,名为Form1; Image1 是一个 TImage 加载了一个 PNGImage 和一个 Button1 TButton 来测试东西。它成功地实现了AlphaBlend Image1 的图片的方法。代码如下:
procedure SetPNGOpacity(Image : TImage; Alpha: Byte);
var
Bmp: TBitmap;
BlendFn: TBlendFunction;
PNG: TPNGImage;
begin
Png := TPngImage.Create;
Png.Assign(TPNGImage(Image.Picture.Graphic));
Bmp := TBitmap.Create;
Bmp.Assign(Png);
Image.Picture.Bitmap.PixelFormat := pf32bit;
Image.Picture.Bitmap.AlphaFormat := afPremultiplied;
Image.Picture.Bitmap.Canvas.Brush.Color := clBlack;
Image.Picture.Bitmap.SetSize(Png.Width, Png.Height);
BlendFn.BlendOp := AC_SRC_OVER;
BlendFn.BlendFlags := 0;
BlendFn.SourceConstantAlpha := Alpha;
BlendFn.AlphaFormat := AC_SRC_ALPHA;
winapi.windows.AlphaBlend(
Image.Picture.Bitmap.Canvas.Handle,
0, 0, Image.Picture.Bitmap.Width,
Image.Picture.Bitmap.Height,
Bmp.Canvas.Handle,
0, 0, Bmp.Width,
Bmp.Height,
BlendFn
);
Bmp.FreeImage;
Bmp.Free;
Png.Free;
end;
如果我简单地在 Button1 onClick 上调用它,图像就会被混合。
无论如何,我的目标是淡入/淡出 Image1;或者换句话说,转到不透明度 0 到 255 和相反的方式。我能看到的是上面的SetPNGOpacity 停止在循环内工作。
我自然地尝试使用以下代码设置应用程序繁忙:
procedure TForm1.Button1Click(Sender: TObject);
var
I : integer;
begin
I := 255;
while I > 0 do
begin
I := I - 1;
sleep(125);
SetPNGOpacity(Image2, I);
// MessageBeep(0);
end;
end;
我只是希望在一个非活动窗口等待几秒钟,然后 Image1 应该会完全消失。什么没有发生。所以我尝试了一个简单的线程来淡出,如下所述:
TBar = class(TThread)
private
I : integer;
public
procedure execute; override;
procedure Test;
constructor Create;
end;
implementation
constructor TBar.Create;
begin
inherited Create(false);
I := 255;
end;
procedure TBar.execute;
begin
while I > 0 do
begin
I := I - 1;
sleep(250);
synchronize(Test);
// MessageBeep(0);
end;
end;
procedure TBar.Test;
begin
SetPNGOpacity(Form1.Image2, I);
end;
然后这样称呼它:
procedure TForm1.Button1Click(Sender: TObject);
var
Foo : TBar;
begin
Foo := TBar.Create;
end;
同样,什么也没有发生。所以我再次需要你们。有人对此有想法吗?难道我做错了什么?有谁知道一些有用的阅读;甚至是一段有用的代码?注意:我真的希望它使用TImage 甚至是TBitmap,我可以在TImage 中“提取/存储”它。
提前致谢。
【问题讨论】:
-
你可以把后面的讨论抛在脑后……你是这里唯一抱怨“正确方式”的人。只是为了澄清,我正在做同一个项目,有同样的限制。我会尽量保持灵活。拜托,别再把我当叛逆者了。但无论如何,你所说的“混合”是什么意思?
-
@David 很少有人称其为“正确”,但我们不要介意这一点。您已经知道为什么很难使用
Canvas.Draw不是吗?我不会丢弃它。我只是问你。关于我所知道的差异。但我试图将它“抽象”(不知道它是否是更好的词)给我的用户。他不需要知道,特别是,这些事情。 @LU 这个例程不适用于PNGImage,是吗? -
只加载一次图像。你为什么要一遍又一遍地加载它?当您需要绘制新的不透明度时,请执行此操作。保留原图。在其他地方绘制混合图像。我已经告诉你一个星期了。
-
@Guill,也许不是,但用于淡化效果的技术也可以在这里应用。你有一个图像、一个颜料盒和一个计时器。绘画在paintbox
OnPaint事件中完成,计时器改变状态并调用paintbox.invalidate。
标签: delphi delphi-xe3