互联网第一工具箱,让工作变得更为简单!
  • 221阅读
  • 0回复

[移动开发] Free_Image将32位真彩色改为8位彩色图像


会员


发帖
46
楼主  发表于:2023/1/10 8:56
#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;

    }

}



快速回复