WINCE使用开源qrencode库生成二维码

本文介绍了如何在Wince系统中使用qrencode开源库来生成二维码,包括下载库文件、创建工程、编译静态库,以及编码字符串和显示二维码图像的步骤。此外,还提及了二维码的校正功能和添加自定义logo的可能性。
摘要由CSDN通过智能技术生成

二维码简介

二维码是一个目前应用范围极广的一种编码方式。通过特定的几何图形,用黑白相间的点组成,利用计算机二进制0,1的概念,将字符串信息编码进图形中。从而可以通过光电扫描设备,如手机等来进行快速识别。

相比于一维条码,二维码存储信息量更大,可靠性高,更易识别,可以在扭曲,部分遮挡的情况下被识别。

qrencode库简介

二位码最常见的编码为QR code,qrencode是一个满足QR code标准的开源库。可以适用于各个平台。

Wince下使用方式

1.可以在GITHUB找到qrencode库最新下载。

2.新建一个wince平台的工程,选择新建c++下smart device的win32工程,选在一个WINCE平台,工程类型选择Static library。

3.将下载的qrencode库里的.h文件及.c文件都添加入工程中,选择编译。

4.编译可能会提示一些环境变量不存在的错误,比如errno = EINVAL;中的EINVAL未定义,将这类代码注释掉,这是因为wince将这部分功能精简掉了。

5.最终编译成功会生成qrencodece.lib,将它和qrencodece.h添加入自己工程便可以使用了。

6.定义一个Qrcode指针,调用方法QRcode_encodeString,传入参数1,要编码的字符串,参数2,编码的纠错等级,参数3,编码模式,通常使用QR_MODE_8,参数4,1或0,表示是否区分大小写。这样就可以获得一个编码后的2进制数组的数据指针。

QRcode* pQRC;
pQRC = QRcode_encodeString(“emtronix”, 0, QR_ECLEVEL_H, QR_MODE_8, 1));

7.将该二维码据显示到屏幕中。

int width = pQRC->width;
    
CBrush brush;
brush.CreateStockObject(LTGRAY_BRUSH);
m_dcMem.FillRect(m_rect,&brush);
brush.DeleteObject();
	
int x, y, l, n;
unsigned char* pData;
pData = pQRC->data;

for (y= 0;y<width;y++)
{
	for (x= 0;x<width;x++)
	{
		if (*pData & 1)
		{
			for (l = 0; l < 8; l++)
			{
				for (n = 0; n < 8; n++)
				{
					m_dcMem.SetPixel(x*8+l, y*8+n,RGB(0,0,0));
				}
			}
		}
		pData++;
	}
}

CDC *pDC=GetDC();
pDC->BitBlt(16, 40, 512, 512, &m_dcMem, 0, 0, SRCCOPY);
ReleaseDC(pDC);
QRcode_free(pQRC);

8.将该二维码数据保存到bmp格式图片文件中。

Width = pQRC->width;
Widthbmp = Width * 8 * 3;
if (Widthbmp % 4) Widthbmp = (Widthbmp / 4 + 1) * 4;
unDataBytes = Widthbmp * Width * 8;

pRGBData = (unsigned char*)malloc(unDataBytes);
memset(pRGBData, 0xff, unDataBytes);

BITMAPFILEHEADER BmpHeader;
BmpHeader.bfType = 0x4d42;  // "BM"
BmpHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
BmpHeader.bfReserved1 = 0;
BmpHeader.bfReserved2 = 0;
BmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
BITMAPINFOHEADER InfoHeader;
InfoHeader.biSize = sizeof(BITMAPINFOHEADER);
InfoHeader.biWidth = Width * 8;
InfoHeader.biHeight = -((int)Width * 8);
InfoHeader.biPlanes = 1;
InfoHeader.biBitCount = 24;
InfoHeader.biCompression = BI_RGB;
InfoHeader.biSizeImage = 0;
InfoHeader.biXPelsPerMeter = 0;
InfoHeader.biYPelsPerMeter = 0;
InfoHeader.biClrUsed = 0;
InfoHeader.biClrImportant = 0;
pSourceData = pQRC->data;
for (y = 0; y < Width; y++)
{
	pDestData = pRGBData + Widthbmp * y * 8;
	for (x = 0; x < Width; x++)
	{
		if (*pSourceData & 1)
		{
			for (l = 0; l < 8; l++)
			{
				for (n = 0; n < 8; n++)
				{
					*(pDestData + n * 3 + Widthbmp * l) = 0;
					*(pDestData + 1 + n * 3 + Widthbmp * l) = 0;
					*(pDestData + 2 + n * 3 + Widthbmp * l) = 0;
				}
			}
		}
		pDestData += 3 * 8;
		pSourceData++;
	}
}

if (!(fopen_s(&f, "test.bmp", "wb")))
{
	fwrite(&BmpHeader, sizeof(BITMAPFILEHEADER), 1, f);
	fwrite(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
	fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
	fclose(f);
}
		
free(pRGBData);
QRcode_free(pQRC);

其它

因为二维码拥有校正功能,所以可以遮挡一部分内容同时不影响识别。常见的二维码中,很多都在中心部位添加上一个自定义的logo,用户可以可以根据自身项目需求直接添加,不需要增加其它操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值