主要方法:

  1. 加载图像及读取参数

    FreeImage_Load

    FreeImage_GetWidth

    FreeImage_GetHeight

    FreeImage_Allocate

    FreeImage_GetPixelColor

    FreeImage_SetPixelColor
  2. 保存GIF

    FreeImage_OpenMultiBitmap

    FreeImage_SetMetadata

    FreeImage_SetTagXX

    FreeImage_AppendPage
  3. GIF 透明模板

    FreeImage_ColorQuantize

    FreeImage_GetPalette

    FreeImage_SetTransparencyTable

这里需要注意的是,图像通道32位转24位时,不使用FreeImage_ConvertTo24Bits,而通过PNG透明通道进行数据复制,避免背景对后面生成透明表(FreeImage _SetTransparencyTable)造成干扰。此外,注意设置24位图的背景色,避免与表情区域颜色相近。

这里做了如下设置

src_color.rgbRed = 0;
src_color.rgbBlue = 255;
src_color.rgbGreen = 0;

完整代码:

#include "FreeImagePlus.h"

#include <iostream>
using namespace std; FIBITMAP* genhDIB8bpp(FIBITMAP* hDIB32bpp); int main(int argc, char** argv[])
{
FreeImage_Initialise(TRUE);
// load source images
FIBITMAP* hdib1 = FreeImage_Load(FIF_PNG, "img1.png", PNG_IGNOREGAMMA);
FIBITMAP* hdib2 = FreeImage_Load(FIF_PNG, "img2.png", PNG_IGNOREGAMMA);
FIBITMAP* hdib3 = FreeImage_Load(FIF_PNG, "img3.png", PNG_IGNOREGAMMA); if (NULL == hdib1 || NULL == hdib2 || NULL == hdib3)
{
cout << " load image(png) error. \n";
return -1;
} int bpp1 = FreeImage_GetBPP(hdib1);
int bpp2 = FreeImage_GetBPP(hdib2);
int bpp3 = FreeImage_GetBPP(hdib3); int dib_type = FreeImage_GetImageType(hdib1);
cout << "Type: " << dib_type << " " << FIT_BITMAP << endl;
cout << "BPP: " << bpp1 << " " << bpp2 << " " << bpp3 << endl;
if (32 != bpp1 || 32 != bpp2 || 32 != bpp3)
return -1; bool bMemoryCache = TRUE; FIMULTIBITMAP *multi = FreeImage_OpenMultiBitmap(FIF_GIF, "out.gif", TRUE, FALSE);
int fps = 3;
DWORD dwFrameTime = (DWORD)((1000.0f / fps) + 0.5f); cout << "gen hDIB8bpp " << endl;
FIBITMAP* dib[3];
dib[0] = genhDIB8bpp(hdib1);
dib[1] = genhDIB8bpp(hdib2);
dib[2] = genhDIB8bpp(hdib3); cout << "AppendPage" << endl;
for (int i = 0; i < 3; i++ ){
// clear any animation metadata used by this dib as we’ll adding our own ones
FreeImage_SetMetadata(FIMD_ANIMATION, dib[i], NULL, NULL);
// add animation tags to dib[i]
FITAG *tag = FreeImage_CreateTag();
if (tag) {
FreeImage_SetTagKey(tag, "FrameTime");
FreeImage_SetTagType(tag, FIDT_LONG);
FreeImage_SetTagCount(tag, 1);
FreeImage_SetTagLength(tag, 4);
FreeImage_SetTagValue(tag, &dwFrameTime);
FreeImage_SetMetadata(FIMD_ANIMATION, dib[i], FreeImage_GetTagKey(tag), tag);
FreeImage_DeleteTag(tag);
}
FreeImage_AppendPage(multi, dib[i]);
// FreeImage_Unload(dib[i]);
}
FreeImage_CloseMultiBitmap(multi); FreeImage_Unload(dib[0]);
FreeImage_Unload(dib[1]);
FreeImage_Unload(dib[2]); FreeImage_Unload(hdib1);
FreeImage_Unload(hdib2);
FreeImage_Unload(hdib3); FreeImage_DeInitialise();
return 0;
} FIBITMAP* genhDIB8bpp(FIBITMAP* hDIB32bpp)
{
FIBITMAP* hDIB8bpp = NULL;
int w = FreeImage_GetWidth(hDIB32bpp);
int h = FreeImage_GetHeight(hDIB32bpp); // FIBITMAP *hDIB24bpp = FreeImage_ConvertTo24Bits(hDIB32bpp);
FIBITMAP *hDIB24bpp = FreeImage_Allocate(w, h, 24);
for (int i = h - 1; i >= 0; i--)
for (int j = 0; j < w; j++)
{
RGBQUAD src_color;
FreeImage_GetPixelColor(hDIB32bpp, j, i, &src_color);
if ( 255 == src_color.rgbReserved )
FreeImage_SetPixelColor(hDIB24bpp, j, i, &src_color);
else
{
src_color.rgbRed = 0;
src_color.rgbBlue = 255; src_color.rgbGreen = 0;
FreeImage_SetPixelColor(hDIB24bpp, j, i, &src_color);
}
}
FreeImage_Save(FIF_JPEG, hDIB24bpp, "out.jpg"); BYTE Transparency[256];
if (!hDIB8bpp)
hDIB8bpp = FreeImage_ColorQuantize(hDIB24bpp, FIQ_WUQUANT); RGBQUAD *Palette = FreeImage_GetPalette(hDIB8bpp);
for (int i = 0; i < 256; i++)
{
Transparency[i] = 0xFF;
if (Palette[i].rgbRed != 0x00 && Palette[i].rgbBlue != 0xFF && Palette[i].rgbGreen > 0x00)
{
Transparency[i] = 0x00;
}
} FreeImage_SetTransparencyTable(hDIB8bpp, Transparency, 256); // FreeImage_Save(FIF_PNG, hDIB8bpp, "out.png");
FreeImage_Unload(hDIB24bpp); return hDIB8bpp;
}

