]> git.mxchange.org Git - friendica.git/blobdiff - src/Object/Image.php
Merge pull request #12390 from annando/fixes
[friendica.git] / src / Object / Image.php
index c2cfa9e2f1e8fd260edcbd565daad010b72bf7a3..06498f963fcb859b78d4d96c5381824ddd6b0794 100644 (file)
@@ -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,28 +733,36 @@ class Image
         */
        public function getBlurHash(): string
        {
-               if ($this->isImagick()) {
-                       // Imagick is not supported
+               $image = New Image($this->asString());
+               if (empty($image)) {
                        return '';
                }
 
-               $width = $this->getWidth();
-               $height = $this->getHeight();
+               $width = $image->getWidth();
+               $height = $image->getHeight();
 
                if (max($width, $height) > 90) {
-                       $this->scaleDown(90);
-                       $width = $this->getWidth();
-                       $height = $this->getHeight();
+                       $image->scaleDown(90);
+                       $width = $image->getWidth();
+                       $height = $image->getHeight();
                }
 
                $pixels = [];
                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 ($image->isImagick()) {
+                                       try {
+                                               $colors = $image->image->getImagePixelColor($x, $y)->getColor();
+                                       } catch (\Throwable $th) {
+                                               return '';
+                                       }
+                                       $row[] = [$colors['r'], $colors['g'], $colors['b']];
+                               } else {
+                                       $index = imagecolorat($image->image, $x, $y);
+                                       $colors = @imagecolorsforindex($image->image, $index);
+                                       $row[] = [$colors['red'], $colors['green'], $colors['blue']];
+                               }
                        }
                        $pixels[] = $row;
                }
@@ -775,18 +784,38 @@ class Image
         */
        public function getFromBlurHash(string $blurhash, int $width, int $height)
        {
+               $scaled = Images::getScalingDimensions($width, $height, 90);
+               $pixels = Blurhash::decode($blurhash, $scaled['width'], $scaled['height']);
+
                if ($this->isImagick()) {
-                       // Imagick is not supported
-                       return;
+                       $this->image = new Imagick();
+                       $draw  = new ImagickDraw();
+                       $this->image->newImage($scaled['width'], $scaled['height'], '', 'png');
+               } else {
+                       $this->image = imagecreatetruecolor($scaled['width'], $scaled['height']);
                }
 
-               $pixels = Blurhash::decode($blurhash, $width, $height);
-               $this->image  = imagecreatetruecolor($width, $height);
-               for ($y = 0; $y < $height; ++$y) {
-                       for ($x = 0; $x < $width; ++$x) {
+               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));
+                               }
                        }
                }
+
+               if ($this->isImagick()) {
+                       $this->image->drawImage($draw);
+               } else {
+                       $this->width  = imagesx($this->image);
+                       $this->height = imagesy($this->image);
+               }
+
+               $this->valid = true;
+
+               $this->scaleUp(min($width, $height));
        }
 }