一个关于显示图片的问题!

时间:2022-03-24 17:35:55
大侠们,
    在程序中有一TImage控件读入了一张图片,这个图片比较大,我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,请问一下该怎么实现呀?分不够还可以再加的!请写出代码!

24 个解决方案

#1


用移动image的效果不是更简单?

#2


顶一下^_^

#3


移动image达不到预期的效果呀~~~

#4


是不是要读数据库的图片的?
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点

#5


我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,
是要拆分?要不用几个组件,设置显示的位置

#6


用重画的方法

#7


自已顶一下,怎么重画???

#8


用stream,指定它的position

#9


小弟初学,请说具体点好吗?最好写出代码!解决了问题点数全部送上!

#10


小弟这里又遇到一个问题,在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码,在Delphi中用TStrings的LoadFormFile就只能读取第一个这个十六进制编码以前的数据,这个十六进制编码和该文件以后的数据都没有读入!请问一下该怎么解决呀????请写出代码,问题点数另开贴送上!

#11


在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码
-------------
这只是形式上的十六进制,其实不是。

#12


StretchBlt

#13


用CopyRECT就搞定啦,先定义一个Image保存大图片,再定义 一个用来显示

#14


还是不太明白,请写一个实例代码好吗?自已顶上~

#15


不要急,等我睡一觉先:)

#16


TO:
  xzhifei(饭桶超人(抵制日货)) 

帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!

#17


bitblt &  sleep // ok ?

#18


刚写了个.
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image2: TImage;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
      destx, desty: integer);
    procedure clearScreen(color: TColor);
    procedure Fill;
  end;

var
  Form1             : TForm1;

  pDc               : TBitmap;          //当前;
  bDc               : TBitmap;          //缓冲;
  bbb               : boolean;          //当前目标;

  imageIndex        : integer;
implementation

{$R *.dfm}

procedure TForm1.Fill;
begin
  if bbb then
    Canvas.Draw(0, 0, pdc)
  else
    Canvas.Draw(0, 0, bdc);
  bbb := not bbb;
end;

procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
  destx, desty: integer);
begin
  if bbb then
    bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
      srccopy)
  else
    bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
      srccopy);
end;

procedure TForm1.clearScreen(color: TColor);
begin
  if bbb then
  begin
    pDc.Canvas.Brush.Color := clBlack;
    pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
  end
  else
  begin
    bDc.Canvas.Brush.Color := clBlack;
    bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not self.Showing then
    exit;
  clearScreen(clblack);
  drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
  inc(imageIndex, 1);
  if imageindex>=45 then imageindex:=0;
  fill;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  pdc := tbitmap.Create;
  bdc := tbitmap.Create;
  pdc.Width := clientwidth;
  pdc.Height := clientheight;
  pdc.PixelFormat := pf16bit;
  bdc.Width := clientwidth;
  bdc.Height := clientheight;
  bdc.PixelFormat := pf16bit;

  imageIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  pdc.free;
  bdc.free;
end;

end.

代码很简陋,就不写注解了

#19


谢谢 S.F.(吃青春饭的) 不过好像还是不行呀~运行时整个窗口都是黑色一片~~

#20


drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);

调整这个的参数;分别是获取x/y位置的w/h大小的图;

我给你发一个包也可以;留个email.

#21


太谢谢S.F.(吃青春饭的) 了。我的E_Mail是:newwhua@163.com
                                         2002106@qq.com

#22


自已顶上.....


等待 S.F.(吃青春饭的) 老兄中......

#23


已发送,请查收

#24


哈,已收到,谢谢S.F.(吃青春饭的)

#1


用移动image的效果不是更简单?

#2


顶一下^_^

#3


移动image达不到预期的效果呀~~~

#4


是不是要读数据库的图片的?
要改一个东西的
开始菜单的,borland delphi 的BDE Administrator 下面odbc下面将blod size 改大一点

#5


我需要每过一定的时间就显示这个图片的一部分,这样形成一个动画效果,
是要拆分?要不用几个组件,设置显示的位置

#6


用重画的方法

#7


自已顶一下,怎么重画???

#8


用stream,指定它的position

#9


