MFC二维码生成,libqrencode——小白级

news2024/10/7 3:20:17

直接使用:下载我编译好的库-链接-,直接跳转到使用库那一步

两个工程打包链接 ——下载

先上最终效果:

 

二维码生成,参考: 跳转链接

一、 libqrencode库编译

libqrencode是一个日本人写的的库,库在这里下载。

1、新建一个config.h文件

文件中的内容为:

/* config.h.  Generated from config.h.in by configure.  */
/* config.h.in.  Generated from configure.ac by autoheader.  */
 
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
 
/* Define if you have the iconv() function and it works. */
/* #undef HAVE_ICONV */
 
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
 
/* Define to 1 if using pthread is enabled. */
//#define HAVE_LIBPTHREAD 1
 
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
 
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
 
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
 
/* Define to 1 if you have the `strdup' function. */
#define HAVE_STRDUP 1
 
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
 
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
 
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
 
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
 
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
 
/* Define to the sub-directory in which libtool stores uninstalled libraries.
   */
#define LT_OBJDIR ".libs/"
 
/* Major version number */
#define MAJOR_VERSION 3
 
/* Micro version number */
#define MICRO_VERSION 4
 
/* Minor version number */
#define MINOR_VERSION 4
 
/* Name of package */
#define PACKAGE "qrencode"
 
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""
 
/* Define to the full name of this package. */
#define PACKAGE_NAME "QRencode"
 
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "QRencode 3.4.4"
 
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "qrencode"
 
/* Define to the home page for this package. */
#define PACKAGE_URL ""
 
/* Define to the version of this package. */
#define PACKAGE_VERSION "3.4.4"
 
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
 
/* Version number of package */
#define VERSION "3.4.4"
 
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
 
/* Define to `__inline__' or `__inline' if that's what the C compiler
   calls it, or to nothing if 'inline' is not supported under any name.  */
#ifndef __cplusplus
/* #undef inline */
#endif
 
/* Define to 'static' if no test programs will be compiled. */
#define STATIC_IN_RELEASE static
/* #undef WITH_TESTS */

2、编译libqrencode

1)增删文件
解压libqrencode库之后,将config.h添加进去,将除了.c和.h的文件全部删除,还要删除qrenc.c,如果保留此文件,编译静态库时会发生错误。
处理完之后还剩下如下文件:

 2)编译
①在VS中创建一个win32项目,选择生成静态库,不使用预编译头。

 ②添加现有项,把所有文件添加进去

 ③然后选中项目,点击右键,属性->配置属性->C/C++ ->预处理器,在“预处理器”定义中添加HAVE_CONFIG_H.

④点击生成->生成解决方案

 二、使用库

1、使用静态库
将生成的lib文件和源码中的qrencode.h两个文件拷贝到项目中。
然后配置属性->C/C++->常规->附加包含目录,加入qrencode.h的所在路径。
配置属性->链接器属性->链接器->常规->附加库目录,加入ErWeiMaLib.lib所在路径。
配置属性->链接器属性->输入->附加依赖项,加入ErWeiMaLib.lib。

2、生成二维码保存到本地项目路径下

