mirror of
https://github.com/Intervention/image.git
synced 2025-08-25 23:06:13 +02:00
Encoding
This commit is contained in:
@@ -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')
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user