1
0
mirror of https://github.com/Intervention/image.git synced 2025-08-14 01:44:03 +02:00

Webp encoders for GD & ImageMagick

This commit is contained in:
Gwendolen Lynch
2021-12-22 12:13:21 +01:00
parent f173895ac2
commit 8ba4b91f56
4 changed files with 133 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
<?php
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 WebpEncoder extends AbstractEncoder implements EncoderInterface
{
public function __construct(int $quality)
{
$this->quality = $quality;
}
public function encode(ImageInterface $image): EncodedImage
{
$data = $this->getBuffered(function () use ($image) {
imagewebp($image->getFrames()->first()->getCore(), null, $this->quality);
});
return new EncodedImage($data, 'image/webp');
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Intervention\Image\Drivers\Imagick\Encoders;
use Imagick;
use ImagickPixel;
use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder;
use Intervention\Image\EncodedImage;
use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\ImageInterface;
class WebpEncoder extends AbstractEncoder implements EncoderInterface
{
public function __construct(int $quality)
{
$this->quality = $quality;
}
public function encode(ImageInterface $image): EncodedImage
{
$format = 'webp';
$compression = Imagick::COMPRESSION_ZIP;
$imagick = $image->getFrames()->first()->getCore();
$imagick->setImageBackgroundColor(new ImagickPixel('transparent'));
$imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE);
$imagick->setFormat($format);
$imagick->setImageFormat($format);
$imagick->setCompression($compression);
$imagick->setImageCompression($compression);
$imagick->setImageCompressionQuality($this->quality);
return new EncodedImage($imagick->getImagesBlob(), 'image/webp');
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace Intervention\Image\Tests\Drivers\Gd\Encoders;
use Intervention\Image\Collection;
use Intervention\Image\Drivers\Gd\Encoders\WebpEncoder;
use Intervention\Image\Drivers\Gd\Frame;
use Intervention\Image\Drivers\Gd\Image;
use Intervention\MimeSniffer\MimeSniffer;
use Intervention\MimeSniffer\Types\ImageWebp;
use PHPUnit\Framework\TestCase;
/**
* @requires extension gd
*/
final class WebpEncoderTest extends TestCase
{
protected function getTestImage(): Image
{
$frame = new Frame(imagecreatetruecolor(3, 2));
return new Image(new Collection([$frame]));
}
public function testEncode(): void
{
$image = $this->getTestImage();
$encoder = new WebpEncoder(75);
$result = $encoder->encode($image);
$this->assertTrue(MimeSniffer::createFromString((string) $result)->matches(new ImageWebp()));
}
}

View File

@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace Intervention\Image\Tests\Drivers\Imagick\Encoders;
use Imagick;
use ImagickPixel;
use Intervention\Image\Collection;
use Intervention\Image\Drivers\Imagick\Encoders\WebpEncoder;
use Intervention\Image\Drivers\Imagick\Frame;
use Intervention\Image\Drivers\Imagick\Image;
use Intervention\MimeSniffer\MimeSniffer;
use Intervention\MimeSniffer\Types\ImageWebp;
use PHPUnit\Framework\TestCase;
/**
* @requires extension imagick
*/
final class WebpEncoderTest extends TestCase
{
protected function getTestImage(): Image
{
$imagick = new Imagick();
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
$frame = new Frame($imagick);
return new Image(new Collection([$frame]));
}
public function testEncode(): void
{
$image = $this->getTestImage();
$encoder = new WebpEncoder(75);
$result = $encoder->encode($image);
$this->assertTrue(MimeSniffer::createFromString((string) $result)->matches(new ImageWebp()));
}
}