libqrencode不会生成QR码

时间:2017-05-14 07:16:50

标签: c++

这可能看起来很幼稚,但是我试图弄清楚如何使用libqrencode制作QR码时,我已经头撞墙了两天。我在网上找到的所有东西都要求"我如何使用libqrencode制作图像"哼哼哼哼“也许你可以做到这一点,但它并没有真正成为一个可用的形象'

我可以:

QRcode *qrcode;
qrcode = QRcode_encodeString("This is my text", 4, QR_ECLEVEL_H, QR_MODE_8, 0);

整天,并将数据编码到一个结构中,因为我的QR码扫描器不会扫描结构,它会扫描QR码。

我能够实现这一目标的唯一方法是:

string name= "\'this is my text\'";
string s2 = "qrencode -l L -v 1 -o output.png " + name;
system(s2.c_str());

这让我不寒而栗,因为我讨厌进行系统调用(我希望这个小程序可以移植)。

我知道有一些明显缺失的东西,因为libqrencode在没有实际制作QR码的情况下毫无用处,但是我错过了什么?如何使用libqrencode创建实际的QR码?

2 个答案:

答案 0 :(得分:2)

根据找到的文档here,libqrencode只返回一个包含生成图像所需信息的数组。要获得实际图像,您需要执行以下操作:

for(int i = 0; i < qrcode->width; ++i)
{
    for(int j = 0; j < qrcode->width; ++j)
    {
        if(qrcode->data[i * qrcode->width + j] & 1)
        {
            // draw black dot at (i,j)
        }
        else
        {
            // draw white dot at (i,j)
        }
    }
}

答案 1 :(得分:0)

仍然感到沮丧,我做了一些更深入的搜索,找到了qrenc.c here的代码。我只是偷了一个png的部分。一点点的努力让它发挥作用。我想我会分享这个片段,因为我自己无法轻易找到如何做到这一点的明确答案。我已经在这里声明了所有变量,只要你安装了libqrenc和libpng,这个代码应该是开箱即用的(复制粘贴)。

鲍勃是你的叔叔。 :)

#include <stdio.h>
#include "qrencode.h"
#include <errno.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include<iostream>
#include<numeric>
#include <png.h>

using namespace std;
#define INCHES_PER_METER (100.0/2.54)

static int casesensitive = 0;
static int eightbit = 0;
static int version = 0;
static int size = 3;
static int margin = 3;
static int dpi = 72;
static int structured = 0;
static int rle = 0;
static int micro = 0;
static QRecLevel level = QR_ECLEVEL_L;
static QRencodeMode hint = QR_MODE_8;
static unsigned int fg_color[4] = {0, 0, 0, 255};
static unsigned int bg_color[4] = {255, 255, 255, 255};

static int writePNG(QRcode *qrcode, const char *outfile);

int main()
{
const char * line = "The stuff you want to encode";
        QRcode *myqrcode;
        myqrcode = QRcode_encodeString(line, 4, QR_ECLEVEL_H, QR_MODE_8,1);
        writePNG(myqrcode,"filename.png");
        QRcode_free(myqrcode);
return 0;
}



static int writePNG(QRcode *qrcode, const char *outfile)
{
    static FILE *fp; // avoid clobbering by setjmp.
    png_structp png_ptr;
    png_infop info_ptr;
    png_colorp palette;
    png_byte alpha_values[2];
    unsigned char *row, *p, *q;
    int x, y, xx, yy, bit;
    int realwidth;

    realwidth = (qrcode->width + margin * 2) * size;
    row = (unsigned char *)malloc((realwidth + 7) / 8);
    if(row == NULL) {
        fprintf(stderr, "Failed to allocate memory.\n");
        exit(EXIT_FAILURE);
    }

    if(outfile[0] == '-' && outfile[1] == '\0') {
        fp = stdout;
    } else {
        fp = fopen(outfile, "wb");
        if(fp == NULL) {
            fprintf(stderr, "Failed to create file: %s\n", outfile);
            perror(NULL);
            exit(EXIT_FAILURE);
        }
    }

    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if(png_ptr == NULL) {
        fprintf(stderr, "Failed to initialize PNG writer.\n");
        exit(EXIT_FAILURE);
    }

    info_ptr = png_create_info_struct(png_ptr);
    if(info_ptr == NULL) {
        fprintf(stderr, "Failed to initialize PNG write.\n");
        exit(EXIT_FAILURE);
    }

    if(setjmp(png_jmpbuf(png_ptr))) {
        png_destroy_write_struct(&png_ptr, &info_ptr);
        fprintf(stderr, "Failed to write PNG image.\n");
        exit(EXIT_FAILURE);
    }

    palette = (png_colorp) malloc(sizeof(png_color) * 2);
    if(palette == NULL) {
        fprintf(stderr, "Failed to allocate memory.\n");
        exit(EXIT_FAILURE);
    }
    palette[0].red   = fg_color[0];
    palette[0].green = fg_color[1];
    palette[0].blue  = fg_color[2];
    palette[1].red   = bg_color[0];
    palette[1].green = bg_color[1];
    palette[1].blue  = bg_color[2];
    alpha_values[0] = fg_color[3];
    alpha_values[1] = bg_color[3];
    png_set_PLTE(png_ptr, info_ptr, palette, 2);
    png_set_tRNS(png_ptr, info_ptr, alpha_values, 2, NULL);

    png_init_io(png_ptr, fp);
    png_set_IHDR(png_ptr, info_ptr,
        realwidth, realwidth,
        1,
        PNG_COLOR_TYPE_PALETTE,
        PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT,
        PNG_FILTER_TYPE_DEFAULT);
png_set_pHYs(png_ptr, info_ptr,
        dpi * INCHES_PER_METER,
        dpi * INCHES_PER_METER,
        PNG_RESOLUTION_METER);
png_write_info(png_ptr, info_ptr);

/* top margin */
memset(row, 0xff, (realwidth + 7) / 8);
for(y=0; y<margin * size; y++) {
    png_write_row(png_ptr, row);
}

/* data */
p = qrcode->data;
for(y=0; y<qrcode->width; y++) {
    bit = 7;
    memset(row, 0xff, (realwidth + 7) / 8);
    q = row;
    q += margin * size / 8;
    bit = 7 - (margin * size % 8);
    for(x=0; x<qrcode->width; x++) {
        for(xx=0; xx<size; xx++) {
            *q ^= (*p & 1) << bit;
            bit--;
            if(bit < 0) {
                q++;
                bit = 7;
            }
        }
        p++;
    }
    for(yy=0; yy<size; yy++) {
        png_write_row(png_ptr, row);
    }
}
/* bottom margin */
memset(row, 0xff, (realwidth + 7) / 8);
for(y=0; y<margin * size; y++) {
    png_write_row(png_ptr, row);
}

png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, &info_ptr);

fclose(fp);
free(row);
free(palette);

return 0;

}