diff --git a/lib/model/QubitDigitalObject.php b/lib/model/QubitDigitalObject.php index 3caba68034..5ab260dcb8 100644 --- a/lib/model/QubitDigitalObject.php +++ b/lib/model/QubitDigitalObject.php @@ -1186,12 +1186,11 @@ public function save($connection = null) if ( QubitTerm::REFERENCE_ID == $this->usageId && $this->isImage() + && self::imagickExtensionLoaded() && is_readable($waterMarkPathName = sfConfig::get('sf_web_dir').'/watermark.png') && is_file($waterMarkPathName) ) { - $filePathName = $this->getAbsolutePath(); - $command = 'composite -dissolve 15 -tile '.$waterMarkPathName.' '.escapeshellarg($filePathName).' '.escapeshellarg($filePathName); - exec($command); + $this->applyWatermark($this->getAbsolutePath(), $waterMarkPathName); } // Update search index for related object @@ -3411,6 +3410,41 @@ public function isLocalFile() ]); } + protected function applyWatermark($imagePath, $watermarkPath) + { + try { + $image = new Imagick($imagePath); + $watermark = new Imagick($watermarkPath); + + $watermark->evaluateImage( + Imagick::EVALUATE_MULTIPLY, + 0.15, + Imagick::CHANNEL_ALPHA + ); + + $canvas = new Imagick(); + $canvas->newImage( + $image->getImageWidth(), + $image->getImageHeight(), + new ImagickPixel('transparent') + ); + $canvas->setImageFormat($image->getImageFormat()); + $canvas->textureImage($watermark); + + $image->compositeImage($canvas, Imagick::COMPOSITE_OVER, 0, 0); + $image->writeImage($imagePath); + + $canvas->clear(); + $canvas->destroy(); + $watermark->clear(); + $watermark->destroy(); + $image->clear(); + $image->destroy(); + } catch (Exception $e) { + // Leave the original image untouched if watermarking fails. + } + } + protected function insert($connection = null) { if (!isset($this->slug)) {