VC++生成Data-Matrix格式的二维码




本望断在图像生成Data-Matrix格式的二维码

根据此编写出的生成QR-Code和Data-Matrix的二维码(库)

https://download.csdn.net/download/wangduanqiugao/10383903

本秋高使用到的软件工具:VS2010  dmtx.h  libdmtx-0.7.4.lib(使用以上现有库直接实现功能)

VS2010就不用说了;使用静态库函数的步骤也可以的,此部分作基础就不进行阐述

libdmtx-0.7.4版本参考网址:
https://blog.csdn.net/wangduanqiugao/article/details/78696337(资源包附赠(二维码生成图片小软件))

#include "dmtx.h"
#include <iostream>
using namespace std;

#define PIXEL_COLOR_R			0// Color of bmp pixels
#define PIXEL_COLOR_G			0
#define PIXEL_COLOR_B			0
#define OUT_FILE_PIXEL_PRESCALER	8	
//BMP defines
typedef unsigned short	WORD;
typedef unsigned long	DWORD;
typedef signed long	LONG;
#define BI_RGB          0L

#pragma pack(push, 2) 
typedef struct
{
WORD    bfType;
DWORD   bfSize;
WORD    bfReserved1;
WORD    bfReserved2;
DWORD   bfOffBits;
}
BITMAPFILEHEADER1;

typedef struct
{
DWORD      biSize;
LONG       biWidth;
LONG       biHeight;
WORD       biPlanes;
WORD       biBitCount;
DWORD      biCompression;
DWORD      biSizeImage;
LONG       biXPelsPerMeter;
LONG       biYPelsPerMeter;
DWORD      biClrUsed;
DWORD      biClrImportant;
}
BITMAPINFOHEADER1;
#pragma pack(pop)

