Skip to content

Commit 6b9ce4f

Browse files
feature/strip encoder parameter (#1421)
Add config option and encoder parameter to strip meta data in the encoding process. --------- Co-authored-by: Thomas <[email protected]>
1 parent 49c7cd0 commit 6b9ce4f

25 files changed

+186
-11
lines changed

src/Config.php

+3
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ class Config
1414
* @param bool $autoOrientation
1515
* @param bool $decodeAnimation
1616
* @param mixed $blendingColor
17+
* @param bool $strip
1718
* @return void
1819
*/
1920
public function __construct(
2021
public bool $autoOrientation = true,
2122
public bool $decodeAnimation = true,
2223
public mixed $blendingColor = 'ffffff',
24+
public bool $strip = false,
2325
) {
26+
//
2427
}
2528

2629
/**

src/Drivers/Imagick/Encoders/AvifEncoder.php

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Intervention\Image\Drivers\Imagick\Encoders;
66

77
use Imagick;
8+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
89
use Intervention\Image\EncodedImage;
910
use Intervention\Image\Encoders\AvifEncoder as GenericAvifEncoder;
1011
use Intervention\Image\Interfaces\EncodedImageInterface;
@@ -18,6 +19,11 @@ public function encode(ImageInterface $image): EncodedImageInterface
1819
$format = 'AVIF';
1920
$compression = Imagick::COMPRESSION_ZIP;
2021

22+
// strip meta data
23+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
24+
$image->modify(new StripMetaModifier());
25+
}
26+
2127
$imagick = $image->core()->native();
2228
$imagick->setFormat($format);
2329
$imagick->setImageFormat($format);

src/Drivers/Imagick/Encoders/HeicEncoder.php

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Intervention\Image\Drivers\Imagick\Encoders;
66

7+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
78
use Intervention\Image\EncodedImage;
89
use Intervention\Image\Encoders\HeicEncoder as GenericHeicEncoder;
910
use Intervention\Image\Interfaces\EncodedImageInterface;
@@ -16,6 +17,11 @@ public function encode(ImageInterface $image): EncodedImageInterface
1617
{
1718
$format = 'HEIC';
1819

20+
// strip meta data
21+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
22+
$image->modify(new StripMetaModifier());
23+
}
24+
1925
$imagick = $image->core()->native();
2026
$imagick->setFormat($format);
2127
$imagick->setImageFormat($format);

src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Intervention\Image\Drivers\Imagick\Encoders;
66

77
use Imagick;
8+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
89
use Intervention\Image\EncodedImage;
910
use Intervention\Image\Encoders\Jpeg2000Encoder as GenericJpeg2000Encoder;
1011
use Intervention\Image\Interfaces\ImageInterface;
@@ -18,6 +19,11 @@ public function encode(ImageInterface $image): EncodedImageInterface
1819
$format = 'JP2';
1920
$compression = Imagick::COMPRESSION_JPEG;
2021

22+
// strip meta data
23+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
24+
$image->modify(new StripMetaModifier());
25+
}
26+
2127
$imagick = $image->core()->native();
2228
$imagick->setImageBackgroundColor('white');
2329
$imagick->setBackgroundColor('white');

src/Drivers/Imagick/Encoders/JpegEncoder.php

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Intervention\Image\Drivers\Imagick\Encoders;
66

77
use Imagick;
8+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
89
use Intervention\Image\EncodedImage;
910
use Intervention\Image\Encoders\JpegEncoder as GenericJpegEncoder;
1011
use Intervention\Image\Interfaces\EncodedImageInterface;
@@ -30,6 +31,12 @@ public function encode(ImageInterface $image): EncodedImageInterface
3031
// possible full transparent colors as black
3132
$background->setColorValue(Imagick::COLOR_ALPHA, 1);
3233

34+
// strip meta data
35+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
36+
$image->modify(new StripMetaModifier());
37+
}
38+
39+
/** @var Imagick $imagick */
3340
$imagick = $image->core()->native();
3441
$imagick->setImageBackgroundColor($background);
3542
$imagick->setBackgroundColor($background);

src/Drivers/Imagick/Encoders/TiffEncoder.php

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Intervention\Image\Drivers\Imagick\Encoders;
66

7+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
78
use Intervention\Image\EncodedImage;
89
use Intervention\Image\Encoders\TiffEncoder as GenericTiffEncoder;
910
use Intervention\Image\Interfaces\ImageInterface;
@@ -16,6 +17,11 @@ public function encode(ImageInterface $image): EncodedImageInterface
1617
{
1718
$format = 'TIFF';
1819

20+
// strip meta data
21+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
22+
$image->modify(new StripMetaModifier());
23+
}
24+
1925
$imagick = $image->core()->native();
2026
$imagick->setFormat($format);
2127
$imagick->setImageFormat($format);

src/Drivers/Imagick/Encoders/WebpEncoder.php

+6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Imagick;
88
use ImagickPixel;
9+
use Intervention\Image\Drivers\Imagick\Modifiers\StripMetaModifier;
910
use Intervention\Image\EncodedImage;
1011
use Intervention\Image\Encoders\WebpEncoder as GenericWebpEncoder;
1112
use Intervention\Image\Interfaces\EncodedImageInterface;
@@ -19,6 +20,11 @@ public function encode(ImageInterface $image): EncodedImageInterface
1920
$format = 'WEBP';
2021
$compression = Imagick::COMPRESSION_ZIP;
2122

23+
// strip meta data
24+
if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
25+
$image->modify(new StripMetaModifier());
26+
}
27+
2228
$imagick = $image->core()->native();
2329
$imagick->setImageBackgroundColor(new ImagickPixel('transparent'));
2430

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Intervention\Image\Drivers\Imagick\Modifiers;
6+
7+
use Intervention\Image\Collection;
8+
use Intervention\Image\Interfaces\ImageInterface;
9+
use Intervention\Image\Interfaces\ModifierInterface;
10+
use Intervention\Image\Interfaces\SpecializedInterface;
11+
12+
class StripMetaModifier implements ModifierInterface, SpecializedInterface
13+
{
14+
/**
15+
* {@inheritdoc}
16+
*
17+
* @see Intervention\Image\Interfaces\ModifierInterface::apply()
18+
*/
19+
public function apply(ImageInterface $image): ImageInterface
20+
{
21+
// preserve icc profiles
22+
$profiles = $image->core()->native()->getImageProfiles('icc');
23+
24+
// remove meta data
25+
$image->core()->native()->stripImage();
26+
$image->setExif(new Collection());
27+
28+
if ($profiles !== []) {
29+
// re-apply icc profiles
30+
$image->core()->native()->profileImage("icc", $profiles['icc']);
31+
}
32+
return $image;
33+
}
34+
}

