反转像素-zxing

Invert pixels - zxing

本文关键字:-zxing 像素      更新时间:2023-10-16

我在iOS项目中使用zxing库。这是一个用于阅读和创建二维码的图书馆。

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

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

这个特定库不支持的一件事是读取/解码反向QRCodes(我很确定在创建时也缺少这一点)。

倒置二维码基本上与普通码相同->但有倒置的颜色(白色为黑色,黑色为白色)。但由于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变量中的数据不太满意。

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

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

您可以将循环简化为简单的

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

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

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