@@ -269,15 +269,17 @@ public function watermark($imagePath, $positionX = 0, $positionY = 0, $opacity =
269
269
);
270
270
}
271
271
272
- if (method_exists ($ watermark , 'setImageOpacity ' )) {
273
- // available from imagick 6.3.1
274
- $ watermark ->setImageOpacity ($ opacity );
275
- } else {
276
- // go to each pixel and make it transparent
277
- $ watermark ->paintTransparentImage ($ watermark ->getImagePixelColor (0 , 0 ), 1 , 65530 );
278
- $ watermark ->evaluateImage (\Imagick::EVALUATE_SUBTRACT , 1 - $ opacity , \Imagick::CHANNEL_ALPHA );
272
+ if (method_exists ($ watermark , 'getImageAlphaChannel ' )) {
273
+ // available from imagick 6.4.0
274
+ if ($ watermark ->getImageAlphaChannel () == 0 ) {
275
+ $ watermark ->setImageAlphaChannel (\Imagick::ALPHACHANNEL_OPAQUE );
276
+ }
279
277
}
280
278
279
+ $ compositeChannels = \Imagick::CHANNEL_ALL ;
280
+ $ watermark ->evaluateImage (\Imagick::EVALUATE_MULTIPLY , $ opacity , \Imagick::CHANNEL_OPACITY );
281
+ $ compositeChannels &= ~(\Imagick::CHANNEL_OPACITY );
282
+
281
283
switch ($ this ->getWatermarkPosition ()) {
282
284
case self ::POSITION_STRETCH :
283
285
$ watermark ->sampleImage ($ this ->_imageSrcWidth , $ this ->_imageSrcHeight );
@@ -309,14 +311,14 @@ public function watermark($imagePath, $positionX = 0, $positionY = 0, $opacity =
309
311
$ offsetY = $ positionY ;
310
312
while ($ offsetY <= $ this ->_imageSrcHeight + $ watermark ->getImageHeight ()) {
311
313
while ($ offsetX <= $ this ->_imageSrcWidth + $ watermark ->getImageWidth ()) {
312
- $ this ->_imageHandler ->compositeImage ($ watermark , \Imagick::COMPOSITE_OVER , $ offsetX , $ offsetY );
314
+ $ this ->_imageHandler ->compositeImage ($ watermark , \Imagick::COMPOSITE_OVER , $ offsetX , $ offsetY, $ compositeChannels );
313
315
$ offsetX += $ watermark ->getImageWidth ();
314
316
}
315
317
$ offsetX = $ positionX ;
316
318
$ offsetY += $ watermark ->getImageHeight ();
317
319
}
318
320
} else {
319
- $ this ->_imageHandler ->compositeImage ($ watermark , \Imagick::COMPOSITE_OVER , $ positionX , $ positionY );
321
+ $ this ->_imageHandler ->compositeImage ($ watermark , \Imagick::COMPOSITE_OVER , $ positionX , $ positionY, $ compositeChannels );
320
322
}
321
323
} catch (\ImagickException $ e ) {
322
324
throw new \Exception ('Unable to create watermark. ' , $ e ->getCode (), $ e );
0 commit comments