VC++ 生成二维码

1.用到libqrencode

2.主要代码:

int Text2BmpX(char* szFile, char* szQrData)

 {

     unsigned int    unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;

     unsigned char* pRGBData, *pSourceData, *pDestData;

     QRcode* pQRC;

     FILE* f;

     if (pQRC = QRcode_encodeString(szQrData, 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, szFile, "wb")))

         {

             fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);

             fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);

             fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);

             fclose(f);

         }

         else

         {

             WriteLog(LOG,"Unable to open file");

             exit(-1);

         }

         // Free data

         free(pRGBData);

         QRcode_free(pQRC);

     }

     else

     {

         WriteLog(LOG,"NULL returned");

         exit(-1);

     }

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值