主页C++ Builder 资料C++ Builder 编程技巧图片处理bmp 转 gif 图片和动画
C++ Builder 串口控件
C++ Builder 编程技巧
字符串及文字处理
多媒体处理
图片处理
 • 显示 gif 图片和动画
 • bmp 转 gif 图片和动画
 • gif 的每一帧都提取出来
 • jpg,gif,png,bmp之间转换
 • 屏幕截图
 • 生成二维码
 • 识别二维码和条码
文件处理
界面处理
C++ Builder 操作指南
C++ Builder 参考手册
网友留言/技术支持
bmp 转 gif 图片和动画
 • bmp 转 gif, 指定透明颜色
   · 方法1: 先指定加载 bmp 的 TBitmap 的透明颜色,然后加入 gif
   · 方法2: 把 bmp 加入 gif, 然后指定 gif 里面这一帧的透明颜色
 • 多个 bmp 图片转为 gif 动画

本文内容用到的头文件

类/模板 描述 头文件 (XE2 之后) 头文件 (XE 之前)
TGIFImage .gif 图片/动画 #include <Vcl.Imaging.GIFImg.hpp> #include <GIFImg.hpp>
TBitmap .bmp 图片/位图 #include <Vcl.Graphics.hpp> #include <Graphics.hpp>
std::auto_ptr 自动指针 #include <memory> #include <memory>

 

bmp 转 gif, 指定透明颜色

方法1: 先指定加载 bmp 的 TBitmap 的透明颜色,然后加入 gif

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TBitmap>bmp(new TBitmap);
  bmp->LoadFromFile(L"d:\\1.bmp");                   // 加载 bmp 文件
  bmp->Transparent = true;                           // 设定 bmp 为透明
  bmp->TransparentColor = bmp->Canvas->Pixels[0][0]; // 指定 bmp 的透明颜色为图片里面左上角的第一个像素的颜色
  // uǝɥɔ ɹoʇɔıʌ - /ɯoɔ·suɐɟddɔ·ʍʍʍ//:dʇʇɥ
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  TGIFFrame *lpFrame = new TGIFFrame(gif.get());     // 在 gif 里面增加一个空白帧 lpFrame
  lpFrame->Assign(bmp.get());                        // 把 bmp 复制到 gif 帧 lpFrame 里面
  gif->SaveToFile(L"d:\\2.gif");                     // 保存 gif 到文件 d:\\2.gif
}

 

方法2: 把 bmp 加入 gif, 然后指定 gif 里面这一帧的透明颜色

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  std::auto_ptr<TBitmap>bmp(new TBitmap);
  bmp->LoadFromFile(L"d:\\1.bmp");                      // 加载 bmp 图片

  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  TGIFFrame *lpFrame = new TGIFFrame(gif.get());        // 在 gif 里面增加一个空白帧 lpFrame
  lpFrame->Assign(bmp.get());                           // 把 bmp 复制到 gif 帧 lpFrame 里面
  // Copyright © Victor Chen, http://www.cppfans.com/
  TGIFGraphicControlExtension *lpGCE = new TGIFGraphicControlExtension(lpFrame); // 给这一帧添加 GIF89a 图形控制扩展
  lpGCE->Transparent = true;                            // 透明
  lpGCE->TransparentColorIndex = lpFrame->Pixels[0][0]; // 透明颜色索引值等于左上角第一个像素的索引值

  gif->SaveToFile(L"d:\\3.gif");                        // 保存 gif 到文件 d:\\3.gif
}

由于 GIF 图片里面每个像素点的颜色,即 lpFrame->Pixels[x][y] 的值是这个像素点的颜色在调色板里面的位置索引值,而不是这个像素点的真实颜色值,所以用这个所引值给 lpGCE->TransparentColorIndex 透明颜色在调色板里面位置的索引值赋值,那个像素点的颜色就是透明的颜色了。

 

多个 bmp 图片转为 gif 动画

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  std::auto_ptr<TBitmap>bmp(new TBitmap);
  std::auto_ptr<TStringList>slFiles(new TStringList);

  // 图片文件名,显示时间 (时间单位为 0.01 秒)
  slFiles->AddPair(L"d:\\1.bmp", 10); // 1.bmp 显示时间 10 个单位 = 0.1 秒
  slFiles->AddPair(L"d:\\2.bmp", 10); // 2.bmp 显示时间 10 个单位 = 0.1 秒
  slFiles->AddPair(L"d:\\3.bmp", 30); // 3.bmp 显示时间 30 个单位 = 0.3 秒
  slFiles->AddPair(L"d:\\4.bmp", 20); // 4.bmp 显示时间 20 个单位 = 0.2 秒
  slFiles->AddPair(L"d:\\5.bmp", 80); // 5.bmp 显示时间 80 个单位 = 0.8 秒

  for(int i=0; i<slFiles->Count; i++)
   {
     TGIFFrame *lpFrame = new TGIFFrame(gif.get());   // gif 里面新增一个空白帧 lpFrame

     bmp->LoadFromFile(slFiles->Names[i]);            // 加载第 i 个 bmp 文件
     lpFrame->Assign(bmp.get());                      // 把 bmp 的内容复制到 lpFrame 帧里面

     if(i==0)                                         // 第一帧要添加 gif 循环播放的次数
      {
        TGIFAppExtNSLoop *loop = new TGIFAppExtNSLoop(lpFrame);
        loop->Loops = 0;                              // 0 为无限次循环,>0 为实际循环次数
      }

     // 给每一帧添加这一帧显示的时间 // Copyright © Victor Chen, http://www.cppfans.com/
     TGIFGraphicControlExtension *gce = new TGIFGraphicControlExtension(lpFrame);
     gce->Delay = slFiles->ValueFromIndex[i].ToInt(); // 这一帧的显示时间为第 i 个 bmp 的显示时间
   }

  gif->SaveToFile(L"d:\\test.gif");                   // 保存 gif 到文件 d:\\test.gif
}
◤上一页:显示 gif 图片和动画下一页:gif 的每一帧都提取出来

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号