|
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
}
|
|
|
|
|