各位大虾:小弟在程序设计的时候遇到了一个问题:
是这样的:
有100副bmp格式的图片,每副图片有1M多大小,我现在需要通过程序实现这100副图片的连续
播放以达到动画的效果,而且目标计算机的配置非常底,显卡才6M多,内存是126的
我想请教各位高手:通过delphi怎样才能达到这个目的(最好能提供原代码) 现目前我只有100多分,我会全部拿出来!希望各位高手不要嫌分少,帮小弟这个忙
感激不尽!!!!
是这样的:
有100副bmp格式的图片,每副图片有1M多大小,我现在需要通过程序实现这100副图片的连续
播放以达到动画的效果,而且目标计算机的配置非常底,显卡才6M多,内存是126的
我想请教各位高手:通过delphi怎样才能达到这个目的(最好能提供原代码) 现目前我只有100多分,我会全部拿出来!希望各位高手不要嫌分少,帮小弟这个忙
感激不尽!!!!
---- 实 现 方 法 ---- 1. 推 拉 效 果 ---- 将 要 显 示 的 图 形 由 上、 下、 左、 右 各 方 向 拉 进 屏 幕 内 显 示, 同 时 将 屏 幕 上 原 来 的 图 形 覆 盖 掉。 下 面 以 上 拉 效 果 为 例 进 行 说 明。 首 先, 将 放 在 缓 存 图 形 的 第 一 行 像 素 搬 移 至 要 显 示 的 位 图 的 最 后 一 行; 然 后 将 缓 存 图 形 的 前 两 行 像 素, 依 序 搬 移 至 要 显 示 位 图 的 最 后 两 行 像 素; 最 后 搬 移 前 三 行、 前 四 行, 直 到 全 部 图 形 数 据 搬 完 为 止。 在 搬 移 的 过 程 中 即 可 看 到 显 示 的 位 图 由 下 而 上 浮 起, 达 到 上 拉 的 效 果。 ---- 程 序: procedure TForm1.Button1Click(Sender: TObject);
var
newbmp: TBitmap;
i,bmpheight,bmpwidth:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
for i:=0 to bmpheight do
begin
newbmp.Canvas.CopyRect(Rect(0,bmpheight-i,bmpwidth,bmpheight),image1.Canvas,Rect(0,0,bmpwidth,i));
form1.Canvas.Draw(120,100,newbmp);
end;
newbmp.free;
end;---- 2. 垂 直 交 错 效 果 ---- 将 要 显 示 的 图 形 拆 成 两 部 分, 奇 数 行 像 素 由 上 往 下 搬 移, 偶 数 行 像 素 则 由 下 往 上 搬 移, 而 且 两 者 同 时 进 行。 从 屏 幕 上 便 可 看 到 分 别 由 上 下 两 端 出 现 的 较 淡 图 形 向 屏 幕 中 央 移 动, 直 到 完 全 清 楚 为 止。 ---- 程 序: procedure TForm1.Button4Click(Sender: TObject);
var
newbmp:TBitmap;
i,j,bmpheight,bmpwidth:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
i:=0;
while i<=bmpheight do
begin
j:=i;
while j>0 do
begin
newbmp.Canvas.CopyRect(Rect(0,j -1,bmpwidth,j),
image1.Canvas,Rect(0,bmpheight -i +j -1,bmpwidth,bmpheight -i +j));
newbmp.Canvas.CopyRect(Rect(0,bmpheight -j,
bmpwidth,bmpheight -j +1),image1.Canvas,Rect(0,i -j,bmpwidth,i -j +1));
j:=j -2;
end;
form1.Canvas.Draw(120,100,newbmp);
i:=i +2;
end;
newbmp.free;
end;---- 3. 水 平 交 错 效 果 ---- 同 垂 直 交 错 效 果 实 现 方 法 一 样, 只 是 将 分 成 两 组 后 的 图 形 分 别 由 左 右 两 端 移 进 屏 幕。 ---- 程 序 略。 ---- 4. 雨 滴 效 果 ---- 将 缓 存 图 形 的 最 后 一 行 像 素, 依 次 搬 移 到 可 视 位 图 的 第 一 行, 让 此 行 像 素 在 屏 幕 上 留 下 它 的 轨 迹。 接 着 再 把 缓 存 图 形 的 倒 数 第 二 行 像 素, 依 次 搬 移 到 可 视 位 图 的 第 二 行, 其 余 的 依 此 类 推。 ---- 程 序:procedure TForm1.Button3Click(Sender: TObject); var
newbmp:TBitmap;
i,j,bmpheight,bmpwidth:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
for i:=bmpheight downto 1 do
for j:=1 to i do
begin
newbmp.Canvas.CopyRect(Rect(0,j -1,bmpwidth,j),
image1.Canvas,Rect(0,i -1,bmpwidth,i));
form1.Canvas.Draw(120,100,newbmp);
end;
newbmp.free;
end;---- 5. 百 叶 窗 效 果 ---- 将 放 在 缓 存 图 形 的 数 据 分 成 若 干 组, 然 后 依 次 从 第 一 组 到 最 后 一 组 搬 移, 第 一 次 每 组 各 搬 移 第 一 行 像 素 到 可 视 位 图 的 相 应 位 置, 第 二 次 各 组 搬 移 第 二 行 像 素, 接 着 搬 移 第 三 行、 第 四 行 像 素。 ---- 程 序: procedure TForm1.Button6Click(Sender: TObject);
var
newbmp:TBitmap;
i,j,bmpheight,bmpwidth:integer;
xgroup,xcount:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
xgroup:=16;
xcount:=bmpheight div xgroup;
for i:=0 to xcount do
for j:=0 to xgroup do
begin
newbmp.Canvas.CopyRect(Rect(0,xcount *j +i -1,bmpwidth,xcount *j
+i),image1.Canvas,Rect(0,xcount *j +i -1,bmpwidth,xcount *j +i));
form1.Canvas.Draw(120,100,newbmp);
end;
newbmp.Free;
end;---- 6. 积 木 效 果 ---- 积 木 效 果 是 雨 滴 效 果 的 一 种 变 化, 不 同 之 处 在 于, 积 木 效 果 每 次 搬 移 的 是 一 块 图 形, 而 不 只 是 一 行 像 素。 ---- 程 序: procedure TForm1.Button7Click(Sender: TObject);
var
newbmp:TBitmap;
i,j,bmpheight,bmpwidth:integer;
begin
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
i:=bmpheight;
while i>0 do
begin
for j:=10 to i do
begin
newbmp.Canvas.CopyRect(Rect(0,j
-10,bmpwidth,j),image1.Canvas,Rect(0,i -10,bmpwidth,i));
form1.Canvas.Draw(120,100,newbmp);
end;
i:=i -10;
end;
newbmp.free;
end;
人家问的是如何流畅的播放大图象
1M的单帧图象在这种配置上想达到25-30帧/秒的速度是很难的,瓶颈是磁盘
如果是小容量、旧型号磁盘DMA66以前的估计只能达到15帧,磁盘速度比较低,就算采用双线程、双缓冲技术也没办法,数据太大了,当然了显示方法可以用GDI也可用DirectDraw,差不多的
不行就用DirectDraw,大概要用DelphiX吧
否则这种配置的机器只好用OPENGL技术啦.