Qt 识别 DM 码
识别普通二维码网上库很多,这个库专门识别 DM码
下载libdmtx
https://github.com/dmtx/libdmtx
添加源码到Qt 工程
libdmtx.pri
INCLUDEPATH +=$$PWD
HEADERS += \
$$PWD/libdmtx/dmtx.h \
$$PWD/libdmtx/dmtxstatic.h
SOURCES += \
$$PWD/libdmtx/dmtx.c \
$$PWD/libdmtx/dmtxbytelist.c \
$$PWD/libdmtx/dmtxdecode.c \
$$PWD/libdmtx/dmtxdecodescheme.c \
$$PWD/libdmtx/dmtxencode.c \
$$PWD/libdmtx/dmtxencodeascii.c \
$$PWD/libdmtx/dmtxencodebase256.c \
$$PWD/libdmtx/dmtxencodec40textx12.c \
$$PWD/libdmtx/dmtxencodeedifact.c \
$$PWD/libdmtx/dmtxencodeoptimize.c \
$$PWD/libdmtx/dmtxencodescheme.c \
$$PWD/libdmtx/dmtxencodestream.c \
$$PWD/libdmtx/dmtximage.c \
$$PWD/libdmtx/dmtxmatrix3.c \
$$PWD/libdmtx/dmtxmessage.c \
$$PWD/libdmtx/dmtxplacemod.c \
$$PWD/libdmtx/dmtxreedsol.c \
$$PWD/libdmtx/dmtxregion.c \
$$PWD/libdmtx/dmtxscangrid.c \
$$PWD/libdmtx/dmtxsymbol.c \
$$PWD/libdmtx/dmtxtime.c \
$$PWD/libdmtx/dmtxvector2.c
使用
在.pro添加
include($$PWD/libdmtx.pri)
它给的例子是使用opencv的cv::mat,这里我们用QImage取代它
#include "libdmtx/dmtx.h"
int QRCodeTool::dataMatrixDecode(const QString &imageName)
{
QImage image;
if(!image.load(imageName)){
qWarning()<<"image load fail !!!";
return -1;
}
if(image.format() == QImage::Format_Mono){
image = image.convertToFormat(QImage::Format_ARGB32);
qDebug()<<"image.format() "<<image.format();
}
int pack = DmtxPack32bppXRGB;
switch(image.format())
{
case QImage::Format_ARGB32:
pack = DmtxPack32bppXRGB;
break;
case QImage::Format_RGB32:
pack = DmtxPack32bppXRGB;
break;
case QImage::Format_RGB888:
pack = DmtxPack24bppRGB;
break;
case QImage::Format_Indexed8:
pack = DmtxPack8bppK;
break;
case QImage::Format_Grayscale8:
pack = DmtxPack8bppK;
}
int width = image.width();
int height = image.height();
DmtxImage* img = dmtxImageCreate(image.bits(), width, height, pack);//DmtxPack32bppRGBX,DmtxPack24bppRGB
if (!img) {
fprintf(stderr, "dmtx image create fail\n");
return -1;
}
DmtxDecode *dec = dmtxDecodeCreate(img, 1);
DmtxRegion *reg = Q_NULLPTR;
DmtxMessage *msg = Q_NULLPTR;
reg = dmtxRegionFindNext(dec, Q_NULLPTR);
if (reg) //如果检测到存在DM码区域
{
msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined); //解析DM码
if (msg) //如果DM码解析成功
{
std::cout << "DataMatrix Decode Result: " << msg->output << std::endl;
dmtxMessageDestroy(&msg);
}
dmtxRegionDestroy(®);
}
dmtxDecodeDestroy(&dec);
dmtxImageDestroy(&img);
return 0;
}