src/Encoders/AvifEncoder.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ class AvifEncoder extends SpecializableEncoder
1212
* Create new encoder object
1313
*
1414
* @param int $quality
15+
* @param null|bool $strip Strip EXIF metadata
1516
* @return void
1617
*/
17-
public function __construct(public int $quality = self::DEFAULT_QUALITY)
18-
{
18+
public function __construct(
19+
public int $quality = self::DEFAULT_QUALITY,
20+
public ?bool $strip = null
21+
) {
22+
//
1923
}
2024
}

src/Encoders/BmpEncoder.php

+1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ class BmpEncoder extends SpecializableEncoder
1010
{
1111
public function __construct()
1212
{
13+
//
1314
}
1415
}

src/Encoders/GifEncoder.php

+1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ class GifEncoder extends SpecializableEncoder
1616
*/
1717
public function __construct(public bool $interlaced = false)
1818
{
19+
//
1920
}
2021
}

src/Encoders/HeicEncoder.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ class HeicEncoder extends SpecializableEncoder
1212
* Create new encoder object
1313
*
1414
* @param int $quality
15+
* @param null|bool $strip Strip EXIF metadata
1516
* @return void
1617
*/
17-
public function __construct(public int $quality = self::DEFAULT_QUALITY)
18-
{
18+
public function __construct(
19+
public int $quality = self::DEFAULT_QUALITY,
20+
public ?bool $strip = null
21+
) {
22+
//
1923
}
2024
}

src/Encoders/Jpeg2000Encoder.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ class Jpeg2000Encoder extends SpecializableEncoder
1212
* Create new encoder object
1313
*
1414
* @param int $quality
15+
* @param null|bool $strip Strip EXIF metadata
1516
* @return void
1617
*/
17-
public function __construct(public int $quality = self::DEFAULT_QUALITY)
18-
{
18+
public function __construct(
19+
public int $quality = self::DEFAULT_QUALITY,
20+
public ?bool $strip = null
21+
) {
22+
//
1923
}
2024
}

src/Encoders/JpegEncoder.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ class JpegEncoder extends SpecializableEncoder
1313
*
1414
* @param int $quality
1515
* @param bool $progressive
16+
* @param null|bool $strip Strip EXIF metadata
1617
* @return void
1718
*/
1819
public function __construct(
1920
public int $quality = self::DEFAULT_QUALITY,
20-
public bool $progressive = false
21+
public bool $progressive = false,
22+
public ?bool $strip = null
2123
) {
24+
//
2225
}
2326
}

src/Encoders/PngEncoder.php

+1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ class PngEncoder extends SpecializableEncoder
1717
*/
1818
public function __construct(public bool $interlaced = false, public bool $indexed = false)
1919
{
20+
//
2021
}
2122
}

src/Encoders/TiffEncoder.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ class TiffEncoder extends SpecializableEncoder
1212
* Create new encoder object
1313
*
1414
* @param int $quality
15+
* @param null|bool $strip Strip EXIF metadata
1516
* @return void
1617
*/
17-
public function __construct(public int $quality = self::DEFAULT_QUALITY)
18-
{
18+
public function __construct(
19+
public int $quality = self::DEFAULT_QUALITY,
20+
public ?bool $strip = null
21+
) {
22+
//
1923
}
2024
}