bool daixuechuping_Data_Matrix(char *DM_text, char *bmpSavedPath)   
{
size_t          width, height, bytesPerPixel;
string DXstring = DM_text;
const char*	CPsring = bmpSavedPath;
unsigned int	unWidth, i, j,unWidthAdjusted, unDataBytes;
unsigned char*	pRGBData;
unsigned char  *pxl;
DmtxEncode     *enc;
FILE*	       DXCP;

/* 1) ENCODE a new Data Matrix barcode image (in memory only) */
enc = dmtxEncodeCreate();
assert(enc != NULL);
dmtxEncodeDataMatrix(enc, strlen(DXstring.c_str()), (unsigned char*)DXstring.c_str());

/* 2) COPY the new image data before releasing encoding memory */
width = dmtxImageGetProp(enc->image, DmtxPropWidth);
height = dmtxImageGetProp(enc->image, DmtxPropHeight);
bytesPerPixel = dmtxImageGetProp(enc->image, DmtxPropBytesPerPixel);

pxl = (unsigned char *)malloc(width * height * bytesPerPixel);
assert(pxl != NULL);
memcpy(pxl, enc->image->pxl, width * height * bytesPerPixel);
std::string hex(width * height * bytesPerPixel * 3, '\0');
int pos = 0;
long vi = 0;
long vv = 0;
vv = (long) width * height * bytesPerPixel;

for(vi = 0; vi < vv; vi ++)
{
pos += sprintf(&hex.front() + pos, "%02X " , pxl[vi]); //注意02X后有空格
}
int num = 0;
int number = 0;
unsigned char* Dep = (unsigned char*)malloc(width * height / 25);

for (vi = 0; vi < pos - 1; vi += 45)
{if (hex[vi] == 'F')
    {num ++;
     Dep[number] = '0';  //白色
     number ++;
     }
 if (hex[vi] == '0')
    {num ++;
     Dep[number] = '1';  //黑色
     number ++;
     }
 if (num == width / 5)
    {num = 0;
     vi = vi + 45 * width / 5 * (5 - 1);
     }
}
width = width / 5;
height = height / 5; 

        unWidth         = width;                                    //矩阵的维数
        unWidthAdjusted = unWidth * OUT_FILE_PIXEL_PRESCALER * 3;   //每一个维度占的像素的个数(8),每个像素3个字节
        if (unWidthAdjusted % 4)
        {
            unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
        }
        unDataBytes = unWidthAdjusted * unWidth * OUT_FILE_PIXEL_PRESCALER;

        // Allocate pixels buffer
        if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
        {
            return false;
        }

        // Preset to white
        memset(pRGBData, 0xff, unDataBytes);

        // Prepare bmp headers
        BITMAPFILEHEADER1 bmpFileHeader;
        bmpFileHeader.bfType            = 0x4d42;  // "BM"
        bmpFileHeader.bfSize            = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
        bmpFileHeader.bfReserved1       = 0;
        bmpFileHeader.bfReserved2       = 0;
        bmpFileHeader.bfOffBits         = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

        BITMAPINFOHEADER1 bmpInfoHeader;
        bmpInfoHeader.biSize            = sizeof(BITMAPINFOHEADER);
        bmpInfoHeader.biWidth           = unWidth * OUT_FILE_PIXEL_PRESCALER;
        bmpInfoHeader.biHeight          = -((int)unWidth * OUT_FILE_PIXEL_PRESCALER); //负数可以控制图像上下颠倒
        bmpInfoHeader.biPlanes          = 1;
        bmpInfoHeader.biBitCount        = 24;
        bmpInfoHeader.biCompression     = BI_RGB;
        bmpInfoHeader.biSizeImage       = 0;
        bmpInfoHeader.biXPelsPerMeter   = 0;
        bmpInfoHeader.biYPelsPerMeter   = 0;
        bmpInfoHeader.biClrUsed         = 0;
        bmpInfoHeader.biClrImportant    = 0;

        //Convert QrCode bits to bmp pixels
        int iSub = 0, jSub = 0, iCur = 0, jCur = 0;
        for( i = 0; i < width; i++)
        {
            iCur = unWidthAdjusted * i * OUT_FILE_PIXEL_PRESCALER;
            for(j = 0; j < height; j++)
            {
                if(Dep[i * width + j] == '1')
                {
                    for(iSub = 0; iSub < OUT_FILE_PIXEL_PRESCALER; iSub++)
                    {
                        for(jSub = 0; jSub < OUT_FILE_PIXEL_PRESCALER; jSub++)
                        {
                            jCur = iCur + j * 3 * OUT_FILE_PIXEL_PRESCALER + unWidthAdjusted * iSub + jSub * 3;
                            pRGBData[jCur + 0] = PIXEL_COLOR_B;
                            pRGBData[jCur + 1] = PIXEL_COLOR_G;
                            pRGBData[jCur + 2] = PIXEL_COLOR_R;
                        }
                    }
                }
            }

        }

        //Output the bmp file

        if (!(fopen_s(&DXCP, CPsring, "wb")))
        {
            fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER1), 1, DXCP);
            fwrite(&bmpInfoHeader, sizeof(BITMAPINFOHEADER1), 1, DXCP);
            fwrite(pRGBData, sizeof(unsigned char), unDataBytes, DXCP);
            fclose(DXCP);
        }
        else
        {
            return false;
        }

        //Free data
        free(pRGBData);
        return true;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
VC(视觉编码)是一种基于图像处理和分析的技术,用于将实时的视觉输入转化为计算机可识别的数据格式。而Data Matrix是一种二维条码,具有较高的数据密度和可靠性,可用于存储大量数据。 要生成Data Matrix,首先需要使用相机等设备采集图像信息。然后,通过预处理和图像分析算法,将图像中的数据转化为二进制格式。接下来,根据Data Matrix的规范,将二进制数据以特定的编码方式进行格式转换,生成Data Matrix图像。 在生成Data Matrix的过程中,VC起到了至关重要的作用。它可以用于图像预处理,例如去噪、图像增强等,以提高图像质量。然后,通过图像分割和特征提取算法,VC可以识别和定位Data Matrix的几何特征,确定二维条码区域。 接着,VC利用图像解码算法将二维条码中的数据进行解码,得到原始的数据信息。解码过程中涉及到环境光照、图像畸变等问题,VC可以通过相应的算法进行处理和校正。 最后,VC通过将解码后的数据再次编码为Data Matrix格式生成最终的Data Matrix图像。生成的图像可以打印、保存或用于其他需要的应用。 综上所述,VC生成Data Matrix的过程包括图像采集、预处理、特征提取、解码和再编码等步骤。它利用图像处理和分析的技术,将实时的视觉输入转化为计算机可识别的Data Matrix格式,以实现数据的存储和传输。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值