各位大虾:小弟在程序设计的时候遇到了一个问题:
      是这样的:
         有100副bmp格式的图片,每副图片有1M多大小,我现在需要通过程序实现这100副图片的连续
      播放以达到动画的效果,而且目标计算机的配置非常底,显卡才6M多,内存是126的
      我想请教各位高手:通过delphi怎样才能达到这个目的(最好能提供原代码)      现目前我只有100多分,我会全部拿出来!希望各位高手不要嫌分少,帮小弟这个忙
      感激不尽!!!!

解决方案 »

  1.   

    在Delphi 中, 显 示 一 幅 图 形 非 常 简 单, 只 要 在Form 中 定 义 一 个TImage 组 件, 设 置 其picture 属 性, 然 后 选 择 任 何 有 效 的.ICO、.BMP、.EMF 或.WMF 文 件, 进 行Load, 所 选 文 件 就 显 示 在TImage 组 件 中 了。 但 这 只 是 直 接 将 图 形 显 示 在 窗 体 中, 毫 无 技 巧 可 言。 为 了 使 图 形 显 示 具 有 别 具 一 格 的 效 果, 可 以 按 下 列 步 骤 实 现: 定 义 一 个TImage 组 件, 把 要 显 示 的 图 形 先 装 入 到TImage 组 件 中, 也 就 是 说, 把 图 形 内 容 从 磁 盘 载 入 内 存 中, 作 为 图 形 缓 存。 创 建 一 新 的 位 图 对 象, 其 尺 寸 跟TImage 组 件 中 的 图 形 一 样。 利 用 画 布(Canvas) 的CopyRect 功 能( 将 一 个 画 布 的 矩 形 区 域 拷 贝 到 另 一 个 画 布 的 矩 形 区 域), 使 用 各 种 技 巧, 动 态 形 成 位 图 文 件 内 容, 然 后 在 窗 体 中 显 示 位 图。
    ---- 实 现 方 法 ---- 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;
      

  2.   

    一楼的答非所问啊
    人家问的是如何流畅的播放大图象
    1M的单帧图象在这种配置上想达到25-30帧/秒的速度是很难的,瓶颈是磁盘
    如果是小容量、旧型号磁盘DMA66以前的估计只能达到15帧,磁盘速度比较低,就算采用双线程、双缓冲技术也没办法,数据太大了,当然了显示方法可以用GDI也可用DirectDraw,差不多的
      

  3.   

    有没有想过把这写连续的图片转化成AVI来播放?
      

  4.   

    TImageList可以试一下
    不行就用DirectDraw,大概要用DelphiX吧
      

  5.   

    如果图片是固定的话,建议先转成AVI或FLASH格式.
    否则这种配置的机器只好用OPENGL技术啦.