这可能看起来很幼稚,但是我试图弄清楚如何使用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码?
答案 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;
}