linux 透明图片,FreeImage 生成带透明通道的GIF

article/2025/10/12 19:06:29

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;

}

原图:

ddaf5d5f9a6fe965239a47120ce664f6.png

bf557c80098d0993691405901accccfe.png

8895822164620c8574fd87b10cbab7e3.png

结果:

0738f65f84d983166d9b54444750bc2b.gif0b1331709591d260c1c78e86d0c51c18.png


http://chatgpt.dhexx.cn/article/k3E6oRAj.shtml

相关文章

freeimage转到cvmat 单通道图像转到3通道[freeimage][cvmat]

0 结果 1 代码 将freeImage转为cv::mat&#xff0c;代码如下&#xff1a; #include <FreeImage.h> #include <opencv2\opencv.hpp> using namespace cv;// #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable : 4996) void FI2MAT(FIBITMAP* src, Mat&…

linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库

Linux(ubuntu系统)下使用FreeImage库 Linux(ubuntu系统)下使用FreeImage库 最近在搞一个图像处理的项目,需要用到FreeImage,之前在Windows下用过,很简单,因为FreeImage官网提供了可供使用的静态库动态库,直接包含就行了。现在需要在Linux平台下使用,发现官网并没有提供直…

计算机中缺失freeimage.dll,修复freeimage.dll

freeimage.dll是一款如果丢失会造成系统无法造成运行等问题的重要文件。今天久友下载站小编教大家一个修复freeimage.dll文件的方法&#xff0c;来久友下载站下载 freeimage.dll进行安装修复即可。Freeimage.dll是程序访问的组合文件&#xff0c;支持方便的程序打开&#xff0c…

Linux FreeImage安装编译

1.下载FreeImage 安照包 wget http://downloads.sourceforge.net/freeimage/FreeImage3170.zip #解压 unzip FreeImage3170.zip -d freeImage 2.对安装包进行编译 cd freeImagesudo make 类型转换错误解决&#xff1a; Source/LibRawLite/./internal/dcraw_common.cpp: 在…

c语言freeimage库文件,FreeImage使用方法amp;FreeImage Tutorial

前言 四大图像库&#xff1a;OpenCV&#xff1a;功能十分的强大&#xff0c;而且支持目前先进的图像处理技术&#xff0c;体系十分完善&#xff0c;操作手册很详细&#xff0c;手册首先给大家补计算机视觉的知识&#xff0c;几乎涵盖了近10年内的主流算法&#xff1b; http://s…

windows下FreeImage编译

windows下FreeImage编译 FreeImage下载 FreeImage下载地址 点击左边的“Download” 选择 “Download FreeImage 3.18.0 [WIN32/WIN64]” vs2019打开工程 下载后解压&#xff0c;直接打开&#xff1a;FreeImage.2017.sln 生成dll、lib文件 接下来编译C Wraper的 测试工程…

Qt Creator配置FreeImage库

第零步&#xff1a;前言 根据官网介绍&#xff1a; FreeImage 是一个开源库项目&#xff0c;面向希望支持当今多媒体应用程序所需的流行图形图像格式&#xff08;如 PNG&#xff0c;BMP&#xff0c;JPEG&#xff0c;TIFF 和其他格式&#xff09;的开发人员。FreeImage 易于使用…

FreeImage

freeimage.lib下载地址&#xff1a; http://freeimage.sourceforge.net/ FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by todays multimedia ap…

FreeImage库的配置及部分使用(windows)

1、首先下载FreeImage库&#xff0c;http://freeimage.sourceforge.net/download.html&#xff0c;下载如下 2、解压后&#xff0c;如下图所示&#xff1a; 打开2013sln&#xff0c;编译FreeImageLib这个项目&#xff08;设为启动项&#xff09;&#xff0c;根据debug/release版…

void *的使用

void * 为 “不确定类型指针”。 void *不可以解引用 &#xff08;1&#xff09;void *可以接受任何类型的赋值&#xff1a; 任何类型的指针都可以直接赋值给void *型指针&#xff0c;无需进行强制类型转换&#xff0c;相当于void *包含了其他类型的指针。 &#xff08;2&a…

C语言中void的高级应用

C语言中void的高级应用 C语言中的void关键字&#xff0c;void 表示为“无”、“空”、“没有”的意思。所以void是不能用来定义变量的&#xff0c;因为变量是需要固定的空间的 //定时时&#xff0c;编译不通过 void ch a; void a 10;一、void的常用场景 1.1 函数的参数 v…

【C语言】void 和 void* 类型

一. void 类型 1. 为何不能定义 void 类型的变量 为什么不能定义 void 类型的变量&#xff1f;因为它是空类型&#xff0c;不能够为变量提供空间吗&#xff1f; 定义变量的本质是开辟空间&#xff0c;我们用 sizeof 来计算 void 类型的大小&#xff1a; 在vs2017下&#xf…

函数类型——void(无类型函数)

void属于函数类型中的无类型函数之对应的还有实型&#xff08;float,double&#xff09;&#xff0c;整型&#xff08;int&#xff09;&#xff0c;布尔型&#xff08;bool&#xff09;和字符型&#xff08;char&#xff09;。 在介绍void之前先介绍“返回值”&#xff1a; 就…

C语言中的void*是什么?

目录 1.void *是什么2.void*的解引用3.void*类型的应用场景 1.void *是什么 我们之前学过许多类型的指针变量&#xff0c;如整形指针&#xff0c;字符指针&#xff0c;甚至数组指针&#xff0c;函数指针等。 int a 10; int *pa &a;//整形指针pa接受一个整形变量a的地址…

C语言中的void类型函数

最重要的一点是void类型函数里不能出现return语句 &#xff0c;因为与常见的int double float char等数据类型不同&#xff0c;void是一个空类型&#xff0c;也就是说函数没有返回值&#xff0c;所以也不给主函数提供&#xff08;或返回&#xff09;任何信息 一般声明变量时不…

【C语言】如何理解【void(*)(void)】

1.理解【void(*)(void)】 引用阅读 如何理解【void(*)(void)】 void(*)(void) --表示一个返回值为void&#xff0c;没有参数的函数指针 (void(*)(void))--表示【将func这个函数强转成返回值为void&#xff0c;没有参数的函数】的类型转换 测试sizeof(void(*)(void)) #inc…

C语言中的void

文章目录 一.void概要二.void应用场景2.1void能定义变量吗&#xff1f;2.2void这个类型有大小吗&#xff1f;2.3void*能定义变量吗&#xff1f;2.4void*使用2.5void*能不能进行对应的指针运算&#xff1f;2.6void和函数返回值2.7函数void类型的参数 一.void概要 void就是空的意…

C语言 --- void的用法解析

文章目录 一、简介二、用法三、总结 一、简介 ​ void 中文翻译为"无类型"&#xff0c;有的也叫"空类型"。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。 二、用法 首先应该注意一点的是void类型是不同于其他常见类型的&#xf…

Python爬虫实现英汉互译

用requests模块实现英汉词汇简单互译 1.找到地址&#xff1a; 2.完成代码&#xff1a; import jsonimport requestsurl "https://fanyi.baidu.com/sug" headers {"User-Agent": Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit…

Python 爬虫笔记

Python 爬虫笔记 HTTP协议requests模块get() 和post()函数headers 数据解析正则表达式bs4解析-HTML语法Xpath 批量爬取百度图片selenium 毕设与图像分类相关&#xff0c;所以需要大量的图片数据&#xff0c;所以先学学爬虫爬图片。 本文作为自学笔记&#xff0c;仅供参考 声明&…