反转像素 - zxing

时间:2012-02-12 14:26:26

标签: c++ ios decode zxing

我正在iOS项目中使用zxing库。它是一个用于阅读和创建QR码的库。

通过我在网上的研究和浏览,解码图像的过程由以下步骤完成:

  • 从源头拍摄图片
  • 将所有像素转换为255灰度
  • 解码数据

这个特定库不支持的一件事是反转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变量中的数据感到高兴。

1 个答案:

答案 0 :(得分:2)

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

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

您可以将循环简化为

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

其他转换是正常的整体促销。

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