From cf1958c6e8329c84080761f450c7c68ccd2e77d0 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Thu, 14 Dec 2023 19:52:22 +0100 Subject: [PATCH] Implement image origin --- .../Gd/Decoders/BinaryImageDecoder.php | 55 +++++++++++-------- .../Imagick/Decoders/BinaryImageDecoder.php | 6 ++ src/Image.php | 24 ++++++++ src/Interfaces/ImageInterface.php | 16 ++++++ src/Origin.php | 12 ++++ 5 files changed, 89 insertions(+), 24 deletions(-) create mode 100644 src/Origin.php diff --git a/src/Drivers/Gd/Decoders/BinaryImageDecoder.php b/src/Drivers/Gd/Decoders/BinaryImageDecoder.php index 41113756..ce32ddf0 100644 --- a/src/Drivers/Gd/Decoders/BinaryImageDecoder.php +++ b/src/Drivers/Gd/Decoders/BinaryImageDecoder.php @@ -13,6 +13,7 @@ use Intervention\Image\Drivers\Gd\Core; use Intervention\Image\Drivers\Gd\Driver; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Image; +use Intervention\Image\Origin; class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface { @@ -26,13 +27,41 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface return $this->decodeGif($input); // decode (animated) gif } + return $this->decodeString($input); + } + + private function decodeString(string $input): ImageInterface + { + $gd = @imagecreatefromstring($input); + + if ($gd === false) { + throw new DecoderException('Unable to decode input'); + } + + if (!imageistruecolor($gd)) { + imagepalettetotruecolor($gd); + } + + imagesavealpha($gd, true); + // build image instance $image = new Image( new Driver(), - $this->coreFromString($input), + new Core([ + new Frame($gd) + ]), $this->extractExifData($input) ); + if ($info = getimagesizefromstring($input)) { + $image->setOrigin( + new Origin( + $info['mime'], + imagecolorstotal($gd) + ), + ); + } + // fix image orientation return match ($image->exif('IFD0.Orientation')) { 2 => $image->flip(), @@ -46,34 +75,12 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface }; } - private function coreFromString(string $input): Core - { - $data = @imagecreatefromstring($input); - - if ($data === false) { - throw new DecoderException('Unable to decode input'); - } - - if (!imageistruecolor($data)) { - imagepalettetotruecolor($data); - } - - imagesavealpha($data, true); - - return new Core([ - new Frame($data) - ]); - } - private function decodeGif(string $input): ImageInterface { $gif = GifDecoder::decode($input); if (!$gif->isAnimated()) { - return new Image( - new Driver(), - $this->coreFromString($input) - ); + return $this->decodeString($input); } $splitter = GifSplitter::create($gif)->split(); diff --git a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php index 1887ccd1..cb31638c 100644 --- a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php @@ -12,6 +12,7 @@ use Intervention\Image\Image; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Origin; class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface { @@ -54,6 +55,11 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface $this->extractExifData($input) ); + $image->setOrigin(new Origin( + $imagick->getImageMimeType(), + $imagick->getImageColors() + )); + return $image; } } diff --git a/src/Image.php b/src/Image.php index 2815290e..0757e067 100644 --- a/src/Image.php +++ b/src/Image.php @@ -78,6 +78,8 @@ use Intervention\Image\Typography\FontFactory; final class Image implements ImageInterface, Countable { + protected Origin $origin; + public function __construct( protected DriverInterface $driver, protected CoreInterface $core, @@ -105,6 +107,28 @@ final class Image implements ImageInterface, Countable return $this->core; } + /** + * {@inheritdoc} + * + * @see ImageInterface::origin() + */ + public function origin(): Origin + { + return $this->origin; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setOrigin() + */ + public function setOrigin(Origin $origin): ImageInterface + { + $this->origin = $origin; + + return $this; + } + /** * {@inheritdoc} * diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index 99dd1a9c..06868df5 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -4,6 +4,7 @@ namespace Intervention\Image\Interfaces; use Countable; use Intervention\Image\EncodedImage; +use Intervention\Image\Origin; use IteratorAggregate; interface ImageInterface extends IteratorAggregate, Countable @@ -22,6 +23,21 @@ interface ImageInterface extends IteratorAggregate, Countable */ public function core(): CoreInterface; + /** + * Return the origin of the image + * + * @return Origin + */ + public function origin(): Origin; + + /** + * Set the origin of the image + * + * @param Origin $origin + * @return ImageInterface + */ + public function setOrigin(Origin $origin): ImageInterface; + /** * Return width of current image * diff --git a/src/Origin.php b/src/Origin.php new file mode 100644 index 00000000..29028e29 --- /dev/null +++ b/src/Origin.php @@ -0,0 +1,12 @@ +