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;
}