From 6c34213acadef488616904f07fdfbb21ea69592f Mon Sep 17 00:00:00 2001 From: codemasher Date: Tue, 7 Dec 2021 01:05:03 +0100 Subject: [PATCH] :octocat: allow contrast adjustment and grayscaling in the reader --- src/Decoder/GDLuminanceSource.php | 30 ++++++++----- src/Decoder/IMagickLuminanceSource.php | 32 ++++++++------ src/Decoder/LuminanceSourceAbstract.php | 14 +++--- src/Decoder/LuminanceSourceInterface.php | 8 +++- src/QRCode.php | 4 +- src/QROptions.php | 4 +- src/QROptionsTrait.php | 18 ++++++-- tests/QRCodeReaderTest.php | 52 ++++++++++++++--------- tests/qrcodes/example_svg_dots.png | Bin 0 -> 45081 bytes 9 files changed, 108 insertions(+), 54 deletions(-) create mode 100644 tests/qrcodes/example_svg_dots.png diff --git a/src/Decoder/GDLuminanceSource.php b/src/Decoder/GDLuminanceSource.php index db4cc1344..ee959c03a 100644 --- a/src/Decoder/GDLuminanceSource.php +++ b/src/Decoder/GDLuminanceSource.php @@ -13,9 +13,10 @@ namespace chillerlan\QRCode\Decoder; +use chillerlan\Settings\SettingsContainerInterface; use function file_get_contents, get_resource_type, imagecolorat, imagecolorsforindex, - imagecreatefromstring, imagesx, imagesy, is_resource; -use const PHP_MAJOR_VERSION; + imagecreatefromstring, imagefilter, imagesx, imagesy, is_resource; +use const IMG_FILTER_BRIGHTNESS, IMG_FILTER_CONTRAST, IMG_FILTER_GRAYSCALE, PHP_MAJOR_VERSION; /** * This class is used to help decode images from files which arrive as GD Resource @@ -35,7 +36,7 @@ final class GDLuminanceSource extends LuminanceSourceAbstract{ * * @throws \chillerlan\QRCode\Decoder\QRCodeDecoderException */ - public function __construct($gdImage){ + public function __construct($gdImage, SettingsContainerInterface $options = null){ /** @noinspection PhpFullyQualifiedNameUsageInspection */ if( @@ -45,7 +46,7 @@ final class GDLuminanceSource extends LuminanceSourceAbstract{ throw new QRCodeDecoderException('Invalid GD image source.'); } - parent::__construct(imagesx($gdImage), imagesy($gdImage)); + parent::__construct(imagesx($gdImage), imagesy($gdImage), $options); $this->gdImage = $gdImage; @@ -56,6 +57,16 @@ final class GDLuminanceSource extends LuminanceSourceAbstract{ * */ private function setLuminancePixels():void{ + + if($this->options->readerGrayscale){ + imagefilter($this->gdImage, IMG_FILTER_GRAYSCALE); + } + + if($this->options->readerIncreaseContrast){ + imagefilter($this->gdImage, IMG_FILTER_BRIGHTNESS, -100); + imagefilter($this->gdImage, IMG_FILTER_CONTRAST, -100); + } + for($j = 0; $j < $this->height; $j++){ for($i = 0; $i < $this->width; $i++){ $argb = imagecolorat($this->gdImage, $i, $j); @@ -64,18 +75,17 @@ final class GDLuminanceSource extends LuminanceSourceAbstract{ $this->setLuminancePixel($pixel['red'], $pixel['green'], $pixel['blue']); } } + } /** @inheritDoc */ - public static function fromFile(string $path):self{ - $path = self::checkFile($path); - - return new self(imagecreatefromstring(file_get_contents($path))); + public static function fromFile(string $path, SettingsContainerInterface $options = null):self{ + return new self(imagecreatefromstring(file_get_contents(self::checkFile($path))), $options); } /** @inheritDoc */ - public static function fromBlob(string $blob):self{ - return new self(imagecreatefromstring($blob)); + public static function fromBlob(string $blob, SettingsContainerInterface $options = null):self{ + return new self(imagecreatefromstring($blob), $options); } } diff --git a/src/Decoder/IMagickLuminanceSource.php b/src/Decoder/IMagickLuminanceSource.php index c0356ed47..edf8a3975 100644 --- a/src/Decoder/IMagickLuminanceSource.php +++ b/src/Decoder/IMagickLuminanceSource.php @@ -13,6 +13,7 @@ namespace chillerlan\QRCode\Decoder; +use chillerlan\Settings\SettingsContainerInterface; use Imagick; use function count; @@ -31,8 +32,8 @@ final class IMagickLuminanceSource extends LuminanceSourceAbstract{ * * @throws \InvalidArgumentException */ - public function __construct(Imagick $imagick){ - parent::__construct($imagick->getImageWidth(), $imagick->getImageHeight()); + public function __construct(Imagick $imagick, SettingsContainerInterface $options = null){ + parent::__construct($imagick->getImageWidth(), $imagick->getImageHeight(), $options); $this->imagick = $imagick; @@ -43,29 +44,36 @@ final class IMagickLuminanceSource extends LuminanceSourceAbstract{ * */ private function setLuminancePixels():void{ - $this->imagick->setImageColorspace(Imagick::COLORSPACE_GRAY); + + if($this->options->readerGrayscale){ + $this->imagick->setImageColorspace(Imagick::COLORSPACE_GRAY); + } + + if($this->options->readerIncreaseContrast){ + for($i = 0; $i < 10; $i++){ + $this->imagick->contrastImage(0); + } + } + $pixels = $this->imagick->exportImagePixels(1, 1, $this->width, $this->height, 'RGB', Imagick::PIXEL_CHAR); + $count = count($pixels); - $countPixels = count($pixels); - - for($i = 0; $i < $countPixels; $i += 3){ + for($i = 0; $i < $count; $i += 3){ $this->setLuminancePixel($pixels[$i] & 0xff, $pixels[$i + 1] & 0xff, $pixels[$i + 2] & 0xff); } } /** @inheritDoc */ - public static function fromFile(string $path):self{ - $path = self::checkFile($path); - - return new self(new Imagick($path)); + public static function fromFile(string $path, SettingsContainerInterface $options = null):self{ + return new self(new Imagick(self::checkFile($path)), $options); } /** @inheritDoc */ - public static function fromBlob(string $blob):self{ + public static function fromBlob(string $blob, SettingsContainerInterface $options = null):self{ $im = new Imagick; $im->readImageBlob($blob); - return new self($im); + return new self($im, $options); } } diff --git a/src/Decoder/LuminanceSourceAbstract.php b/src/Decoder/LuminanceSourceAbstract.php index 1fa3dabda..8b6221bea 100644 --- a/src/Decoder/LuminanceSourceAbstract.php +++ b/src/Decoder/LuminanceSourceAbstract.php @@ -11,6 +11,8 @@ namespace chillerlan\QRCode\Decoder; +use chillerlan\QRCode\QROptions; +use chillerlan\Settings\SettingsContainerInterface; use function array_slice, array_splice, file_exists, is_file, is_readable, realpath; /** @@ -24,6 +26,8 @@ use function array_slice, array_splice, file_exists, is_file, is_readable, realp */ abstract class LuminanceSourceAbstract implements LuminanceSourceInterface{ + /** @var \chillerlan\QRCode\QROptions|\chillerlan\Settings\SettingsContainerInterface */ + protected SettingsContainerInterface $options; protected array $luminances; protected int $width; protected int $height; @@ -31,11 +35,11 @@ abstract class LuminanceSourceAbstract implements LuminanceSourceInterface{ /** * */ - public function __construct(int $width, int $height){ - $this->width = $width; - $this->height = $height; - // In order to measure pure decoding speed, we convert the entire image to a greyscale array - // up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. + public function __construct(int $width, int $height, SettingsContainerInterface $options = null){ + $this->width = $width; + $this->height = $height; + $this->options = $options ?? new QROptions; + $this->luminances = []; } diff --git a/src/Decoder/LuminanceSourceInterface.php b/src/Decoder/LuminanceSourceInterface.php index 871e381c4..56ecbb86b 100644 --- a/src/Decoder/LuminanceSourceInterface.php +++ b/src/Decoder/LuminanceSourceInterface.php @@ -48,8 +48,14 @@ interface LuminanceSourceInterface{ */ public function getRow(int $y):array; - + /** + * Creates a LuminanceSource instance from the given file + */ public static function fromFile(string $path):self; + + /** + * Creates a LuminanceSource instance from the given data blob + */ public static function fromBlob(string $blob):self; } diff --git a/src/QRCode.php b/src/QRCode.php index da5c67ae6..b6d23d661 100755 --- a/src/QRCode.php +++ b/src/QRCode.php @@ -340,14 +340,14 @@ class QRCode{ * Reads a QR Code from a given file */ public function readFromFile(string $path):DecoderResult{ - return $this->readFromSource($this->options->getLuminanceSourceFQCN()::fromFile($path)); + return $this->readFromSource($this->options->getLuminanceSourceFQCN()::fromFile($path, $this->options)); } /** * Reads a QR Code from the given data blob */ public function readFromBlob(string $blob):DecoderResult{ - return $this->readFromSource($this->options->getLuminanceSourceFQCN()::fromBlob($blob)); + return $this->readFromSource($this->options->getLuminanceSourceFQCN()::fromBlob($blob, $this->options)); } /** diff --git a/src/QROptions.php b/src/QROptions.php index b10105d88..6f5c10ea5 100644 --- a/src/QROptions.php +++ b/src/QROptions.php @@ -53,7 +53,9 @@ use chillerlan\Settings\SettingsContainerAbstract; * @property string|null $imagickBG * @property string $fpdfMeasureUnit * @property array|null $moduleValues - * @property bool $useImagickIfAvailable + * @property bool $readerUseImagickIfAvailable + * @property bool $readerGrayscale + * @property bool $readerIncreaseContrast */ class QROptions extends SettingsContainerAbstract{ use QROptionsTrait; diff --git a/src/QROptionsTrait.php b/src/QROptionsTrait.php index 475cde55d..342959e95 100644 --- a/src/QROptionsTrait.php +++ b/src/QROptionsTrait.php @@ -270,7 +270,19 @@ trait QROptionsTrait{ /** * use Imaagick (if available) when reading QR Codes */ - protected bool $useImagickIfAvailable = false; + protected bool $readerUseImagickIfAvailable = false; + + /** + * grayscale the image before reading + */ + protected bool $readerGrayscale = false; + + /** + * increase the contrast before reading + * + * note that applying contrast works different in GD and Imagick, so mileage may vary + */ + protected bool $readerIncreaseContrast = false; /** * clamp min/max version number @@ -385,7 +397,7 @@ trait QROptionsTrait{ * enables Imagick for the QR Code reader if the extension is available */ protected function set_useImagickIfAvailable(bool $useImagickIfAvailable):void{ - $this->useImagickIfAvailable = $useImagickIfAvailable && extension_loaded('imagick'); + $this->readerUseImagickIfAvailable = $useImagickIfAvailable && extension_loaded('imagick'); } /** @@ -395,7 +407,7 @@ trait QROptionsTrait{ */ public function getLuminanceSourceFQCN():string{ // i still hate this - return $this->useImagickIfAvailable + return $this->readerUseImagickIfAvailable ? IMagickLuminanceSource::class : GDLuminanceSource::class; } diff --git a/tests/QRCodeReaderTest.php b/tests/QRCodeReaderTest.php index 3d98ef1ce..5d396b743 100644 --- a/tests/QRCodeReaderTest.php +++ b/tests/QRCodeReaderTest.php @@ -12,6 +12,7 @@ namespace chillerlan\QRCodeTest; +use chillerlan\Settings\SettingsContainerInterface; use Exception, Generator; use chillerlan\QRCode\Common\{EccLevel, Mode, Version}; use chillerlan\QRCode\{QRCode, QROptions}; @@ -34,6 +35,12 @@ class QRCodeReaderTest extends TestCase{ .'They say everything looks better with odd numbers of things. But sometimes I put even numbers—just ' .'to upset the critics. We\'ll lay all these little funky little things in there. '; + protected SettingsContainerInterface $options; + + protected function setUp():void{ + $this->options = new QROptions; + } + public function qrCodeProvider():array{ return [ 'helloworld' => ['hello_world.png', 'Hello world!'], @@ -51,6 +58,7 @@ class QRCodeReaderTest extends TestCase{ 'tilted' => ['tilted.png', 'Hello world!'], // tilted 22° CCW 'rotated' => ['rotated.png', 'Hello world!'], // rotated 90° CW 'gradient' => ['example_svg.png', 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'], // color gradient (from svg example) + 'dots' => ['example_svg_dots.png', 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'], // color gradient (from svg example) ]; } @@ -58,7 +66,11 @@ class QRCodeReaderTest extends TestCase{ * @dataProvider qrCodeProvider */ public function testReaderGD(string $img, string $expected):void{ - $this::assertSame($expected, (string)(new QRCode)->readFromSource(GDLuminanceSource::fromFile(__DIR__.'/qrcodes/'.$img))); + $this->options->readerGrayscale = true; + $this->options->readerIncreaseContrast = true; + + $this::assertSame($expected, (string)(new QRCode) + ->readFromSource(GDLuminanceSource::fromFile(__DIR__.'/qrcodes/'.$img, $this->options))); } /** @@ -70,26 +82,28 @@ class QRCodeReaderTest extends TestCase{ $this::markTestSkipped('imagick not installed'); } - // Y THO?? https://github.com/chillerlan/php-qrcode/runs/4270411373 - // "could not find enough finder patterns" - if($img === 'example_svg.png' && PHP_OS_FAMILY === 'Windows' && PHP_VERSION_ID < 80100){ - $this::markTestSkipped('random gradient example issue??'); + $this->options->readerGrayscale = true; + $this->options->readerIncreaseContrast = true; + + if($img === 'damaged.png'){ + // for some reason that don't work for the damaged example, GD does a better job here + $this->options->readerIncreaseContrast = false; } - $this::assertSame($expected, (string)(new QRCode)->readFromSource(IMagickLuminanceSource::fromFile(__DIR__.'/qrcodes/'.$img))); + $this::assertSame($expected, (string)(new QRCode) + ->readFromSource(IMagickLuminanceSource::fromFile(__DIR__.'/qrcodes/'.$img, $this->options))); } public function testReaderMultiSegment():void{ - $options = new QROptions; - $options->outputType = QRCode::OUTPUT_IMAGE_PNG; - $options->imageBase64 = false; + $this->options->outputType = QRCode::OUTPUT_IMAGE_PNG; + $this->options->imageBase64 = false; $numeric = '123456789012345678901234567890'; $alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:'; $kanji = '茗荷茗荷茗荷茗荷'; $byte = 'https://smiley.codes/qrcode/'; - $qrcode = (new QRCode($options)) + $qrcode = (new QRCode($this->options)) ->addNumericSegment($numeric) ->addAlphaNumSegment($alphanum) ->addKanjiSegment($kanji) @@ -119,22 +133,20 @@ class QRCodeReaderTest extends TestCase{ * @dataProvider dataTestProvider */ public function testReadData(Version $version, EccLevel $ecc, string $expected):void{ - $options = new QROptions; - - $options->outputType = QRCode::OUTPUT_IMAGE_PNG; -# $options->imageTransparent = false; - $options->eccLevel = $ecc->getLevel(); - $options->version = $version->getVersionNumber(); - $options->imageBase64 = false; - $options->useImagickIfAvailable = true; + $this->options->outputType = QRCode::OUTPUT_IMAGE_PNG; +# $this->options->imageTransparent = false; + $this->options->eccLevel = $ecc->getLevel(); + $this->options->version = $version->getVersionNumber(); + $this->options->imageBase64 = false; + $this->options->readerUseImagickIfAvailable = true; // what's interesting is that a smaller scale seems to produce fewer reader errors??? // usually from version 20 up, independend of the luminance source // scale 1-2 produces none, scale 3: 1 error, scale 4: 6 errors, scale 5: 5 errors, scale 10: 10 errors // @see \chillerlan\QRCode\Detector\GridSampler::checkAndNudgePoints() - $options->scale = 2; + $this->options->scale = 2; try{ - $qrcode = new QRCode($options); + $qrcode = new QRCode($this->options); $imagedata = $qrcode->render($expected); $result = $qrcode->readFromBlob($imagedata); } diff --git a/tests/qrcodes/example_svg_dots.png b/tests/qrcodes/example_svg_dots.png new file mode 100644 index 0000000000000000000000000000000000000000..c51cbd4d92ef962432f82a552d5c61be4ffa79ce GIT binary patch literal 45081 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

V088}7TZN5GAgmDh{bd|#s|6eOqQ#8T zcXgB+?TvRHM&c@9HJD~D+!)@_2cW>-eD-e_dLp9ez4L`iTk9Ws3tr|R=SIlQQCkxg z2R=$u)g*W{NQkMZu3uLKjj1t}UHhHzv-Sa%u-y;-sO%csPzkhKE-HzW$JkjG-&FBN zU3n;Us>Qmv;laq%NCc}C!)h0$5rCLt$A!Eo=GVLfTp3C{Ar>WghdilE9)tT_ z#A<4#DJs!J!&!!IH{GgAqV~}{5u3)EwO9u|&vcQEpHGEyhB%E@b1+TQzr`&kq_Z}v z>D!uW7X*M|G(mr?iEIDQ>-BrB0{_?RGmZ}fXI{`mHgK@hEqq8~fR1h{5Ao@l25yag zg@TPClp=(Wi|BjJ526{s>^!c<9}Od zsKHcXPH@{yS{1Lqgoly{Hn5>;0k%va*X8GxODciWck~2-br&q#_%ndqsWvJRqjf74 zNtL0D5xM(w2a1>)z!SIto`A-~+pg6+uHPuMcp0pRJW04`)0l^Gt;xpzwsJ|s9X%}s zyaDgW0q1sn&Rl%DH5ywcH<-{cGdeW7k81pz14XkGJo>|evg(TMkIRFspBrYB%1zM{ zC;Ds~29H8EwBf4q#Y1t6!vX;j4swT|vQOO{GlF6u8&SG1m%gQPO~>5hCfK1Rxf_k0 z{bwbOmZQ=o(U82>+qHst(K#oiwZ?-d}je8{g|y3%aEbU5PaLeeN<(Wqccxnr+ZM!RD# zw=rTkwPN=(q3J!&T7^(P^Cp>g{A}h{5avW_sB(wwmWkuGi}zs7MtIsLUKL&cet5)T z=#zg*&&)?I$kN_W!Wp8XPe7>Pw33w!jf+jURuXzxD zyN!s^wM)-Z5d+=ohU%VlqxSxH9ED5kHLgI6wrAK%&*xD0-*`OKQQ5jZHv!8Mwq*5V)K zYFXQ9pTLN7ou}9V*6mzHfMs&S?q_C@qdlycbsfD(X4QeH!K;gis2+jJ@|ZNVyc-`p ztYDvLI7pS1w)IvVcG(2wc7bS*tyBg*kL~W}R8{(C0RPhBk2!QGyHw_$v)&w!5J>|G zBZF>Lbnvk4+6^Kik=u!xE|U!bDo1(XaW^%zePiHou>BfL_&w+HWIabxHI+e!j3D=Y zd>89EovHCE1Khz3g=ubRH&$#acK{0ss8YA*2$Fwta`vn5(Wlxhe5IsJ=Z`?%^Szjd z;h#dRw-8?Fdw>S1GUjhFcDV_i`w3Ayd83|TeRVA zGI~C$U}Nt^EzrvH{w72a8>te(Nj8vCECFx;c<;=~e783<@nJ$fER>(IJbTo58SOow zO*rAL-T z(4HhVA-kq8SHm+s9LY8=+>2bO7sCnP#GX4qvR!9c4^z9slv(U5s?Ggsa7+>{MfW2W zeZKqMk7RrLNdeF@ha6=WAIbyg@=Y=8^Kt_p$>u_<%xIkGLYH^G?HPhxa!?%!4TUC- zJ`##NqaHSu$iBG|DEcyy)OOtrM|!!{8UXA7_3JUfCMh(o;tZQitogce!T@mg?MRNa zdTu1?`~PQO-tK>APZ%0zUY_So;^KNRw!cP7cnwWw!?sCI6Z62GJaXu;>h8yMKRbK% zYO;^p{8WyFhU9xrZRKkWhNUvNfcp>tMoo|?f&8i!QR1>zq4Pm=f)-~#yM59kZ0b>L zoV@;xOgc$ZPz6|VW0p`H&5prm&VSs%XHYQACr3e%CU^)zQ&N~lE|zb z|68vH!Pr7G(*mSjaGL@Y*~fXSUPyAq<7Iy{j(KRUvZLe?q?XII<~fY*od`Dot$G2d z4xBqd4W&6#Qwbherf9a19it#AHv<_b;+Z!bFvm3O^HIdbplvDoTSR_3l>MTLTWk^h zkIfCZO>wS(uc*6hU%Dl=vKLD9A+?-5>u7PJQ1YxNXNamX??q$lwY1s5lEdSjr>l#v z{6~)`AF$N&vi@gn{>p|~4-X{#$&%%SS*M?`-w4=~vw>%um}q68;u`B=iL{kptzZDQ zMu^45>bYl0(q^94pSSZd63DvQaJLhEfIY(Pnt*_0l|jxDWmK)<<8$qAojqE3AlFb1EZAPgRi z27rkur~nn^a&954LovJU-@_Bej3`6B<9=^U>95?7DYf5Mt&p{@dB9+=@tK9eUSX~O z)ztZHI%16%h_sytI6p4`cq!vYKY+>+R|4Im89%#9FE_ zJQ69z+b0f?=%f3sy6_*or_|Tjc&s-w-v6bur<}Rv%Bvw~u?wrOh5%g)5xf)Dp(Zwa zom}7p$9eN9j8l)&5Q!dCV5mYu!5ACQP|EO7UU664ma_Y?+I-Fz-H>Ikrb_0pbN0Mu zIycX<*XGiGC!0fhA8pWRp{?;)7b}p$F~&}a_2KE9CiFa;Vs`swzAZ*jRW;X>MB~r8 z>cE}-FLq5hqmk8JlEHt=&ss1G7<5pW$|XM4({eBk1G)xB-c-rcC^X1-= zWFr*pvo~wZtX?RWK>zU`c;z7yRv6$u#3*(ov7}hj$0^SwCFDe#QF_pJH)21c

hw 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

@JIcc_Ep^F Hhra&@I^3hR literal 0 HcmV?d00001