Skip to content

Commit 10c8b36

Browse files
committed
Fix interlacing.
Interlacing for JPGs only seems to be working when using Imagick. So need to look into that later or state that as a limitation in the docs.
1 parent bcb3168 commit 10c8b36

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

src/Manipulators/Encode.php

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Intervention\Image\Drivers\Gd\Driver as GdDriver;
66
use Intervention\Image\Drivers\Imagick\Driver as ImagickDriver;
77
use Intervention\Image\ImageManager;
8+
use Intervention\Image\Interfaces\DriverInterface;
89
use Intervention\Image\Interfaces\ImageInterface;
910

1011
class Encode extends BaseManipulator
@@ -21,30 +22,23 @@ public function run(ImageInterface $image): ImageInterface
2122
$format = $this->getFormat($image);
2223
$quality = $this->getQuality();
2324
$driver = $image->driver();
25+
$interlace = false;
2426

25-
if (in_array($format, ['jpg', 'pjpg'], true)) {
26-
$image = (new ImageManager($driver))
27-
->create($image->width(), $image->height())
28-
->fill('ffffff')
29-
->place($image, 'top-left', 0, 0);
30-
}
27+
if ('pjpg' === $format) {
28+
$interlace = true;
3129

32-
if (in_array($format, ['png', 'pjpg'], true)) {
33-
$i = $image->core()->native();
34-
if ($driver instanceof ImagickDriver) {
35-
$i->setInterlaceScheme(3); // 3 = Imagick::INTERLACE_PLANE constant
36-
} elseif ($driver instanceof GdDriver) {
37-
imageinterlace($i, true);
38-
}
39-
40-
if ('pjpg' === $format) {
41-
$format = 'jpg';
42-
}
30+
$format = 'jpg';
4331
}
4432

45-
return (new ImageManager($driver))->read(
46-
$image->encodeByExtension($format, $quality)->toFilePointer()
33+
$image = (new ImageManager($driver))->read(
34+
$image->encodeByExtension($format, $quality)->toString()
4735
);
36+
37+
if ($interlace) {
38+
$image = $this->interlace($image, $driver);
39+
}
40+
41+
return $image;
4842
}
4943

5044
/**
@@ -104,4 +98,17 @@ public function getQuality(): int
10498

10599
return (int) $q;
106100
}
101+
102+
protected function interlace(ImageInterface $image, DriverInterface $driver): ImageInterface
103+
{
104+
$img = $image->core()->native();
105+
106+
if ($driver instanceof ImagickDriver) {
107+
$img->setInterlaceScheme(\Imagick::INTERLACE_PLANE);
108+
} elseif ($driver instanceof GdDriver) {
109+
imageinterlace($img, true);
110+
}
111+
112+
return $image;
113+
}
107114
}

0 commit comments

Comments
 (0)