From 6deb93256a15fb1e5bf19881e2ba2793612d06e3 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 5 Dec 2022 06:53:19 +0000 Subject: [PATCH] Support blurhash for Imagick --- src/Object/Image.php | 52 +++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/Object/Image.php b/src/Object/Image.php index 8a47d8e88d..a79f3a5688 100644 --- a/src/Object/Image.php +++ b/src/Object/Image.php @@ -25,6 +25,7 @@ use Exception; use Friendica\DI; use Friendica\Util\Images; use Imagick; +use ImagickDraw; use ImagickPixel; use GDImage; use kornrunner\Blurhash\Blurhash; @@ -64,7 +65,7 @@ class Image } $this->type = $type; - if ($this->isImagick() && $this->loadData($data)) { + if ($this->isImagick() && (empty($data) || $this->loadData($data))) { return; } else { // Failed to load with Imagick, fallback @@ -732,11 +733,6 @@ class Image */ public function getBlurHash(): string { - if ($this->isImagick()) { - // Imagick is not supported - return ''; - } - $width = $this->getWidth(); $height = $this->getHeight(); @@ -750,10 +746,14 @@ class Image for ($y = 0; $y < $height; ++$y) { $row = []; for ($x = 0; $x < $width; ++$x) { - $index = imagecolorat($this->image, $x, $y); - $colors = @imagecolorsforindex($this->image, $index); - - $row[] = [$colors['red'], $colors['green'], $colors['blue']]; + if ($this->isImagick()) { + $colors = $this->image->getImagePixelColor($x, $y)->getColor(); + $row[] = [$colors['r'], $colors['g'], $colors['b']]; + } else { + $index = imagecolorat($this->image, $x, $y); + $colors = @imagecolorsforindex($this->image, $index); + $row[] = [$colors['red'], $colors['green'], $colors['blue']]; + } } $pixels[] = $row; } @@ -775,25 +775,37 @@ class Image */ public function getFromBlurHash(string $blurhash, int $width, int $height) { - if ($this->isImagick()) { - // Imagick is not supported - return; - } - $scaled = Images::getScalingDimensions($width, $height, 90); $pixels = Blurhash::decode($blurhash, $scaled['width'], $scaled['height']); - $this->image = imagecreatetruecolor($scaled['width'], $scaled['height']); + if ($this->isImagick()) { + $this->image = new Imagick(); + $draw = new ImagickDraw(); + $this->image->newImage($scaled['width'], $scaled['height'], '', 'png'); + } else { + $this->image = imagecreatetruecolor($scaled['width'], $scaled['height']); + } + for ($y = 0; $y < $scaled['height']; ++$y) { for ($x = 0; $x < $scaled['width']; ++$x) { [$r, $g, $b] = $pixels[$y][$x]; - imagesetpixel($this->image, $x, $y, imagecolorallocate($this->image, $r, $g, $b)); + if ($this->isImagick()) { + $draw->setFillColor("rgb($r, $g, $b)"); + $draw->point($x, $y); + } else { + imagesetpixel($this->image, $x, $y, imagecolorallocate($this->image, $r, $g, $b)); + } } } - $this->width = imagesx($this->image); - $this->height = imagesy($this->image); - $this->valid = true; + if (!$this->isImagick()) { + $this->width = imagesx($this->image); + $this->height = imagesy($this->image); + } else { + $this->image->drawImage($draw); + } + + $this->valid = true; $this->scaleUp(min($width, $height)); }