void GenerateQRcode(char * msg){

	unsigned int    unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
	unsigned char* pRGBData, * pSourceData, * pDestData;
	QRcode* pQRC;
	FILE* f;

	if (pQRC = QRcode_encodeString(msg, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
	{
		unWidth = pQRC->width;
		unWidthAdjusted = unWidth * 8 * 3;
		if (unWidthAdjusted % 4)
			unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
		unDataBytes = unWidthAdjusted * unWidth * 8;

		// Allocate pixels buffer

		if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
		{
			exit(-1);
		}
		// Preset to white

		memset(pRGBData, 0xff, unDataBytes);


		// Prepare bmp headers
		// 位图文件头
		BITMAPFILEHEADER kFileHeader;
		
		kFileHeader.bfType = 0x4d42;  // 位图文件的类型,必须为"BM"
		kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) +
							 sizeof(BITMAPINFOHEADER) + unDataBytes;// 位图文件的大小
		kFileHeader.bfReserved1 = 0;// 位图文件保留字,必须为0
		kFileHeader.bfReserved2 = 0;// 位图文件保留字,必须为0
		kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
			sizeof(BITMAPINFOHEADER);// 位图数据的起始位,位图文件头+位图信息头+调色板的大小

		// 位图信息头
		BITMAPINFOHEADER kInfoHeader;
		kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);// 本结构所占用字节数
		kInfoHeader.biWidth = unWidth* 8; // 位图的宽度,以像素为单位
		kInfoHeader.biHeight = ((int)unWidth*8);// 位图的高度,以像素为单位
		kInfoHeader.biPlanes = 1;// 目标设备的级别,必须为1
		kInfoHeader.biBitCount = 24; // 每个像素所需的位数,必须是1(双色)、
									//4(16色)、8(256色)或24(真彩色)之一
		kInfoHeader.biCompression = BI_RGB;// 位图压缩格式,必须是0,不压缩
		kInfoHeader.biSizeImage = 0; // 位图的大小,以字节为单位
		kInfoHeader.biXPelsPerMeter = 0; // 位图水平分辨率
		kInfoHeader.biYPelsPerMeter = 0; // 位图垂直分辨率
		kInfoHeader.biClrUsed = 0; // 位图实际使用的颜色表中的颜色数
		kInfoHeader.biClrImportant = 0; // 位图显示过程中重要的颜色数,0表示所有的颜色都重要

		// Convert QrCode bits to bmp pixels

		pSourceData = pQRC->data;
		for(int y=unWidth-1;y>=0;y--)
		{
			pDestData = pRGBData + unWidthAdjusted * y * 8;
			// y
			
			for (x = 0; x < unWidth; x++)
			{
				if (*pSourceData & 1)
				{

					for (int l = 0; l < 8; l++)
					{
						for (int n=0; n < 8; n++)
						{
							*(pDestData + n * 3 + unWidthAdjusted * l) = 0;
							*(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0;
							*(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0;
						}
					}
				}
				pDestData += 3 * 8;
				pSourceData++;
			}
		}
		// Output the bmp file
		if (!(fopen_s(&f, "temp.bmp", "wb")))
		{
			fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
			fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
			fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
			fclose(f);
		}
		else
		{
			printf("Unable to open file");
			exit(-1);
		}
		// Free data
		free(pRGBData);
		QRcode_free(pQRC);
	}
	else
	{
		printf("NULL returned");
		exit(-1);
	}
}

3、使用方式  。WideCharToMultiByte里面  填写CP_UTF8就能使用中文了

    CString str;
	GetDlgItemText(IDC_WENZI ,str);

	int len = WideCharToMultiByte(CP_UTF8, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
	char* szSourceSring = new char[len + 1];
	WideCharToMultiByte(CP_UTF8, 0, str, str.GetLength(), szSourceSring, len, NULL, NULL);
	szSourceSring[len] = '\0';

	GenerateQRcode(szSourceSring);

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

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

相关文章

自学黑客(网络安全)看这篇就够了

写了这么多编程环境和软件安装的文章&#xff0c;还有很多小伙伴在后台私信说看不懂。我都有点头疼了&#xff0c;但是小伙伴们求学的心情我还是能理解&#xff0c;竟然这么多人给我反馈了&#xff0c;那我就再写一篇网络安全自学的教程吧&#xff01;大家耐心看完&#xff0c;…

Fidder 抓iPhone Andorra包 教程 解决证书过期问题

1. 下载Fidder 链接&#xff1a;https://pan.baidu.com/s/12xgEU8YyE-CfWMbPIWqWMw?pwdfhxh 2.设置Fidder 3. 手机设置代理并安装证书 首先 windows r 键 输入cmd 输入 ipconfig 查看本机的IPv4地址 然后设置手机网络的HTTP代理。之后在iPhone上用Safari访问 ipv4地址:888…

【mysql】2003-Can‘t connect to MySQL server on “XX.XX.XX.XX“ (10060 unknow error)

使用navicat或者其他数据库管理工具连接远程mysql服务器时出现2003-Can’t connect to MySQL server (10060 unknow error)错误 经过排查时发现是防火墙的问题&#xff0c;OK&#xff01;那么下面写一下处理的过程 1、查看防火墙的状态 systemctl status firewalld 2、 开放…

MySQL基础(二十九)数据库的设计规范

1 范式 1.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 1.2 范式都包括哪些 目…

连接器行业最新状况:竞争充分,行业集中度不断提升

随着应用领域不断扩展&#xff0c;连接器产业逐渐发展成为产品种类齐全、品种规格丰富、专业方向细分、行业特征明显、标准体系规范、系列化及专业化的行业。 连接器行业是充分竞争的行业&#xff0c;行业集中度不断提升 连接器行业具有市场全球化和分工专业化的特征&#xf…

VMware Aria Suite Lifecycle 8.12 - 应用生命周期管理

VMware Aria Suite Lifecycle 8.12 - 应用生命周期管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-suite-lifecycle/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 应用生命周期管理 VMware Aria Suit…

Vue中组件之间通信的-六大方式-总结

方式一&#xff1a;props/$emit 父组件向子组件传值 通过一个例子&#xff0c;说明父组件如何向子组件传递值&#xff1a;在子组件Users.vue中如何获取父组件App.vue中的数据 users:["Henry","Bucky","Emily"] 注&#xff1a;父组件通过props向…

【企业信息化】第8集 免费开源ERP: Odoo 16 Purchase采购管理 改善您的供应链和库存绩效

文章目录 前言一、概览二、主要功能1.自动化采购流程2.供应商价目表和产品库存3.通过采购招标获得最佳要约4.获取采购情况的统计数据5.管理多家公司6.全面地 集成 于其他 Odoo 的应用 总结 前言 轻松管理供应商和采购订单&#xff0c;改善您的供应链和库存绩效。 一、概览 二、…

【极验黑科技】文生图大模型在极验人机对抗领域的应用

自极验于2013年开创性地提出新一代的智能验证码概念开始&#xff0c;就始终在人机对抗领域不停地升级迭代。极验全球首创的“行为式验证”在十多年来&#xff0c;为全球近40万的开发者使用。如小米、新浪微博、东方航空、国家工商局等企业携手极验验证码进行升级&#xff0c;使…

4.AI人工智能大模型汇总:类GPT系列模型、模型中转站Auto-GPT、多模态大模型、视觉模型、自然语言模型

AI人工智能大模型汇总:类GPT系列模型、模型中转站Auto-GPT、多模态大模型、视觉模型、自然语言模型 模型名称发布方类型开源类型原始模型框架paddle版本模型能力模型语言模型参数简介模型链接体验链接paddle版本链接项目链接备注发布日期创建人模型星火认知大模型科大讯飞语言…

RecyclerView使用示例(瀑布流)

RecyclerView使用示例 效果图代码示例ShopFragment.java&#xff08;显示RecyclerView的Fragment&#xff09;fragment_shop.xml&#xff08;相对应的xml文件&#xff09;GoodsData.java&#xff08;数据源&#xff09;GoodsAdapter.java&#xff08;适配器类&#xff09;adapt…

WebGIS支持国内各地方坐标系数据展示的方案

在我们的实际项目开发过程中,会存在着很多的客户提供的数据是地方坐标系的数据,这些数据通常是一些类似于地块数据,点位数据等等的矢量数据。如何加载这些数据可能会让大家有些头疼。我们这篇文章来给大家提供几种解决方案。 首先要清楚一个基础的地理学知识,那就是地理坐…

springboot项目网站部署到服务器

用eclipse跟着教程做了一个网站&#xff0c;java语言&#xff0c;springboot项目。在本地电脑上运行成功后&#xff0c;想把它部署到线上&#xff0c;通过网络访问。下面是我自己作为新手自己摸索出来的一个方法&#xff0c;供读者参考。 目录 1. jar包 2. 服务器 3. jdk 和 T…

virtualbox ubuntu20.04集群网络配置

这个问题困扰我一年之久。 大三学期的课程&#xff0c;因为集群网络问题卡壳。当时查阅各种资料&#xff0c;百度几十篇文章&#xff0c;看博客&#xff0c;甚至是请教老师都没能解决&#xff0c;也因为这个问题导致Hadoop后面都没有实操学习。 今大四毕业之际&#xff0c;又…

react setState 中使用函数替代对象

遇到的问题&#xff1a; 调用很多次 setState, 最后的值并不是我想要的值 -偶现问题(60%) 修改前代码 const [data, setData] useState<T>((options?.initialValues || {}) as T);const resetForm (values: Partial<T>) > {// 常用写法 -此刻data&#xff0…

外链建设技巧,助你成为搜索引擎中的佼佼者!

终于&#xff0c;SEO 系列来到了正篇的终章&#xff0c;恭喜你&#xff0c;你很快就可以向更加专业的 SEO 专家再迈进一步了&#xff01; 今天&#xff0c;我们将和你一起&#xff0c;带上之前所学的知识、技巧&#xff0c;从实战出发&#xff0c;像手术台上的主刀医生那样&am…

16:00面试,16:08就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我…

通过systemctl管理服务

文章目录 通过systemctl管理服务通过systemctl管理单一服务(service unit)使用案例服务启动/关闭/查看的练习关于systemctl命令启动/停止服务后面的后缀名是否加&#xff1f; 通过systemctl查看系统上所有的服务使用案例 通过systemctl管理不同的操作环境(target unit)使用案例…

面试京东失败,再看看2年前的面试题,根本不是一个难度···

刚从京东走出来&#xff0c;被二面难到了&#xff0c;我记得学长两年前去面试的时候&#xff0c;问的问题都特别简单&#xff0c;咋现在难度高了这么多。面试前我也刷过很多的题和看过很多资料&#xff0c;后来想想&#xff0c;这年头网上资料泛滥&#xff0c;测试面试文档更是…

JVM 方法区

栈、堆、方法区的交互关系 线程共享角度: 新建对象分配: 方法区的理解 方法区(Method Area) 与 Java 堆一样&#xff0c;是各个线程共享的内存区域方法区在 JVM 启动的时候被创建&#xff0c;并且它的实际物理内存空间中和 Java 堆区一样都可以不连续的方法区的大小&#xf…