Merge pull request #12336 from annando/imagick-blurhash
Support blurhash for Imagick
This commit is contained in:
commit
38fa76d6b5
1 changed files with 32 additions and 20 deletions
|
@ -25,6 +25,7 @@ use Exception;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Util\Images;
|
use Friendica\Util\Images;
|
||||||
use Imagick;
|
use Imagick;
|
||||||
|
use ImagickDraw;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use GDImage;
|
use GDImage;
|
||||||
use kornrunner\Blurhash\Blurhash;
|
use kornrunner\Blurhash\Blurhash;
|
||||||
|
@ -64,7 +65,7 @@ class Image
|
||||||
}
|
}
|
||||||
$this->type = $type;
|
$this->type = $type;
|
||||||
|
|
||||||
if ($this->isImagick() && $this->loadData($data)) {
|
if ($this->isImagick() && (empty($data) || $this->loadData($data))) {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// Failed to load with Imagick, fallback
|
// Failed to load with Imagick, fallback
|
||||||
|
@ -732,11 +733,6 @@ class Image
|
||||||
*/
|
*/
|
||||||
public function getBlurHash(): string
|
public function getBlurHash(): string
|
||||||
{
|
{
|
||||||
if ($this->isImagick()) {
|
|
||||||
// Imagick is not supported
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$width = $this->getWidth();
|
$width = $this->getWidth();
|
||||||
$height = $this->getHeight();
|
$height = $this->getHeight();
|
||||||
|
|
||||||
|
@ -750,10 +746,14 @@ class Image
|
||||||
for ($y = 0; $y < $height; ++$y) {
|
for ($y = 0; $y < $height; ++$y) {
|
||||||
$row = [];
|
$row = [];
|
||||||
for ($x = 0; $x < $width; ++$x) {
|
for ($x = 0; $x < $width; ++$x) {
|
||||||
$index = imagecolorat($this->image, $x, $y);
|
if ($this->isImagick()) {
|
||||||
$colors = @imagecolorsforindex($this->image, $index);
|
$colors = $this->image->getImagePixelColor($x, $y)->getColor();
|
||||||
|
$row[] = [$colors['r'], $colors['g'], $colors['b']];
|
||||||
$row[] = [$colors['red'], $colors['green'], $colors['blue']];
|
} else {
|
||||||
|
$index = imagecolorat($this->image, $x, $y);
|
||||||
|
$colors = @imagecolorsforindex($this->image, $index);
|
||||||
|
$row[] = [$colors['red'], $colors['green'], $colors['blue']];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$pixels[] = $row;
|
$pixels[] = $row;
|
||||||
}
|
}
|
||||||
|
@ -775,25 +775,37 @@ class Image
|
||||||
*/
|
*/
|
||||||
public function getFromBlurHash(string $blurhash, int $width, int $height)
|
public function getFromBlurHash(string $blurhash, int $width, int $height)
|
||||||
{
|
{
|
||||||
if ($this->isImagick()) {
|
|
||||||
// Imagick is not supported
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scaled = Images::getScalingDimensions($width, $height, 90);
|
$scaled = Images::getScalingDimensions($width, $height, 90);
|
||||||
$pixels = Blurhash::decode($blurhash, $scaled['width'], $scaled['height']);
|
$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 ($y = 0; $y < $scaled['height']; ++$y) {
|
||||||
for ($x = 0; $x < $scaled['width']; ++$x) {
|
for ($x = 0; $x < $scaled['width']; ++$x) {
|
||||||
[$r, $g, $b] = $pixels[$y][$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);
|
if ($this->isImagick()) {
|
||||||
$this->height = imagesy($this->image);
|
$this->image->drawImage($draw);
|
||||||
$this->valid = true;
|
} else {
|
||||||
|
$this->width = imagesx($this->image);
|
||||||
|
$this->height = imagesy($this->image);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->valid = true;
|
||||||
|
|
||||||
$this->scaleUp(min($width, $height));
|
$this->scaleUp(min($width, $height));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue