2012-02-12 47 views
3

我在iOS项目中使用zxing库。这是一个阅读和创建QR码的库。反转像素 - zxing

从我的研究和浏览网页围绕图像进行解码的过程是由这步骤:

  • 需要从源的图像,
  • 所有像素转换为255灰度等级
  • 解码数据

这个特定的库不支持的一件事是读取/解码(我敢肯定,这也缺少创建)QRCodes反转。

倒QR二维码与普通码基本相同 - >但倒置的颜色(白色是黑色,黑色是白色)。但是因为QRCodes标准没有描述倒转的QRCodes实现,并且在zxing项目网站上有一些要求和问题,所以我必须自己实施。

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

grayData_是一个unsigned char*数据类型。在这个变量里面有来自灰色的灰度像素。

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

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

如何添加/编辑Android应用程序中的C++代码? – 2016-12-12 15:11:41

+0

弗朗西斯,你有没有把你在iOS上用ZXing支持倒置条形码的改变放到一个开源的repo中,其他人可以使用它呢?我们需要相同的功能。谢谢! – Uniphonic 2017-02-23 17:18:32

回答

2

您不希望将值作为字符打印,因为它们不是ASCII。打印出来的unsigneds:

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

可以简化循环简单地

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

其它转换都是正常积分的推广。

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

+0

谢谢你的帮助!我还在该方法中添加了一些逻辑,它每三次扫描一次反向代码'if((tmp%3 == 0)){...}' – 2012-02-13 17:43:05

+0

非常感谢。这个答案是一个生命的救星:) – 2014-01-03 18:59:08

+0

@smparkes我如何添加/编辑Android应用程序中的C++代码? – 2016-12-13 00:40:04