mirror of
https://github.com/Intervention/image.git
synced 2025-08-29 16:50:07 +02:00
Implement Image::encodeByExtension()
This commit is contained in:
@@ -24,9 +24,11 @@ class FilePathImageDecoder extends BinaryImageDecoder implements DecoderInterfac
|
|||||||
throw new DecoderException('Unable to decode input');
|
throw new DecoderException('Unable to decode input');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// decode image
|
||||||
$image = parent::decode(file_get_contents($input));
|
$image = parent::decode(file_get_contents($input));
|
||||||
|
|
||||||
// set origin
|
// set file path on origin
|
||||||
|
$image->origin()->setFilePath($input);
|
||||||
|
|
||||||
return $image;
|
return $image;
|
||||||
}
|
}
|
||||||
|
@@ -12,18 +12,24 @@ class FilePathImageDecoder extends BinaryImageDecoder implements DecoderInterfac
|
|||||||
{
|
{
|
||||||
public function decode(mixed $input): ImageInterface|ColorInterface
|
public function decode(mixed $input): ImageInterface|ColorInterface
|
||||||
{
|
{
|
||||||
if (! is_string($input)) {
|
if (!is_string($input)) {
|
||||||
throw new DecoderException('Unable to decode input');
|
throw new DecoderException('Unable to decode input');
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (! @is_file($input)) {
|
if (!@is_file($input)) {
|
||||||
throw new DecoderException('Unable to decode input');
|
throw new DecoderException('Unable to decode input');
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
throw new DecoderException('Unable to decode input');
|
throw new DecoderException('Unable to decode input');
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::decode(file_get_contents($input));
|
// decode image
|
||||||
|
$image = parent::decode(file_get_contents($input));
|
||||||
|
|
||||||
|
// set file path on origin
|
||||||
|
$image->origin()->setFilePath($input);
|
||||||
|
|
||||||
|
return $image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,12 +2,10 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Encoders;
|
namespace Intervention\Image\Encoders;
|
||||||
|
|
||||||
use Intervention\Gif\Exception\EncoderException;
|
|
||||||
use Intervention\Image\Interfaces\EncodedImageInterface;
|
use Intervention\Image\Interfaces\EncodedImageInterface;
|
||||||
use Intervention\Image\Interfaces\EncoderInterface;
|
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
class AutoEncoder implements EncoderInterface
|
class AutoEncoder extends MediaTypeEncoder
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
@@ -22,25 +20,4 @@ class AutoEncoder implements EncoderInterface
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return encoder matching to encode given media (mime) type
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @return EncoderInterface
|
|
||||||
* @throws EncoderException
|
|
||||||
*/
|
|
||||||
protected function encoderByMediaType(string $type): EncoderInterface
|
|
||||||
{
|
|
||||||
return match ($type) {
|
|
||||||
'image/webp' => new WebpEncoder(),
|
|
||||||
'image/avif' => new AvifEncoder(),
|
|
||||||
'image/jpeg' => new JpegEncoder(),
|
|
||||||
'image/bmp' => new BmpEncoder(),
|
|
||||||
'image/gif' => new GifEncoder(),
|
|
||||||
'image/png' => new PngEncoder(),
|
|
||||||
'image/tiff' => new TiffEncoder(),
|
|
||||||
default => throw new EncoderException('No encoder found for media type (' . $type . ').'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
49
src/Encoders/FileExtensionEncoder.php
Normal file
49
src/Encoders/FileExtensionEncoder.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intervention\Image\Encoders;
|
||||||
|
|
||||||
|
use Intervention\Gif\Exception\EncoderException;
|
||||||
|
use Intervention\Image\Interfaces\EncodedImageInterface;
|
||||||
|
use Intervention\Image\Interfaces\EncoderInterface;
|
||||||
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
|
class FileExtensionEncoder extends AutoEncoder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create new encoder instance to encode to format of given file extension
|
||||||
|
*
|
||||||
|
* @param null|string $extension
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(protected ?string $extension = null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see EncoderInterface::encode()
|
||||||
|
*/
|
||||||
|
public function encode(ImageInterface $image): EncodedImageInterface
|
||||||
|
{
|
||||||
|
return $image->encode(
|
||||||
|
$this->encoderByFileExtension(
|
||||||
|
is_null($this->extension) ? $image->origin()->fileExtension() : $this->extension
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function encoderByFileExtension(string $extension): EncoderInterface
|
||||||
|
{
|
||||||
|
return match ($extension) {
|
||||||
|
'webp' => new WebpEncoder(),
|
||||||
|
'avif' => new AvifEncoder(),
|
||||||
|
'jpeg', 'jpg' => new JpegEncoder(),
|
||||||
|
'bmp' => new BmpEncoder(),
|
||||||
|
'gif' => new GifEncoder(),
|
||||||
|
'png' => new PngEncoder(),
|
||||||
|
'tiff', 'tif' => new TiffEncoder(),
|
||||||
|
default => throw new EncoderException('No encoder found for file extension (' . $extension . ').'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@@ -2,10 +2,12 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Encoders;
|
namespace Intervention\Image\Encoders;
|
||||||
|
|
||||||
|
use Intervention\Gif\Exception\EncoderException;
|
||||||
use Intervention\Image\Interfaces\EncodedImageInterface;
|
use Intervention\Image\Interfaces\EncodedImageInterface;
|
||||||
|
use Intervention\Image\Interfaces\EncoderInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
class MediaTypeEncoder extends AutoEncoder
|
class MediaTypeEncoder implements EncoderInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Create new encoder instance to encode given media (mime) type
|
* Create new encoder instance to encode given media (mime) type
|
||||||
@@ -24,10 +26,31 @@ class MediaTypeEncoder extends AutoEncoder
|
|||||||
*/
|
*/
|
||||||
public function encode(ImageInterface $image): EncodedImageInterface
|
public function encode(ImageInterface $image): EncodedImageInterface
|
||||||
{
|
{
|
||||||
|
$type = is_null($this->type) ? $image->origin()->mediaType() : $this->type;
|
||||||
|
|
||||||
return $image->encode(
|
return $image->encode(
|
||||||
$this->encoderByMediaType(
|
$this->encoderByMediaType($type)
|
||||||
is_null($this->type) ? $image->origin()->mediaType() : $this->type
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return new encoder by given media (MIME) type
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return EncoderInterface
|
||||||
|
* @throws EncoderException
|
||||||
|
*/
|
||||||
|
protected function encoderByMediaType(string $type): EncoderInterface
|
||||||
|
{
|
||||||
|
return match ($type) {
|
||||||
|
'image/webp' => new WebpEncoder(),
|
||||||
|
'image/avif' => new AvifEncoder(),
|
||||||
|
'image/jpeg' => new JpegEncoder(),
|
||||||
|
'image/bmp' => new BmpEncoder(),
|
||||||
|
'image/gif' => new GifEncoder(),
|
||||||
|
'image/png' => new PngEncoder(),
|
||||||
|
'image/tiff' => new TiffEncoder(),
|
||||||
|
default => throw new EncoderException('No encoder found for media type (' . $type . ').'),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@ use Intervention\Image\Analyzers\WidthAnalyzer;
|
|||||||
use Intervention\Image\Encoders\AutoEncoder;
|
use Intervention\Image\Encoders\AutoEncoder;
|
||||||
use Intervention\Image\Encoders\AvifEncoder;
|
use Intervention\Image\Encoders\AvifEncoder;
|
||||||
use Intervention\Image\Encoders\BmpEncoder;
|
use Intervention\Image\Encoders\BmpEncoder;
|
||||||
|
use Intervention\Image\Encoders\FileExtensionEncoder;
|
||||||
use Intervention\Image\Encoders\GifEncoder;
|
use Intervention\Image\Encoders\GifEncoder;
|
||||||
use Intervention\Image\Encoders\JpegEncoder;
|
use Intervention\Image\Encoders\JpegEncoder;
|
||||||
use Intervention\Image\Encoders\MediaTypeEncoder;
|
use Intervention\Image\Encoders\MediaTypeEncoder;
|
||||||
@@ -755,6 +756,16 @@ final class Image implements ImageInterface, Countable
|
|||||||
return $this->encode(new MediaTypeEncoder($type));
|
return $this->encode(new MediaTypeEncoder($type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see ImageInterface::encodeByExtension()
|
||||||
|
*/
|
||||||
|
public function encodeByExtension(?string $extension = null): EncodedImageInterface
|
||||||
|
{
|
||||||
|
return $this->encode(new FileExtensionEncoder($extension));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*
|
*
|
||||||
|
@@ -566,6 +566,16 @@ interface ImageInterface extends IteratorAggregate, Countable
|
|||||||
*/
|
*/
|
||||||
public function encodeByMediaType(?string $type = null): EncodedImageInterface;
|
public function encodeByMediaType(?string $type = null): EncodedImageInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode the image into the format represented by the given extension. If no
|
||||||
|
* extension is given the image will be encoded to the format of the
|
||||||
|
* originally read image.
|
||||||
|
*
|
||||||
|
* @param null|string $extension
|
||||||
|
* @return EncodedImageInterface
|
||||||
|
*/
|
||||||
|
public function encodeByExtension(?string $extension = null): EncodedImageInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode image to JPEG format
|
* Encode image to JPEG format
|
||||||
*
|
*
|
||||||
|
@@ -8,20 +8,53 @@ class Origin
|
|||||||
* Create new origin instance
|
* Create new origin instance
|
||||||
*
|
*
|
||||||
* @param string $mediaType
|
* @param string $mediaType
|
||||||
|
* @param null|string $filePath
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
protected string $mediaType = 'application/octet-stream'
|
protected string $mediaType = 'application/octet-stream',
|
||||||
|
protected ?string $filePath = null
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return media type of origin
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function mediaType(): string
|
public function mediaType(): string
|
||||||
{
|
{
|
||||||
return $this->mediaType;
|
return $this->mediaType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias of self::mediaType()
|
||||||
|
*/
|
||||||
public function mimetype(): string
|
public function mimetype(): string
|
||||||
{
|
{
|
||||||
return $this->mediaType();
|
return $this->mediaType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set file path for origin
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return Origin
|
||||||
|
*/
|
||||||
|
public function setFilePath(string $path): self
|
||||||
|
{
|
||||||
|
$this->filePath = $path;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return file extension if origin was created from file path
|
||||||
|
*
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public function fileExtension(): ?string
|
||||||
|
{
|
||||||
|
return empty($this->filePath) ? null : pathinfo($this->filePath, PATHINFO_EXTENSION);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -133,6 +133,17 @@ class ImageTest extends TestCase
|
|||||||
$this->assertMediaType('image/png', (string) $result);
|
$this->assertMediaType('image/png', (string) $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testEncodeByExtension(): void
|
||||||
|
{
|
||||||
|
$result = $this->readTestImage('blue.gif')->encodeByExtension();
|
||||||
|
$this->assertInstanceOf(EncodedImage::class, $result);
|
||||||
|
$this->assertMediaType('image/gif', (string) $result);
|
||||||
|
|
||||||
|
$result = $this->readTestImage('blue.gif')->encodeByExtension('png');
|
||||||
|
$this->assertInstanceOf(EncodedImage::class, $result);
|
||||||
|
$this->assertMediaType('image/png', (string) $result);
|
||||||
|
}
|
||||||
|
|
||||||
public function testWidthHeightSize(): void
|
public function testWidthHeightSize(): void
|
||||||
{
|
{
|
||||||
$this->assertEquals(3, $this->image->width());
|
$this->assertEquals(3, $this->image->width());
|
||||||
|
@@ -132,6 +132,17 @@ class ImageTest extends TestCase
|
|||||||
$this->assertMediaType('image/png', (string) $result);
|
$this->assertMediaType('image/png', (string) $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testEncodeByExtension(): void
|
||||||
|
{
|
||||||
|
$result = $this->readTestImage('blue.gif')->encodeByExtension();
|
||||||
|
$this->assertInstanceOf(EncodedImage::class, $result);
|
||||||
|
$this->assertMediaType('image/gif', (string) $result);
|
||||||
|
|
||||||
|
$result = $this->readTestImage('blue.gif')->encodeByExtension('png');
|
||||||
|
$this->assertInstanceOf(EncodedImage::class, $result);
|
||||||
|
$this->assertMediaType('image/png', (string) $result);
|
||||||
|
}
|
||||||
|
|
||||||
public function testWidthHeightSize(): void
|
public function testWidthHeightSize(): void
|
||||||
{
|
{
|
||||||
$this->assertEquals(20, $this->image->width());
|
$this->assertEquals(20, $this->image->width());
|
||||||
|
@@ -14,4 +14,13 @@ class OriginTest extends TestCase
|
|||||||
$origin = new Origin('image/gif');
|
$origin = new Origin('image/gif');
|
||||||
$this->assertEquals('image/gif', $origin->mediaType());
|
$this->assertEquals('image/gif', $origin->mediaType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFileExtension(): void
|
||||||
|
{
|
||||||
|
$origin = new Origin('image/jpeg', __DIR__ . '/tests/images/example.jpg');
|
||||||
|
$this->assertEquals('jpg', $origin->fileExtension());
|
||||||
|
|
||||||
|
$origin = new Origin('image/jpeg');
|
||||||
|
$this->assertEquals('', $origin->fileExtension());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user