pngquantDLL是大名鼎鼎的PNG图片压缩命令行程序pngquant的源码编译的一个DLL库文件,主要是方便第三方程序集成使用; pngquant是一个命令行实用程序和一个用于有损压缩PNG图像的库。 这种转换大大减少了文件大小(通常高达70%),并保持了alpha透明度。
/* 供DLL导出函数使用 输入参数: quality:图片质量,保留 in_image:图像原始数据流 in_filesize:图像原始数据大小 out_image:输出图像数据流 out_filesize:输出图像数据大小 返回值: 成功0;失败1 */
DllExport int dllpngquant_single(char* quality, unsigned char* in_image, long long in_filesize, unsigned char** out_image, long long* out_filesize)
此接口主要是输入png图像数据及大小,输出图像数据及大小,方便软件调用集成。
一、加载DLL程序,代码如下:
HINSTANCE m_hDll2 = LoadLibrary("pngquant.dll");
if (NULL == m_hDll2)
{
AfxMessageBox("Load dll2 failed!");
return ;
}
二、声明函数,并取得函数在DLL中的地址,代码如下:
typedef int (*dllpngquant_single)(char* quality, unsigned char* in_image, long long in_filesize, unsigned char** out_image, long long* out_filesize);
dllpngquant_single m_dllpngquant_single = (dllpngquant_single)GetProcAddress(m_hDll2, "dllpngquant_single");
if (m_dllpngquant_single == NULL)
{
AfxMessageBox("Find function failed!");
return;
}
三、读取PNG图像数据,并得到数据大小,代码如下:
//读取图像数据
FILE* fp1 = fopen("image.png", "rb");//打开文件。F:\\projects\\VS2019\\MFC_RunDll\\Release\\
//获取文件大小
fseek(fp1, 0, SEEK_END);//定位文件指针到文件尾
long long pictureSize = ftell(fp1);//获取文件指针偏移量,即文件大小
fseek(fp1, 0, SEEK_SET);//定位文件指针到文件头。
unsigned char* body = (unsigned char*)malloc(sizeof(unsigned char) * pictureSize);//分配存储图片文件的内存
fread(body, pictureSize, 1, fp1);//读取图片体
fclose(fp1);
四、将原始图像数据及大小传入,调用函数功能,并输出处理后的图片数据及大小,代码如下:
//调用内存中函数,对图片进行处理
unsigned char* output_file_data;
long long output_file_size;
//调用dll函数
m_dllpngquant_single("", body, pictureSize, &output_file_data, &output_file_size);
五、将输出的图像数据,保存到文件中,代码如下:
const char* output_png_file_path = "quantized_example.png";
FILE* fp = fopen(output_png_file_path, "wb");
if (!fp) {
AfxMessageBox("Unable to write");
return;
}
fwrite(output_file_data, 1, output_file_size, fp);
fclose(fp);
六、上面就是所有的步骤,如果需要完整的工程,可以下载本人的VC2019项目示例源码。