gpt4 book ai didi

image - Delphi PNG图像在移动/加载图像时显示矩形BUG

转载 作者:行者123 更新时间:2023-12-03 15:01:19 31 4
gpt4 key购买 nike

加载图像或移动图像时,png 图像周围会出现奇怪的矩形。

矩形在 24 位 PNG 或 jpg 中很少出现,但在 32 位 PNG 中就会出现问题。有谁知道是什么原因造成的? PNG 是在 Photoshop 中创建的。我也尝试过 gimp 但同样的问题。

24BitPNG-BetterResult

32BitPNG-BAD-BUG

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, pngimage, jpeg, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
png:TPngImage;
rs:TResourceStream;
ms:TMemoryStream;

implementation

{$R *.dfm}
{$R FB.RES}

procedure TForm1.Button1Click(Sender: TObject);
begin
rs:=TResourceStream.Create(hInstance,'24bitpng',RT_RCDATA);
png:=TPngImage.Create;
png.LoadFromStream(rs);
Image1.Picture.Graphic:=png;
rs.Free;
Label1.Caption:=Button1.Caption;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
rs:=TResourceStream.Create(hInstance,'32bitpng',RT_RCDATA);
png:=TPngImage.Create;
png.LoadFromStream(rs);
Image1.Picture.Graphic:=png;
rs.Free;
Label1.Caption:=Button2.Caption;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Timer1.Enabled:=True;
Image2.Left:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True; //This did the job, now no flickering around

Form1.BorderStyle:=bsnone;
Form1.Position:=poScreenCenter;
Label1.Caption:=Button1.Caption;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor:=crSizeAll;
ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;
Screen.Cursor:=crDefault;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if image2.Left<300 then
image2.Left:=image2.Left+2
else
Timer1.Enabled:=False;

end;

end.

这个我试过了。

...
protected
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

...

begin

procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;


end.

最佳答案

您的基本方法有缺陷。您不应该使用 TImage 控件来显示动画。这些控件设计用于显示静态图像。作为一个粗略的解决方案,您可以为表单启用双缓冲。通过将 DoubleBuffered 设置为 True 来实现此目的。这具有可能不希望的副作用。无论如何,整个方法应该让你感到恶心。

正确的方法是将整个图像渲染到绘图表面。在理想的情况下,您将拥有一个单一窗口控件,该控件可响应 WM_ERASEBKGND 渲染背景,然后响应 WM_PAINT 绘制动态内容。这就是我要做的。

作为一个更简单的中途之家,您可以使用 TPaintBox 甚至表单的 OnPaint 处理程序。这些方法会让您响应 WM_PAINT 绘制整个图像。那应该没有闪烁。如果没有,那么您可能需要诉诸于绘制离屏位图,然后将其传输到绘制表面。

关于image - Delphi PNG图像在移动/加载图像时显示矩形BUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326567/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com