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

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;

}

原图:

结果:

linux 透明图片,FreeImage 生成带透明通道的GIF相关推荐

  1. opencv-python读取透明图片(既带alpha通道)

    opencv-python读取透明图片 透明图(alpha图) cv2 cv2.imread() 透明图(alpha图) 透明图是PS抠图中常用到的图片形式,能保存为png以及gif格式,相比于普通的 ...

  2. html5透明图片格式,支持png透明图片解决方法图

    一.需求JS文件赞成 1.需要DD_belatedPNG.js与DD_belatedPNG_0.0.8a.js文件,下面咱们会供给打包下载 2.紧要在需求赞成png图片html页面引入这2个JS文件( ...

  3. android如何添加透明图片按钮,如何拥有透明的ImageButton:Android

    如何拥有透明的ImageButton:Android android:layout_width="wrap_content" android:layout_height=" ...

  4. python tkinter button 透明图片_Tkinter-按钮图像透明背景

    据我所知,tkinter本机支持像GIF这样的图像的透明性. 我把你的代码切碎了一点,但对我确实有用.也许你设置代码的方式有问题.你的标签上还有一个按钮.我觉得你不需要两者都有.你可以在你想要的地方创 ...

  5. ffmpeg将视频转换为带透明通道的gif

    使用 ffmpeg 也能生成带透明的 gif 文件.比如将 AE 导出的 rgba 通道的 avi 转换为 gif. ffmpeg -i infile.avi -lavfi split[v],pale ...

  6. CxImage透明图片合成和文字叠加

    1         CxImage的作用 CxImage将几张图片合成一张图片,在一张底图上添加图片,有些图片是有透明效果的,实现图片之间的透明重叠效果.另外还可以添加文字. (1)背景图片mymix ...

  7. Linux加载png背景图片,pillow使用之:粘贴一张带透明背景的png图片

    说在最前 在使用pillow制作海报的过程中,最经常用的场景: 文字居中(地址) 粘贴一张带透明背景的png图片(地址) 画一个圆形的用户头像(地址) 准备 环境 linux/windows pyth ...

  8. PHP 文字生成透明图片之路

    PHP 文字生成透明图片之路 摘要:在现在的开发中会经常运用到生成图片的功能,常用的验证码生成等.PHP语言生成图片需要用到GD2功能模块,所以基本的图片,图形处理都是没什么压力滴. 准备: 1.打开 ...

  9. PHP 文字生成透明图片

    准备: 1.打开GD2模块,在php.ini文件中把GD2打开即可. 2.准备一个适合在linux以及windows适用的字体文件 代码: $text = "我爱中国";//显示的 ...

  10. 京东css3动画全屏海报_京东全屏CSS3动态海报抖动效果代码生成,海报上透明图片自动上下抖动带动感...

    京东全屏CSS3动态海报抖动效果代码生成,海报上透明图片自动上下抖动带动感 分享到: 作者:陈俊    日期:2018-1-10 15:54   人气:4482   分类:装修助手教程 重要提示:生成 ...

最新文章

  1. 澳洲中本聪Craig Wright涉嫌论文抄袭?
  2. 五一减肥狂掉肉饮食法
  3. php 获得当月时间戳,php获取当前月与上个月月初及月末时间戳的方法
  4. Jmeter(7)调试工具---HTTP Mirror Server
  5. 今年阿里双十一提升广告点击率居然用的是这种算法?!
  6. 我们做自媒体是怎么失败的?
  7. 《必须知道.NET》3.OO之美
  8. Android SDK上手指南:用户交互
  9. Oracle 11g 字符集修改
  10. 数据包络分析--Malmquist指数
  11. 基于ESP32制作流光溢彩氛围灯
  12. 华为atn950b指导手册_全新原包装华为ATN950B 整机 传输设备
  13. ubuntu 18.04 设置静态IP地址
  14. YY频道美化,模板修改工具【免费】可以闪动
  15. 【转帖】刘备三顾茅庐,请Elasticsearch出山
  16. unity 3d 仿真_在Unity3D中构建3D仿真入门,第1部分
  17. 小程序 消息推送配置token无效(解决方法)订阅消息
  18. 小信号放大运算放大器使用要依照三步骤,4个细节更重要
  19. Unity Shader学习记录(18) —— Shader动画
  20. 一次性刻录光盘内容(刻录完成后不能再编辑光盘中内容)

热门文章

  1. Sublime Text3配置LaTeX环境及使用Sumatra PDF作为阅读器——亲测可用
  2. matlab如何求无穷多项乘积的极限,求极限方法小结
  3. 关于求数列极限的方法的总结
  4. 视频压制相关工具下载
  5. 谷歌livereload插件使用
  6. 苹果cmsV10资源站模板
  7. matlab中表示矩阵的转置,注意Matlab中的矩阵转置(转)
  8. c#.net配置mysql数据库连接池_c# 创建 mysql数据库连接池
  9. goeasy小demo
  10. 【雷达信号处理基础】第1讲 -- 雷达系统概述