src/Encoders/WebpEncoder.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ class WebpEncoder extends SpecializableEncoder
1212
* Create new encoder object
1313
*
1414
* @param int $quality
15+
* @param null|bool $strip Strip EXIF metadata
1516
* @return void
1617
*/
17-
public function __construct(public int $quality = self::DEFAULT_QUALITY)
18-
{
18+
public function __construct(
19+
public int $quality = self::DEFAULT_QUALITY,
20+
public ?bool $strip = null
21+
) {
1922
}
2023
}

tests/Unit/ConfigTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ public function testConstructor(): void
2424
autoOrientation: false,
2525
decodeAnimation: false,
2626
blendingColor: 'f00',
27+
strip: true,
2728
);
2829
$this->assertInstanceOf(Config::class, $config);
2930

3031
$this->assertFalse($config->autoOrientation);
3132
$this->assertFalse($config->decodeAnimation);
33+
$this->assertTrue($config->strip);
3234
$this->assertEquals('f00', $config->blendingColor);
3335
}
3436

@@ -37,12 +39,14 @@ public function testGetSetOptions(): void
3739
$config = new Config();
3840
$this->assertTrue($config->autoOrientation);
3941
$this->assertTrue($config->decodeAnimation);
42+
$this->assertFalse($config->strip);
4043
$this->assertEquals('ffffff', $config->blendingColor);
4144

4245
$result = $config->setOptions(
4346
autoOrientation: false,
4447
decodeAnimation: false,
4548
blendingColor: 'f00',
49+
strip: true,
4650
);
4751

4852
$this->assertFalse($config->autoOrientation);
@@ -51,16 +55,19 @@ public function testGetSetOptions(): void
5155

5256
$this->assertFalse($result->autoOrientation);
5357
$this->assertFalse($result->decodeAnimation);
58+
$this->assertTrue($result->strip);
5459
$this->assertEquals('f00', $result->blendingColor);
5560

5661
$result = $config->setOptions(blendingColor: '000');
5762

5863
$this->assertFalse($config->autoOrientation);
5964
$this->assertFalse($config->decodeAnimation);
65+
$this->assertTrue($config->strip);
6066
$this->assertEquals('000', $config->blendingColor);
6167

6268
$this->assertFalse($result->autoOrientation);
6369
$this->assertFalse($result->decodeAnimation);
70+
$this->assertTrue($result->strip);
6471
$this->assertEquals('000', $result->blendingColor);
6572
}
6673

@@ -71,13 +78,16 @@ public function testSetOptionsWithArray(): void
7178
'autoOrientation' => false,
7279
'decodeAnimation' => false,
7380
'blendingColor' => 'f00',
81+
'strip' => true,
7482
]);
7583

7684
$this->assertFalse($config->autoOrientation);
7785
$this->assertFalse($config->decodeAnimation);
86+
$this->assertTrue($config->strip);
7887
$this->assertEquals('f00', $config->blendingColor);
7988
$this->assertFalse($result->autoOrientation);
8089
$this->assertFalse($result->decodeAnimation);
90+
$this->assertTrue($result->strip);
8191
$this->assertEquals('f00', $result->blendingColor);
8292
}
8393
}

tests/Unit/Drivers/Imagick/Encoders/AvifEncoderTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Intervention\Image\Tests\Unit\Drivers\Imagick\Encoders;
66

7+
use Intervention\Image\Drivers\Imagick\Driver;
78
use Intervention\Image\Drivers\Imagick\Encoders\AvifEncoder;
89
use PHPUnit\Framework\Attributes\CoversClass;
910
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
@@ -17,6 +18,7 @@ public function testEncode(): void
1718
{
1819
$image = $this->createTestImage(3, 2);
1920
$encoder = new AvifEncoder(10);
21+
$encoder->setDriver(new Driver());
2022
$result = $encoder->encode($image);
2123
$this->assertMediaType('image/avif', $result);
2224
$this->assertEquals('image/avif', $result->mimetype());

tests/Unit/Drivers/Imagick/Encoders/HeicEncoderTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Intervention\Image\Tests\Unit\Drivers\Imagick\Encoders;
66

7+
use Intervention\Image\Drivers\Imagick\Driver;
78
use Intervention\Image\Drivers\Imagick\Encoders\HeicEncoder;
89
use PHPUnit\Framework\Attributes\CoversClass;
910
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
@@ -17,6 +18,7 @@ public function testEncode(): void
1718
{
1819
$image = $this->createTestImage(3, 2);
1920
$encoder = new HeicEncoder(75);
21+
$encoder->setDriver(new Driver());
2022
$result = $encoder->encode($image);
2123
$this->assertMediaType('image/heic', $result);
2224
$this->assertEquals('image/heic', $result->mimetype());

0 commit comments

Comments
 (0)