小弟初学,请说具体点好吗?最好写出代码!解决了问题点数全部送上!

#10


小弟这里又遇到一个问题,在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码,在Delphi中用TStrings的LoadFormFile就只能读取第一个这个十六进制编码以前的数据,这个十六进制编码和该文件以后的数据都没有读入!请问一下该怎么解决呀????请写出代码,问题点数另开贴送上!

#11


在一个文本文件中存在一个或多个十六进制编码为“00 00 00 00 00 00”的编码
-------------
这只是形式上的十六进制,其实不是。

#12


StretchBlt

#13


用CopyRECT就搞定啦,先定义一个Image保存大图片,再定义 一个用来显示

#14


还是不太明白,请写一个实例代码好吗?自已顶上~

#15


不要急,等我睡一觉先:)

#16


TO:
  xzhifei(饭桶超人(抵制日货)) 

帅哥,睡醒了还是请你帮个忙吧!先谢谢了!!!

#17


bitblt &  sleep // ok ?

#18


刚写了个.
这个代码是模拟页切换(类似ddraw);可以实现无闪烁绘制图形;form为'屏幕',pdc为当前屏幕,bdc为缓冲2;初始化指定大小与窗体一样;在绘制的时候分别绘制这两个,可以看具体编写的过程;无论如何处理图形均是先绘制在pdc与bdc之上,而不是直接绘制窗体,再完成了绘制后直接draw到窗体上显示,这样不会发生闪烁现象,图象显示很平滑.你建个窗体,放个timer,放个image2(装个大图),把代码加进去运行看看.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image2: TImage;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
      destx, desty: integer);
    procedure clearScreen(color: TColor);
    procedure Fill;
  end;

var
  Form1             : TForm1;

  pDc               : TBitmap;          //当前;
  bDc               : TBitmap;          //缓冲;
  bbb               : boolean;          //当前目标;

  imageIndex        : integer;
implementation

{$R *.dfm}

procedure TForm1.Fill;
begin
  if bbb then
    Canvas.Draw(0, 0, pdc)
  else
    Canvas.Draw(0, 0, bdc);
  bbb := not bbb;
end;

procedure TForm1.DrawScreen(srcBmp: TBitmap; x, y, w, h: Integer;
  destx, desty: integer);
begin
  if bbb then
    bitblt(pDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
      srccopy)
  else
    bitblt(bDc.Canvas.Handle, destx, desty, w, h, srcBmp.Canvas.Handle, x, y,
      srccopy);
end;

procedure TForm1.clearScreen(color: TColor);
begin
  if bbb then
  begin
    pDc.Canvas.Brush.Color := clBlack;
    pDc.Canvas.FillRect(pDc.Canvas.ClipRect);
  end
  else
  begin
    bDc.Canvas.Brush.Color := clBlack;
    bDc.Canvas.FillRect(bDc.Canvas.ClipRect);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not self.Showing then
    exit;
  clearScreen(clblack);
  drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);
  inc(imageIndex, 1);
  if imageindex>=45 then imageindex:=0;
  fill;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  pdc := tbitmap.Create;
  bdc := tbitmap.Create;
  pdc.Width := clientwidth;
  pdc.Height := clientheight;
  pdc.PixelFormat := pf16bit;
  bdc.Width := clientwidth;
  bdc.Height := clientheight;
  bdc.PixelFormat := pf16bit;

  imageIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  pdc.free;
  bdc.free;
end;

end.

代码很简陋,就不写注解了

#19


谢谢 S.F.(吃青春饭的) 不过好像还是不行呀~运行时整个窗口都是黑色一片~~

#20


drawScreen(image2.Picture.Bitmap, 100, 100, 45 , 60, imageIndex, 0);

调整这个的参数;分别是获取x/y位置的w/h大小的图;

我给你发一个包也可以;留个email.

#21


太谢谢S.F.(吃青春饭的) 了。我的E_Mail是:newwhua@163.com
                                         2002106@qq.com

#22


自已顶上.....


等待 S.F.(吃青春饭的) 老兄中......

#23


已发送,请查收

#24


哈,已收到,谢谢S.F.(吃青春饭的)