当前位置: 首页 > 工具软件 > libqrencode > 使用案例 >

libqrencode自定义二维码生成图片的尺寸 C++

那鹏
2023-12-01

libqrencode生成的二维码太小,需要根据实际需要进行放大,参考其他博客的方法,进行了修改,此方法还有缺陷,实际尺寸跟输入值有点出入,不过可以使用

int QRcodeRest(char* str)
{
	int PIXEL_PRESCALER = 8;//每个像素放大倍数
	int PIXEL_COLOR_R = 0;// RGB数值
	int PIXEL_COLOR_G = 0;// RGB数值
	int PIXEL_COLOR_B = 0;// RGB数值

	char* szSourceSring = str;
	unsigned int    unWidth, x, y, m, n, unWidthAdjusted, unDataBytes,size;
	unsigned char* pRGBData, * pSourceData, * pDestData;
	QRcode* pQRC;
	if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_M, QR_MODE_8, 1))
	{
		size = 188;//设置生成图像大小为188,实际尺寸跟这个值有出入
		unWidth = pQRC->width;		
		PIXEL_PRESCALER = round((float)size / unWidth);//计算放大倍数,四舍五入
		int biWidth = unWidth * PIXEL_PRESCALER;
		unWidthAdjusted = unWidth * PIXEL_PRESCALER * 3;//放大后图像的宽度
		unDataBytes = unWidthAdjusted * unWidth * PIXEL_PRESCALER;

		// 分配像素缓存
		if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
		{
			return 0;
		}
		// 设置为白色
		memset(pRGBData, 0xff, unDataBytes);		

		pSourceData = pQRC->data;
		//逐行设置像素值,先y再x
		for (y = 0; y < unWidth; y++)
		{
			pDestData = pRGBData + unWidthAdjusted * y * PIXEL_PRESCALER; 
			for (x = 0; x < unWidth; x++)
			{
				if (*pSourceData & 1)
				{
					//白色方块,长宽大小为OUT_FILE_PIXEL_PRESCALER的立方体
					for (m = 0; m < PIXEL_PRESCALER; m++)
					{
						for (n = 0; n < PIXEL_PRESCALER; n++)
						{//BGR为3个值,每次跳3个
							*(pDestData + n * 3 + unWidthAdjusted * m) = PIXEL_COLOR_B;
							*(pDestData + 1 + n * 3 + unWidthAdjusted * m) = PIXEL_COLOR_G;
							*(pDestData + 2 + n * 3 + unWidthAdjusted * m) = PIXEL_COLOR_R;
						}
					}
				}
				pDestData += 3 * PIXEL_PRESCALER;  //游标每次移动,3*放大倍数
				pSourceData++;
			}
		}

		// 使用OpenCV库将原始二维码数据转换为图片
		cv::Mat qrCodeMat = cv::Mat(pQRC->width, pQRC->width, CV_8U);
		for (int i = 0; i < pQRC->width; ++i) {
			for (int j = 0; j < pQRC->width; ++j)
			{
				qrCodeMat.at<uchar>(i, j) = (pQRC->data[i * pQRC->width + j] & 0x01) == 0x01 ? 0 : 255;
			}
		}
		// 使用OpenCV库将放大后的二维码数据转换为图片
		//pDestData相当于pRGBData的游标,pDestData的指向的地址会变化,所以要用pRGBData
		Mat img(biWidth, biWidth, CV_8UC3, pRGBData);
		// 释放缓存
		free(pRGBData);
		QRcode_free(pQRC);
	}
	else
	{
		return 0;
	}
	return 0;
}

参考:关于bmp格式详解_nihaowzw的博客-CSDN博客

 类似资料: