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;
}
public function size(): SizeInterface
public function getSize(): SizeInterface
{
return new Size($this->width(), $this->height());
}
public function getResizer(): Resizer
{
return new Resizer($this->size());
return new Resizer($this->getSize());
}
public function isAnimated(): bool
@@ -77,17 +77,17 @@ abstract class AbstractImage
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(
$this->resolveDriverClass('Encoders\JpegEncoder', $quality)
);
}
public function toGif(): string
public function toGif(): EncodedImage
{
return $this->encode(
$this->resolveDriverClass('Encoders\GifEncoder')

View File

@@ -2,25 +2,28 @@
namespace Intervention\Image\Drivers\Gd\Encoders;
use Intervention\Gif\Builder as GifBuilder;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface;
use Intervention\Gif\Builder as GifBuilder;
class GifEncoder extends AbstractEncoder implements EncoderInterface
{
public function encode(ImageInterface $image): string
public function encode(ImageInterface $image): EncodedImage
{
if ($image->isAnimated()) {
return $this->encodeAnimated($image);
}
return $this->getBuffered(function () use ($image) {
$data = $this->getBuffered(function () use ($image) {
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());
foreach ($image as $key => $frame) {
@@ -28,6 +31,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
$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;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface;
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);
});
return new EncodedImage($data, 'image/jpeg');
}
}

View File

@@ -4,12 +4,13 @@ namespace Intervention\Image\Drivers\Imagick\Encoders;
use Imagick;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface;
class GifEncoder extends AbstractEncoder implements EncoderInterface
{
public function encode(ImageInterface $image): string
public function encode(ImageInterface $image): EncodedImage
{
$format = 'gif';
$compression = Imagick::COMPRESSION_LZW;
@@ -26,6 +27,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
$gif->setImageCompression($compression);
$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 Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface;
class JpegEncoder extends AbstractEncoder implements EncoderInterface
{
public function encode(ImageInterface $image): string
public function encode(ImageInterface $image): EncodedImage
{
$format = 'jpeg';
$compression = Imagick::COMPRESSION_JPEG;
@@ -24,6 +25,6 @@ class JpegEncoder extends AbstractEncoder implements EncoderInterface
$imagick->setCompressionQuality($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 $mimetype;
public function __construct(string $data)
public function __construct(string $data, string $mimetype = 'application/octet-stream')
{
$this->data = $data;
$this->mimetype = $mimetype;
}
public function save(string $filepath): void
@@ -26,7 +27,7 @@ class EncodedImage
public function toDataUrl(): string
{
return '';
return sprintf('data:%s;base64,%s', $this->mimetype, base64_encode($this->data));
}
public function __toString(): string

View File

@@ -2,7 +2,9 @@
namespace Intervention\Image\Interfaces;
use Intervention\Image\EncodedImage;
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
{
public function size(): SizeInterface;
public function getSize(): SizeInterface;
public function width(): int;
public function height(): int;
public function isAnimated(): bool;

View File

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

View File

@@ -44,8 +44,8 @@ class ImageTest extends TestCase
$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());
}
}