+ if (empty($width) || empty($height)) {
+ return '';
+ }
+
+ $pixels = [];
+ for ($y = 0; $y < $height; ++$y) {
+ $row = [];
+ for ($x = 0; $x < $width; ++$x) {
+ 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;
+ }
+
+ // The components define the amount of details (1 to 9).
+ $components_x = 9;
+ $components_y = 9;
+
+ return Blurhash::encode($pixels, $components_x, $components_y);
+ }
+
+ /**
+ * Create an image out of a blurhash
+ *
+ * @param string $blurhash
+ * @param integer $width
+ * @param integer $height
+ * @return void
+ */
+ 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()) {
+ $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];
+ 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);
+ $this->width = $this->image->getImageWidth();
+ $this->height = $this->image->getImageHeight();
+ } else {
+ $this->width = imagesx($this->image);
+ $this->height = imagesy($this->image);
+ }
+
+ $this->valid = !empty($this->image);
+
+ $this->scaleUp(min($width, $height));