二维码解码器-Quirc使用教程
一.描述
quirc是一款专用于识别二维码(不能识别一维码)的开源软件。它比zbar轻量一些,跟zbar一样能扫描码流和静态图片识别条形码,
库文件总共6个文件,非常的小,编译之后的静态库只有25kb。官方代码是依赖libjpg库和linpng库进行解码转换成灰度后再进行二维码检测的。本次仅仅传入灰度图片进行解码,将不依赖jpeg和png进行二维码检测功能
二.使用样例
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <ctype.h>
#include <quirc.h>
#include <setjmp.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
static void rgb888tomonochrome(uint8_t *rgb_data, int width, int height, uint8_t *dst)
{
int i, j;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
unsigned char *pixel = rgb_data + (i * width + j) * 3;
unsigned char r = pixel[0];
unsigned char g = pixel[1];
unsigned char b = pixel[2];
*(dst++) = (r + g + b) / 3;
}
}
}
int main(int argc, char **argv)
{
/*读rgb数据*/
if (argc != 4)
{
printf("failed:argc=%d\n", argc);
return 0;
}
/*读取文件*/
int image_width = atoi(argv[1]);
int image_hight = atoi(argv[2]);
const int iamge_size = image_width * image_hight * 3;
uint8_t *image_buffer = (uint8_t *)malloc(iamge_size);
if (image_buffer == NULL)
{
printf("malloc failed \n");
return 0;
}
int fd = open(argv[3], O_RDONLY);
read(fd, image_buffer, iamge_size);
close(fd);
/*创建解码器*/
struct quirc *qr_coder = quirc_new();
if (qr_coder == NULL)
{
printf("create quirc new failed \n");
return -1;
}
/*设置解码的分辨率*/
if (quirc_resize(qr_coder, image_width, image_hight) < 0)
{
printf("quirce size failed \n");
goto finish;
}
uint8_t *image_mono_buf = quirc_begin(qr_coder, NULL, NULL);
rgb888tomonochrome(image_buffer, image_width, image_hight, image_mono_buf);
quirc_end(qr_coder);
int qr_count = quirc_count(qr_coder);
printf("find qrcode count:%d\n", qr_count);
for (int i = 0; i < qr_count; i++)
{
struct quirc_code code;
struct quirc_data data;
quirc_extract(qr_coder, i, &code);
quirc_decode_error_t err = quirc_decode(&code, &data);
if (err == QUIRC_ERROR_DATA_ECC)
{
quirc_flip(&code);
err = quirc_decode(&code, &data);
}
if (!err)
{
printf("%s\n", data.payload);
}
}
quirc_destroy(qr_coder);
finish:
if (image_buffer)
{
free(image_buffer);
}
return -1;
}