VC2019调用pngquantDLL示例源码

news2024/10/6 8:26:04

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相机的位姿在地固坐标系ECEF和ENU坐标系的转换

在地球科学和导航领域,通常使用地心地固坐标系(ECEF,Earth-Centered, Earth-Fixed)和东北天坐标系(ENU,East-North-Up)来描述地球上的位置和姿态。如下图所示: ​地心地固坐标ecef和…

fastapi系列1-基础知识

学习资料 官网:https://fastapi.tiangolo.com/ github:https://github.com/tiangolo/fastapi 视频教程【独家新技术】从0到1学习 FastAPI 框架的所有知识点 依赖底层包:https://www.starlette.io/ 轻松上手Python的Web神器:FastAPI教程&…

ubuntu20.04共享文件夹—— /mnt/hgfs里没有共享文件夹

参考文章:https://blog.csdn.net/Edwinwzy/article/details/129580636 虚拟机启用共享文件夹后,/mnt/hgfs下面为空,使用 vmware-hgfsclient 查看设置的共享文件夹名字也是为空。 解决方法: 1. 重新安装vmware tools. 在菜单…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

ForEach基于数组类型数据执行循环渲染。说明,从API version 9开始,该接口支持在ArkTS卡片中使用。 一、接口描述 ForEach(arr: any[], itemGenerator: (item: any, index?: number) > void,keyGenerator?: (item: any, index?: number) > stri…

谈谈IP地址和子网掩码的概念及应用

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、IP地址的概念 二、IP地址的分类 1、A类 …

react之 router6路由 (两种路由模式、两种路由跳转、两种传参与接收参数、嵌套路由,layout组件、路由懒加载)

目录 react路由1:安装和两种模式react路由2:两种路由跳转 ( 命令式与编程式)2-1 路由跳转-命令式2-2 路由跳转-编程式 - 函数组件2-2-1 app.jsx2-2-2 page / Home.jsx2-2-3 page / About.jsx2-2-4 效果 react路由3:函数…

恒运资本:A股质押降至十年新低,高比例质押公司不足1%!

2018年,A股商场股权质押规划到达历史高位,为化解危险,监管层通过多种方式、多方合力给予纾解,取得积极成效。上篇分析了A股质押危险大幅缓解的六大原因,本篇从高份额质押股特征、职业、地域、企业类型等视点&#xff0…

七麦analysis参数加密分析

文章目录 1. 接口分析2. 断点调式3. 补环境重写加密4. 验证结果 1. 接口分析 目标站点: aHR0cHM6Ly93d3cucWltYWkuY24vcmFuay9tYXJrZXRSYW5r 先刷新网页,请求接口中的analysis参数本次分析的目标 2. 断点调式 打上XHR断点,刷新页面之后断点…

【MT32F006】MT32F006之串口

本文最后修改时间:2023年03月30日 一、本节简介 本文介绍如何使用MT32F006的串口。 二、实验平台 库版本:V1.0.0 编译软件:MDK5.37 硬件平台:MT32F006开发板(主芯片MT32F006) 仿真器:JLINK…

无涯教程-Perl - umask函数

描述 此函数为当前进程设置umask(创建文件和目录时应用的默认掩码)。 EXPR的值必须是八进制数。如果省略EXPR,则只需返回先前的值。 语法 以下是此函数的简单语法- umask EXPRumask返回值 此函数返回先前的umask值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/pe…

Java学习笔记30——字节缓冲流

字节缓冲流 字节缓冲流缓冲输出流缓冲输入流 复制视频速度对比 字节缓冲流 缓冲输出流 BufferadOutputStream通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个细节导致底层系统的调用 构造方法 BufferadOutputStream(Outpu…

【Elsevier旗下】1区SCI,5天见刊!稳定检索36年

近日国自然即将发布,想必申请过国自然基金作者都知道,需要有研究基础,说白了就是需要有文章支持。那么稿子写好了,选择一本靠谱优质期刊也是一门学问。 以下2本Elsevier 旗下审稿快刊,各项指标优秀,实为评…

QT connect使用简单介绍

如图,首先 connect是线程安全的。其次它有很多重载,当然最重要的还是QT4连接和QT5连接的区别,这个函数重载表示connect函数也是支持lambda函数的。 connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)connec…

Redis——set类型详解

概要 Set(集合),将一些有关联的数据放到一起,集合中的元素是无序的,并且集合中的元素是不能重复的 之前介绍的list就是有序的,对于列表来说[1, 2, 3] 和 [2, 1, 3]是两个不同的列表,而对于集合…

阿里Canal学习笔记

github地址 canal 使用IDEA打开&#xff0c;注意国内加载慢的问题&#xff0c;解决方式如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://w…

CAS:2143933-81-5,ICG-Maleimide,吲哚菁绿马来酰亚胺,脂溶性染料试剂

今日文章关键词&#xff1a;脂溶性染料试剂,吲哚菁绿马来酰亚胺&#xff0c;CAS&#xff1a;2143933-81-5 试剂基团反应特点&#xff1a;ICG-maleimide的马来酰 亚胺可以和蛋白、多肽、小分子或抗体上的SH巯基反应连接。ICG染料的马来酰亚胺提供了开发共轭物的机会。Maleimide…

Python入门【原生字符串、边界字符、search函数、re模块中其他常用的函数 、贪婪模式和非贪婪模式、择一匹配(|)的使用、分组】(三十)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

ZooKeeper的应用场景(分布式锁、分布式队列)

7 分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要通过一些互斥手段来防止彼此之间的干扰&#xff0c;以保证一致性&#xff0c;…

RuoYi项目下载及配置启动

一. 前置要求 这里假设你已经安装并配置了JDK1.8,Node,Git,IDEA,vscode,MySQL,navicat 16,Redis,RDM环境,如果没有下载安转可以参考我的博客找到对应的软件下载安装即可 二.下载源码 官网地址 方式一:直接下载ZIP压缩包 方式二:利用Git下载源码 点击复制之后,在需要下载代码…

华为昇腾助力大模型,算力国产化时代已来

去年世界人工智能大会&#xff08;WAIC 2022&#xff09;上&#xff0c;只有屈指可数的几家大厂推出大模型&#xff0c;但在科技部新一代人工智能发展研究中心5月底发布的《中国人工智能大模型地图研究报告》显示&#xff0c;我国10亿参数规模以上的大模型已发布79个&#xff0…