我正在iOS项目中使用zxing库。它是一个用于阅读和创建QR码的库。
通过我在网上的研究和浏览,解码图像的过程由以下步骤完成:
这个特定库不支持的一件事是反转QRCodes的读取/解码(我很确定在创建中也缺少这个)。
反向QR码与普通代码基本相同 - >但是颜色反转(白色为黑色,黑色为白色)。但由于QRCodes标准没有描述反转的QRCodes实现,而且在zxing项目网站上有一些请求和问题,我必须自己实现。
下面的方法是插入一些逻辑来反转像素(unsigned char*
)的好地方,但由于我没有使用C ++,结果就是写作。
grayData_
是unsigned char*
数据类型。在这个变量里面有来自源的grayScaled像素。
我想做的是反转这些像素。
如果我说得对,这是由unsigned char cz = (255 - val);
完成的?
unsigned char* GreyscaleLuminanceSource::getMatrix() {
int size = width_ * height_;
unsigned char* result = new unsigned char[size];
if (left_ == 0 && top_ == 0 && dataWidth_ == width_ && dataHeight_ == height_) {
memcpy(result, greyData_, size);
} else {
for (int row = 0; row < height_; row++) {
memcpy(result + row * width_, greyData_ + (top_ + row) * dataWidth_ + left_, width_);
}
}
//return result;
//from this point down is my implementation
printf(" %c", result[200]);
printf(" %c", result[600]);
printf(" %c", result[6000]);
printf(" %c", result[7000]);
for (int i = 0; i < size; i++)
{
int val = static_cast<int>(result[i]);
unsigned char cz = (255 - val);
result[i] = cz;
}
printf("******\n");
printf(" %c", result[200]); //prints a " " char to console/terminal
printf(" %c", result[600]); //prints a " " char to console/terminal
printf(" %c", result[6000]); //prints a " " char to console/terminal
printf(" %c", result[7000]); //prints a " " char to console/terminal
return result;
}
这是反转像素的正确方法吗?我对改变result
变量中的数据感到高兴。
答案 0 :(得分:2)
您不希望将值打印为字符,因为它们不是ASCII。将它们打印为无符号:
printf(" %u", ...);
您可以将循环简化为
result[i] = static_cast<unsigned char>(255 - result[i]);
其他转换是正常的整体促销。
你应该注意到ZXing在识别代码时使用了一些非对称启发式算法。如果您没有围绕代码的保护区域,在这种情况下是黑色(因为保护区域应该是白色的),它可能无法识别代码。