#include <iostream>
#include <Windows.h>
#include <gdiplus.h>
#include <FreeImage.h>
using namespace std;
void bmp2PNG8(const char* bmp_fileName, const char* save_fileName);
void bmp2GIF8(const char* bmp_fileName, const char* save_fileName);
int main()
{
//初始化 FreeImage
FreeImage_Initialise();
//测试函数
bmp2PNG8("test.bmp","test1.png");
bmp2GIF8("test.bmp", "test1.gif");
//释放 FreeImage
FreeImage_DeInitialise();
return 0;
}
void bmp2PNG8(const char* bmp_fileName, const char* save_fileName)
{
FIBITMAP* hDIB24bpp = FreeImage_Load(FIF_BMP, bmp_fileName, 0);
if (hDIB24bpp) {
FIBITMAP* res = FreeImage_Rescale(hDIB24bpp, 60, 40);
// color-quantize 24bpp (results in a 8bpp bitmap to set transparency)
FIBITMAP* hDIB8bpp = FreeImage_ColorQuantize(res, FIQ_WUQUANT);
// 读取调色板并进行修改
RGBQUAD* Palette = FreeImage_GetPalette(hDIB8bpp);
BYTE Transparency[256];
for (unsigned i = 0; i < 256; i++) {
Transparency[i] = 0xFF;
//判断调色板中RGB 白色时, 修改为透明色
if (Palette[i].rgbGreen == 0xff && Palette[i].rgbBlue == 0xff && Palette[i].rgbRed == 0xff) {
Transparency[i] = 0x00;
}
}
//设置调色板
FreeImage_SetTransparencyTable(hDIB8bpp, Transparency, 256);
//保存图像
FreeImage_Save(FIF_PNG, hDIB8bpp, save_fileName, 0);
FreeImage_Unload(hDIB24bpp);
FreeImage_Unload(hDIB8bpp);
FreeImage_Unload(res);
}
else
{
cout << "读取错误" << endl;
}
}
void bmp2GIF8(const char* bmp_fileName, const char* save_fileName)
{
FIBITMAP* hDIB24bpp = FreeImage_Load(FIF_BMP, bmp_fileName, 0);
if (hDIB24bpp) {
FIBITMAP* res = FreeImage_Rescale(hDIB24bpp, 1600, 800);
// color-quantize 24bpp (results in a 8bpp bitmap to set transparency)
FIBITMAP* hDIB8bpp = FreeImage_ColorQuantize(res, FIQ_WUQUANT);
// 读取调色板并进行修改
RGBQUAD* Palette = FreeImage_GetPalette(hDIB8bpp);
BYTE Transparency[256];
for (unsigned i = 0; i < 256; i++) {
Transparency[i] = 0xFF;
//判断调色板中RGB 白色时, 修改为透明色
if (Palette[i].rgbGreen == 0xff && Palette[i].rgbBlue == 0xff && Palette[i].rgbRed == 0xff) {
Transparency[i] = 0x00;
}
}
//设置调色板
FreeImage_SetTransparencyTable(hDIB8bpp, Transparency, 256);
//保存图像
FreeImage_Save(FIF_GIF, hDIB8bpp, save_fileName, 0);
FreeImage_Unload(hDIB24bpp);
FreeImage_Unload(hDIB8bpp);
FreeImage_Unload(res);
}
else
{
cout << "读取错误" << endl;
}
}