反转像素 – zxing

我在iOS项目中使用zxing库。 这是一个阅读和创buildQR码的库。

从我对networking的研究和浏览中,解码图像的过程是由以下步骤组成的:

  • 从源头上获取图像,
  • 将所有像素转换为255灰度
  • 解码数据

有一件事是不被这个特定的库支持读取/解码(我敢肯定,这是创build还缺less)倒QRCodes。

倒QR二维码与普通码基本相同 – >但倒置的颜色(白色是黑色,黑色是白色)。 但是由于QRCodes标准没有描述倒QRCode的实现,在zxing项目网站上有一些要求和问题,我必须自己来实现。

下面的方法是插入一些逻辑来反转像素( unsigned char* )的好地方,但是由于我没有使用C ++的经验,结果是这样写的。

grayData_是一个unsigned char*数据types。 在这个variables里面有来自灰色的灰度像素。

我想要做的是颠倒这些像素。

如果我是正确的,这是由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; } 

这是反转像素的正确方法吗? 而且我不太喜欢改变resultvariables中的数据。

您不希望将值作为字符打印,因为它们不是ASCII。 将它们打印为无符号:

 printf(" %u", ...); 

您可以简化循环

 result[i] = static_cast<unsigned char>(255 - result[i]); 

其他转换是正常的整体提升。

而你应该注意到ZXing在识别代码时使用了一些不对称的启发式。 如果在这种情况下,没有围绕代码的防护区域(由于防护区域应该是白色的),所以可能无法识别代码。