1
0
mirror of https://github.com/Intervention/image.git synced 2025-08-25 23:06:13 +02:00
This commit is contained in:
Oliver Vogel
2021-10-30 16:29:05 +00:00
parent f48a206fdf
commit 8c2766bcba
10 changed files with 35 additions and 31 deletions

View File

@@ -55,14 +55,14 @@ abstract class AbstractImage
return $this->loops; return $this->loops;
} }
public function size(): SizeInterface public function getSize(): SizeInterface
{ {
return new Size($this->width(), $this->height()); return new Size($this->width(), $this->height());
} }
public function getResizer(): Resizer public function getResizer(): Resizer
{ {
return new Resizer($this->size()); return new Resizer($this->getSize());
} }
public function isAnimated(): bool public function isAnimated(): bool
@@ -77,17 +77,17 @@ abstract class AbstractImage
public function encode(EncoderInterface $encoder): EncodedImage public function encode(EncoderInterface $encoder): EncodedImage
{ {
return new EncodedImage($encoder->encode($this)); return $encoder->encode($this);
} }
public function toJpeg(?int $quality = null): string public function toJpeg(?int $quality = null): EncodedImage
{ {
return $this->encode( return $this->encode(
$this->resolveDriverClass('Encoders\JpegEncoder', $quality) $this->resolveDriverClass('Encoders\JpegEncoder', $quality)
); );
} }
public function toGif(): string public function toGif(): EncodedImage
{ {
return $this->encode( return $this->encode(
$this->resolveDriverClass('Encoders\GifEncoder') $this->resolveDriverClass('Encoders\GifEncoder')

View File

@@ -2,25 +2,28 @@
namespace Intervention\Image\Drivers\Gd\Encoders; namespace Intervention\Image\Drivers\Gd\Encoders;
use Intervention\Gif\Builder as GifBuilder;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
use Intervention\Gif\Builder as GifBuilder;
class GifEncoder extends AbstractEncoder implements EncoderInterface class GifEncoder extends AbstractEncoder implements EncoderInterface
{ {
public function encode(ImageInterface $image): string public function encode(ImageInterface $image): EncodedImage
{ {
if ($image->isAnimated()) { if ($image->isAnimated()) {
return $this->encodeAnimated($image); return $this->encodeAnimated($image);
} }
return $this->getBuffered(function () use ($image) { $data = $this->getBuffered(function () use ($image) {
imagegif($image->getFrames()->first()->getCore()); imagegif($image->getFrames()->first()->getCore());
}); });
return new EncodedImage($data, 'image/gif');
} }
protected function encodeAnimated($image): string protected function encodeAnimated($image): EncodedImage
{ {
$builder = GifBuilder::canvas($image->width(), $image->height(), $image->loops()); $builder = GifBuilder::canvas($image->width(), $image->height(), $image->loops());
foreach ($image as $key => $frame) { foreach ($image as $key => $frame) {
@@ -28,6 +31,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
$builder->addFrame($source, $frame->getDelay()); $builder->addFrame($source, $frame->getDelay());
} }
return $builder->encode(); return new EncodedImage($builder->encode(), 'image/gif');
} }
} }

View File

@@ -3,15 +3,18 @@
namespace Intervention\Image\Drivers\Gd\Encoders; namespace Intervention\Image\Drivers\Gd\Encoders;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
class JpegEncoder extends AbstractEncoder implements EncoderInterface class JpegEncoder extends AbstractEncoder implements EncoderInterface
{ {
public function encode(ImageInterface $image): string public function encode(ImageInterface $image): EncodedImage
{ {
return $this->getBuffered(function () use ($image) { $data = $this->getBuffered(function () use ($image) {
imagejpeg($image->getFrames()->first()->getCore(), null, $this->quality); imagejpeg($image->getFrames()->first()->getCore(), null, $this->quality);
}); });
return new EncodedImage($data, 'image/jpeg');
} }
} }

View File

@@ -4,12 +4,13 @@ namespace Intervention\Image\Drivers\Imagick\Encoders;
use Imagick; use Imagick;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
class GifEncoder extends AbstractEncoder implements EncoderInterface class GifEncoder extends AbstractEncoder implements EncoderInterface
{ {
public function encode(ImageInterface $image): string public function encode(ImageInterface $image): EncodedImage
{ {
$format = 'gif'; $format = 'gif';
$compression = Imagick::COMPRESSION_LZW; $compression = Imagick::COMPRESSION_LZW;
@@ -26,6 +27,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
$gif->setImageCompression($compression); $gif->setImageCompression($compression);
$gif = $gif->deconstructImages(); $gif = $gif->deconstructImages();
return $gif->getImagesBlob(); return new EncodedImage($gif->getImagesBlob(), 'image/gif');
} }
} }

View File

@@ -4,12 +4,13 @@ namespace Intervention\Image\Drivers\Imagick\Encoders;
use Imagick; use Imagick;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
class JpegEncoder extends AbstractEncoder implements EncoderInterface class JpegEncoder extends AbstractEncoder implements EncoderInterface
{ {
public function encode(ImageInterface $image): string public function encode(ImageInterface $image): EncodedImage
{ {
$format = 'jpeg'; $format = 'jpeg';
$compression = Imagick::COMPRESSION_JPEG; $compression = Imagick::COMPRESSION_JPEG;
@@ -24,6 +25,6 @@ class JpegEncoder extends AbstractEncoder implements EncoderInterface
$imagick->setCompressionQuality($this->quality); $imagick->setCompressionQuality($this->quality);
$imagick->setImageCompressionQuality($this->quality); $imagick->setImageCompressionQuality($this->quality);
return $imagick->getImagesBlob(); return new EncodedImage($imagick->getImagesBlob(), 'image/jpeg');
} }
} }

View File

@@ -9,9 +9,10 @@ class EncodedImage
protected $data; protected $data;
protected $mimetype; protected $mimetype;
public function __construct(string $data) public function __construct(string $data, string $mimetype = 'application/octet-stream')
{ {
$this->data = $data; $this->data = $data;
$this->mimetype = $mimetype;
} }
public function save(string $filepath): void public function save(string $filepath): void
@@ -26,7 +27,7 @@ class EncodedImage
public function toDataUrl(): string public function toDataUrl(): string
{ {
return ''; return sprintf('data:%s;base64,%s', $this->mimetype, base64_encode($this->data));
} }
public function __toString(): string public function __toString(): string

View File

@@ -2,7 +2,9 @@
namespace Intervention\Image\Interfaces; namespace Intervention\Image\Interfaces;
use Intervention\Image\EncodedImage;
interface EncoderInterface interface EncoderInterface
{ {
public function encode(ImageInterface $image): string; public function encode(ImageInterface $image): EncodedImage;
} }

View File

@@ -6,7 +6,7 @@ use Intervention\Image\EncodedImage;
interface ImageInterface interface ImageInterface
{ {
public function size(): SizeInterface; public function getSize(): SizeInterface;
public function width(): int; public function width(): int;
public function height(): int; public function height(): int;
public function isAnimated(): bool; public function isAnimated(): bool;

View File

@@ -39,15 +39,8 @@ class ImageTest extends TestCase
$this->assertEquals(2, $this->image->height()); $this->assertEquals(2, $this->image->height());
} }
public function testSize(): void public function testGetSize(): void
{ {
$this->assertInstanceOf(Size::class, $this->image->size()); $this->assertInstanceOf(Size::class, $this->image->getSize());
}
public function testResize(): void
{
$this->assertInstanceOf(Image::class, $this->image->resize(function ($size) {
$size->width(300);
}));
} }
} }

View File

@@ -44,8 +44,8 @@ class ImageTest extends TestCase
$this->assertEquals(2, $this->image->height()); $this->assertEquals(2, $this->image->height());
} }
public function testSize(): void public function testGetSize(): void
{ {
$this->assertInstanceOf(Size::class, $this->image->size()); $this->assertInstanceOf(Size::class, $this->image->getSize());
} }
} }