VC2019调用pngquantDLL示例源码

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项目示例源码。

VC2019调用pngquantDLL示例源码_第1张图片

 

你可能感兴趣的:(VC,MFC,c++,开发语言)