LINUX.ORG.RU

Библиотека для работы с Data Matrix

 data matrix, , ,


0

1

Подскажите, есть ли свободная библиотека для работы с Data Matrix, которая позволяет получить результат сканирования не в виде расшифрованного кода, а в виде данных картинки, т.е. условно говоря, двухмерный массив бит, соответствующих картинке?

★★★★
Ответ на: комментарий от dataman

Язык программирования не особо важен: если лучший вариант для Python – будет скрипт на Python, если для C++, будет программа для C++. То есть, задача такая: есть плохо читаемые коды Data Matrix, хочется их сделать более чёткими, не меняя при этом сканер штрих-кодов. Т.е. нужно получить штрих-код, повторить его в виде картинки и сохранить, простая программа, тут можно не особо заморачиваться выбором языка, а идти от библиотеки, которая с этими кодами работает.

askh ★★★★
() автор топика
Ответ на: комментарий от askh

если для C++, будет программа для C++

Тогда предложу очевидную https://github.com/zxing-cpp/zxing-cpp.

Если скомпилировать проект с опцией CMake -DZXING_EXPERIMENTAL_API=ON, то в консольный пример ZXingReader добавится опция -symbol, выводящая в консоль картинку, используя символы " ", «▀», «▄», «█».

Для этого используется функция WriteBarcodeToUtf8:

std::string WriteBarcodeToUtf8(const Barcode& barcode, [[maybe_unused]] const WriterOptions& options)
{
        auto iv = barcode.symbol();
        if (!iv.data())
                return {};

        constexpr auto map = std::array{" ", "▀", "▄", "█"};
        std::ostringstream res;
        bool invert = !options.invert();

        Image buffer;
        if (options.addQuietZones()) {
                buffer = Image(iv.width() + 2, iv.height() + 2);
                memset(const_cast<uint8_t*>(buffer.data()), 0xff, buffer.rowStride() * buffer.height());
                for (int y = 0; y < iv.height(); y++)
                        memcpy(const_cast<uint8_t*>(buffer.data(1, y + 1)), iv.data(0, y), iv.width());
                iv = IsLinearBarcode(barcode.format()) ? iv.cropped(0, 1, buffer.width(), buffer.height() - 2) : buffer;
        }

        for (int y = 0; y < iv.height(); y += 2) {
                // for linear barcodes, only print line pairs that are distinct from the previous one
                if (IsLinearBarcode(barcode.format()) && y > 1 && y < iv.height() - 1
                        && memcmp(iv.data(0, y), iv.data(0, y - 2), 2 * iv.rowStride()) == 0)
                        continue;

                for (int x = 0; x < iv.width(); ++x) {
                        int tp = bool(*iv.data(x, y)) ^ invert;
                        int bt = (iv.height() == 1 && tp) || (y + 1 < iv.height() && (bool(*iv.data(x, y + 1)) ^ invert));
                        res << map[tp | (bt << 1)];
                }
                res << '\n';
        }

        return res.str();
}

}

Думаю, что доступ к данным iv – то, что нужно.
Если я правильно понял задачу. :)

dataman ★★★★★
()