File indexing completed on 2024-04-28 04:20:03
0001 /* 0002 SPDX-FileCopyrightText: 2022 Friedrich W. H. Kossebau <kossebau@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include "scanimagerunner.hpp" 0008 0009 // own 0010 #include "scanresult.hpp" 0011 #include "scanresult_p.hpp" 0012 // ZXing 0013 #include <ZXing/ReadBarcode.h> 0014 0015 namespace Kodaskanna 0016 { 0017 0018 ScanImageRunner::ScanImageRunner(const QImage &image) 0019 : m_image(image) 0020 { 0021 } 0022 0023 ZXing::ImageFormat zxingImageFormatFromQImage(const QImage &image) 0024 { 0025 switch (image.format()) { 0026 case QImage::Format_ARGB32: 0027 case QImage::Format_RGB32: 0028 #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN 0029 return ZXing::ImageFormat::BGRX; 0030 #else 0031 return ZXing::ImageFormat::XRGB; 0032 #endif 0033 case QImage::Format_RGB888: 0034 return ZXing::ImageFormat::RGB; 0035 case QImage::Format_RGBX8888: 0036 case QImage::Format_RGBA8888: 0037 return ZXing::ImageFormat::RGBX; 0038 case QImage::Format_Grayscale8: 0039 return ZXing::ImageFormat::Lum; 0040 default: 0041 return ZXing::ImageFormat::None; 0042 } 0043 } 0044 0045 ZXing::Result readBarcode(const QImage &image, ZXing::DecodeHints decodeHints) 0046 { 0047 return ZXing::ReadBarcode({image.bits(), image.width(), image.height(), zxingImageFormatFromQImage(image), static_cast<int>(image.bytesPerLine())}, decodeHints); 0048 } 0049 0050 void ScanImageRunner::run() 0051 { 0052 ZXing::DecodeHints decodeHints; 0053 decodeHints.setFormats(ZXing::BarcodeFormat::Any); 0054 decodeHints.setTryRotate(false); 0055 decodeHints.setBinarizer(ZXing::Binarizer::FixedThreshold); 0056 0057 const bool isSupportedQImageFormat = (zxingImageFormatFromQImage(m_image) == ZXing::ImageFormat::None); 0058 ZXing::Result result = 0059 isSupportedQImageFormat ? readBarcode(m_image.convertToFormat(QImage::Format_RGBX8888), decodeHints) : readBarcode(m_image, decodeHints); 0060 0061 auto *resultData = new ScanResultPrivate; 0062 ScanResult scanResult(resultData); 0063 0064 resultData->isSuccess = result.isValid(); 0065 if (resultData->isSuccess) { 0066 resultData->text = QString::fromStdWString(result.text()); 0067 resultData->bytes = QByteArray(reinterpret_cast<const char *>(result.rawBytes().data()), result.rawBytes().size()); 0068 } 0069 0070 Q_EMIT scanFinished(scanResult); 0071 } 0072 0073 }