FreeImage 生成带透明通道的GIF
主要方法:
- 加载图像及读取参数
FreeImage_Load
FreeImage_GetWidth
FreeImage_GetHeight
FreeImage_Allocate
FreeImage_GetPixelColor
FreeImage_SetPixelColor - 保存GIF
FreeImage_OpenMultiBitmap
FreeImage_SetMetadata
FreeImage_SetTagXX
FreeImage_AppendPage - 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的更多相关文章
- javascript播放带透明通道的mp4动画
随着互联网的发展,动画效果也在一直更新,从刚开始的flsh动画,cocos骨骼动画,到YY开源的svga动画.最近1年来,带有透明通道的mp4动画被使用的极为广泛,对于app端.github上有开源的 ...
- Photoshop做32位带Alpha通道的bmp图片
原文链接: http://blog.sina.com.cn/s/blog_65c0cae801016e5u.html 批量制作32位带Alpha通道的bmp图片,可以制作一个动作,内容可以如下: ...
- BMP是可以保存alpha通道的。
一直以来都不太熟悉BMP格式,今天保存图片的时候发现bmp是可以保存透明通道的,突然想起来以前下载的一些游戏素材贴图里面就有一些bmp格式的贴图.记录一下.
- C#生成带logo的二维码
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类 QRCode ...
- js生成带参的二维码
最近项目中有需求生成带参的二维码,考虑过用JAVA后台生成返回前端展示,后面了解到用jquery的qrcode.js插件可以很好现实 引入js: require.config({ baseUrl : ...
- .NET生成带Logo的二维码
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...
- Force.com微信开发系列(八)生成带参数的二维码
为了满足用户渠道推广分析的需要,公众平台提供了生成带二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.目前有两种类型的二维码,分别是临时二维码和永久二维码 ...
- PowerDesigner15.1创建模型及生成带注释sql操作手册
转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...
- java生成带html样式的word文件
参考:http://blog.csdn.net/xiexl/article/details/6652230 最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是 ...
随机推荐
- windows c++ 修改用户的文件夹操作权限
一般Windows下的系统文件(夹)只让受限帐户读取而不让写入和修改.如果要开启写操作权限就需要手动修改文件(夹)的用户帐户安全权限(这操作当然要在管理员帐户下执行).以下用程序封装了一下该操作: # ...
- CCF201412-1 门禁系统
试题编号: 201412-1 试题名称: 门禁系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个 ...
- SQL点点滴滴_查询类型和索引-转载
当您考虑是否要对列创建索引时, 请估计在查询中使用列的方式, 下表介绍了索引对其有用的查询类型. 表中的示例基于 AdventureWorks2008R2 示例数据库, 在 SQL Server Ma ...
- percona toolkit之slave工具
1:pt-slave-find ,主要是查找MySQL的层级,其实我感觉这个用处不是很大,因为层级比较多架构本身就很少,查看从库的话一般情况我们可以通过show slave hosts查看(不过不能显 ...
- Oracle案例02——ORA-12034: "SCOTT"."USER_TABLE" 上的实体化视图日志比上次刷新后的内容新
最近同事在交接工作时,发现有几个schedule job没有执行成功,我这边给看了下,其中一个是由于数据库迁移,调用dblink的host主机IP在tnsnames中没有变更导致,还有一个是无法视图的 ...
- linux 下apche无法监听端口解决办法(Permission denied: make_sock: could not bind to address)
想建立一个测试用的虚拟主机,遇到了这个问题:[root@localhost html]# service httpd startStarting httpd: httpd: Could not rel ...
- 大数据学习---大数据的学习【all】
大数据介绍 什么是大数据以及有什么特点 大数据:是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合. 大数据是一种方法论:“一切都被记录,一切都被数字化,从数据中寻找需求,寻找知 ...
- IEEP-OSPF域内路由故障-现象与排障思路
OSPF域内路由故障-现象与排障思路 一.故障现象 OSPF的或内路由故障常表现为邻居路由器不通告部分或全部路由,可能的原因通常为: 1).拟通告的接口上未启用OSPF 2).拟通告的接口被关闭 OS ...
- SAP成都研究院2018年总共87篇技术文章合集
2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...
- 利用kali嗅探周围发送的短信
设备清单: 摩托罗拉 C118 (25块) FT232RL USB TO TTL (30元) 摩托罗拉 Motorola C118专用数据连接线 (10块) MiniUSB 链接线(10元,这个大家手 ...