【问题标题】:Invert pixels - zxing反转像素 - zxing
【发布时间】:2012-02-12 14:26:25
【问题描述】:

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

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

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

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

倒转二维码与普通码基本相同->但颜色倒转(白色为黑色,黑色为白色)。但是因为二维码标准没有描述倒置二维码的实现,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 变量中的数据不太满意。

【问题讨论】:

  • 如何在 Android 应用程序中添加/编辑该 C++ 代码?
  • 弗朗西斯,您是否已将您在 iOS 上使用 ZXing 支持倒排条码所做的更改放入了其他人可能可以使用的开源存储库中?我们需要相同的功能。谢谢!

标签: c++ ios decode zxing


【解决方案1】:

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

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

您可以将循环简化为简单

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

其他转换都是正常的积分提升。

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

【讨论】:

  • 感谢您的帮助!我还在该方法中添加了一些逻辑,它每三次扫描一次反转代码if((tmp % 3 == 0)) { ... }
  • 非常感谢。这个答案是救命稻草:)
  • @smparkes 如何在 Android 应用程序中添加/编辑该 C++ 代码?
  • 抱歉,不能说。 Android普遍使用Java版本,C++版本已被封存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2018-05-03
  • 2011-02-09
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多