1
0
mirror of https://github.com/Intervention/image.git synced 2025-08-22 21:42:53 +02:00

Refine color profiles

- Add tests for profile methods
- Add ProfileInterface
- Add profile methods to ImageInterface
This commit is contained in:
Oliver Vogel
2023-10-26 15:37:24 +02:00
parent b3f2815eab
commit 2d565be6cb
6 changed files with 113 additions and 8 deletions

View File

@@ -3,8 +3,9 @@
namespace Intervention\Image\Colors; namespace Intervention\Image\Colors;
use Intervention\Image\GenericData; use Intervention\Image\GenericData;
use Intervention\Image\Interfaces\ProfileInterface;
class Profile extends GenericData class Profile extends GenericData implements ProfileInterface
{ {
// //
} }

View File

@@ -11,6 +11,7 @@ use Intervention\Image\Interfaces\ColorInterface;
use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ColorspaceInterface;
use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\FrameInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
use Intervention\Image\Interfaces\ProfileInterface;
use IteratorAggregate; use IteratorAggregate;
use Traversable; use Traversable;
@@ -83,6 +84,11 @@ class Image extends AbstractImage implements ImageInterface, IteratorAggregate
return null; return null;
} }
/**
* {@inheritdoc}
*
* @see ImageInterface::getColorspace()
*/
public function getColorspace(): ColorspaceInterface public function getColorspace(): ColorspaceInterface
{ {
return new RgbColorspace(); return new RgbColorspace();
@@ -105,4 +111,34 @@ class Image extends AbstractImage implements ImageInterface, IteratorAggregate
return $this; return $this;
} }
/**
* {@inheritdoc}
*
* @see ImageInterface::setProfile()
*/
public function setProfile(string|ProfileInterface $input): ImageInterface
{
throw new NotSupportedException('Color profiles are not supported by GD driver.');
}
/**
* {@inheritdoc}
*
* @see ImageInterface::profile()
*/
public function profile(): ProfileInterface
{
throw new NotSupportedException('Color profiles are not supported by GD driver.');
}
/**
* {@inheritdoc}
*
* @see ImageInterface::withoutProfile()
*/
public function withoutProfile(): ImageInterface
{
throw new NotSupportedException('Color profiles are not supported by GD driver.');
}
} }

View File

@@ -17,6 +17,7 @@ use Intervention\Image\Interfaces\ColorInterface;
use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ColorspaceInterface;
use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\FrameInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
use Intervention\Image\Interfaces\ProfileInterface;
use Iterator; use Iterator;
class Image extends AbstractImage implements ImageInterface, Iterator class Image extends AbstractImage implements ImageInterface, Iterator
@@ -162,16 +163,24 @@ class Image extends AbstractImage implements ImageInterface, Iterator
return $this->modify(new ColorspaceModifier($colorspace)); return $this->modify(new ColorspaceModifier($colorspace));
} }
public function setProfile(string $filepath): ImageInterface /**
* {@inheritdoc}
*
* @see ImageInterface::setProfile()
*/
public function setProfile(string|ProfileInterface $input): ImageInterface
{ {
return $this->modify( $profile = is_object($input) ? $input : new Profile(file_get_contents($input));
new ProfileModifier(
new Profile(file_get_contents($filepath)) return $this->modify(new ProfileModifier($profile));
)
);
} }
public function getProfile(): Profile /**
* {@inheritdoc}
*
* @see ImageInterface::profile()
*/
public function profile(): ProfileInterface
{ {
$profiles = $this->imagick->getImageProfiles('icc'); $profiles = $this->imagick->getImageProfiles('icc');
@@ -182,6 +191,11 @@ class Image extends AbstractImage implements ImageInterface, Iterator
return new Profile($profiles['icc']); return new Profile($profiles['icc']);
} }
/**
* {@inheritdoc}
*
* @see ImageInterface::withoutProfile()
*/
public function withoutProfile(): ImageInterface public function withoutProfile(): ImageInterface
{ {
return $this->modify(new ProfileRemovalModifier()); return $this->modify(new ProfileRemovalModifier());

View File

@@ -155,6 +155,28 @@ interface ImageInterface extends Traversable, Countable
*/ */
public function setColorspace(string|ColorspaceInterface $target): ImageInterface; public function setColorspace(string|ColorspaceInterface $target): ImageInterface;
/**
* Retrieve ICC color profile of image
*
* @return ProfileInterface
*/
public function profile(): ProfileInterface;
/**
* Set ICC color profile on the current image
*
* @param string|ProfileInterface $input Path to color profile or profile object
* @return ImageInterface
*/
public function setProfile(string|ProfileInterface $input): ImageInterface;
/**
* Remove ICC color profile from the current image
*
* @return ImageInterface
*/
public function withoutProfile(): ImageInterface;
/** /**
* Draw text on image * Draw text on image
* *

View File

@@ -0,0 +1,8 @@
<?php
namespace Intervention\Image\Interfaces;
interface ProfileInterface
{
public function __toString(): string;
}

View File

@@ -6,8 +6,10 @@ use Imagick;
use ImagickPixel; use ImagickPixel;
use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace;
use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace;
use Intervention\Image\Colors\Profile;
use Intervention\Image\Drivers\Imagick\Frame; use Intervention\Image\Drivers\Imagick\Frame;
use Intervention\Image\Drivers\Imagick\Image; use Intervention\Image\Drivers\Imagick\Image;
use Intervention\Image\Exceptions\ColorException;
use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Geometry\Rectangle;
use Intervention\Image\Tests\TestCase; use Intervention\Image\Tests\TestCase;
@@ -129,4 +131,26 @@ class ImageTest extends TestCase
$this->assertInstanceOf(Image::class, $result); $this->assertInstanceOf(Image::class, $result);
$this->assertInstanceOf(CmykColorspace::class, $result->getColorspace()); $this->assertInstanceOf(CmykColorspace::class, $result->getColorspace());
} }
public function testSetGetProfile(): void
{
$imagick = new Imagick();
$imagick->readImageBlob($this->getTestImageData('test.jpg'));
$image = new Image($imagick);
$result = $image->profile();
$this->assertInstanceOf(Profile::class, $result);
$result = $image->setProfile($result);
$this->assertInstanceOf(Image::class, $result);
}
public function testWithoutProfile(): void
{
$imagick = new Imagick();
$imagick->readImageBlob($this->getTestImageData('test.jpg'));
$image = new Image($imagick);
$result = $image->withoutProfile();
$this->assertInstanceOf(Image::class, $result);
$this->expectException(ColorException::class);
$image->profile();
}
} }