原图:

结果:

FreeImage 生成带透明通道的GIF的更多相关文章

  1. javascript播放带透明通道的mp4动画

    随着互联网的发展,动画效果也在一直更新,从刚开始的flsh动画,cocos骨骼动画,到YY开源的svga动画.最近1年来,带有透明通道的mp4动画被使用的极为广泛,对于app端.github上有开源的 ...

  2. Photoshop做32位带Alpha通道的bmp图片

    原文链接: http://blog.sina.com.cn/s/blog_65c0cae801016e5u.html   批量制作32位带Alpha通道的bmp图片,可以制作一个动作,内容可以如下: ...

  3. BMP是可以保存alpha通道的。

    一直以来都不太熟悉BMP格式,今天保存图片的时候发现bmp是可以保存透明通道的,突然想起来以前下载的一些游戏素材贴图里面就有一些bmp格式的贴图.记录一下.

  4. C#生成带logo的二维码

    带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类   QRCode ...

  5. js生成带参的二维码

    最近项目中有需求生成带参的二维码,考虑过用JAVA后台生成返回前端展示,后面了解到用jquery的qrcode.js插件可以很好现实 引入js: require.config({ baseUrl : ...

  6. .NET生成带Logo的二维码

    使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...

  7. Force.com微信开发系列(八)生成带参数的二维码

    为了满足用户渠道推广分析的需要,公众平台提供了生成带二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.目前有两种类型的二维码,分别是临时二维码和永久二维码 ...

  8. PowerDesigner15.1创建模型及生成带注释sql操作手册

    转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...

  9. java生成带html样式的word文件

    参考:http://blog.csdn.net/xiexl/article/details/6652230 最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是 ...

随机推荐

  1. Perl学习笔记(3)----遍历哈希表的一个容易疏忽的地方

    今天做 Google的 Code Jam 上的一道题目:https://code.google.com/codejam/contest/351101/dashboard#s=p2,用Perl语言解答的 ...

  2. .NET开源工作流RoadFlow-Bug修改-1.8.2表单验证时ueditor编辑非空验证无效

    RoadFlow生成的表单,Ueditor编辑器不能进行非空验证的BUG修改: 1.修改控制器:WorkFlowFormDesignerController红框处: 2.修改js文件:Scripts/ ...

  3. Win7下VC++6.0打开文件报错导致其崩溃的解决办法

    原文:http://blog.csdn.net/wanghaihao_1/article/details/39005771 在Windows7下安装Visual C++ 6.0后,遇到一个致命的问题打 ...

  4. 制作rpm安装包

    1.安装rpmbuild软件 sudo apt-get install rpmbuild2.配置工作路径 在制作 rpm 包之前,首先要配置工作路径,也就是制作 rpm 包所在的目录.制作 rpm 包 ...

  5. [翻译] Macros with a Variable Number of Arguments - GCC

    可变参数宏(Variadic Macro) 在1999年的ISO C标准中,可以声明一个像函数一样接受可变参数的宏.定义这种宏的语法与函数的定义相似.这是一个例子: #define debug(for ...

  6. google离线小恐龙-备份

    开启方法: 地址栏输入: chrome://dino 空格开始

  7. MySQL案例01:Last_SQL_Errno: 1755 Cannot execute the current event group in the parallel mode

    周五同事监控报警,有个MySQL从库复制状态异常,让我帮忙排查下,经过排查发现是MySQL5.6并行复制的一个Bug所致,具体处理过程如下: 一.错误信息 登录mysql从库服务器,检查复制状态 my ...

  8. centos7和centos6区别

    CentOS 7 vs CentOS 6的不同   (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统[CentOS6 ...

  9. scrollview的总结

    今天主要是学习了cocos2dx的scrollview的内容,把简单的菜单滑动表现做出来了.像很多游戏的下方有一槽功能按钮,角色.背包.技能.帮助等,当宽度不足以全部显示出来的时候,隐藏一部分,以滑动 ...

  10. php安装扩展redis淌过的坑

    php安装扩展redis淌过的坑 php扩展 redis cd /usr/local/src/ wget https://github.com/nicolasff/phpredis/archive/2 ...