如何根据图片调整水印?

How to adjust watermark according to image?

我几乎完成了所有工作,但我遇到了一个问题。我在多个位置创建多个水印。那是 运行 很好,但实际上问题是当图像具有良好的分辨率并且水印看起来很小时。我想要任何图像分辨率水印应该缩放和可见这里是我的 exec 函数,我正在使用 laravel 框架,我正在使用 imagick 库

$path = storage_path('app/images/TestImages/');
$mediumFileName = $path.str_random(4)."medium".str_random(4).".".$ext;
$watermarkImage = storage_path('watermark.png');
$saveWatermark = $path."image_watermark.jpg";
exec("convert $mediumFileName \( $watermarkImage -write MPR:wm \) \
-define compose:args=30,100 -compose dissolve            \
      -gravity NorthWest -geometry +3+3 -composite      \
MPR:wm -gravity NorthEast -geometry +3+3 -composite      \
MPR:wm -gravity SouthEast -geometry +3+3 -composite      \
MPR:wm -gravity Center -geometry +3+3 -composite      \
MPR:wm -gravity SouthWest -geometry +3+3 -composite $saveWatermark");

使用 imagesize 获取图像大小。
选择一个正确大小的水印并将其添加到图片中。

$path = storage_path('app/images/TestImages/');
$mediumFileName =  $path.str_random(4)."medium".str_random(4).".".$ext;
$watermarkImage = storage_path('watermark.png');

list($width, $height, $type, $attr) = getimagesize($mediumFileName);

if ($height * $width < some Mpx){
    $watermarkImage = storage_path('watermarkSMALL.png');
} elseif($height*$width >some larger Mpx)
    $watermarkImage = storage_path('watermarkLARGE.png');
}

exec("convert 
$mediumFileName \( 
$watermarkImage -write     MPR:wm \) \
-define compose:args=30,100 -compose dissolve            \
  -gravity NorthWest -geometry +3+3 -composite      \
MPR:wm -gravity NorthEast -geometry +3+3 -composite      \
MPR:wm -gravity SouthEast -geometry +3+3 -composite      \
MPR:wm -gravity Center -geometry +3+3 -composite      \
MPR:wm -gravity SouthWest -geometry +3+3 -composite $saveWatermark");

这是一个大水印,1,000 像素见方,分辨率足以容纳任何图片。

现在,如果我们有一个像这样的 1000x800 像素的图像,我们可以在合成之前调整水印的大小,例如 15%(1000 的 15% 是代码中的 150):

convert image.jpg \( watermark.png -resize 150x -write MPR:wm \) \
          -gravity northwest -geometry +10+10 -composite         \
   MPR:wm -gravity northeast -geometry +10+10 -composite         \
   MPR:wm -gravity southwest -geometry +10+10 -composite         \
   MPR:wm -gravity southeast -geometry +10+10 -composite result.png

但是,如果我们有像这张 400x300 图片这样的小图片:

当我们应用水印时,我们首先将其调整为 400 的 15%,即 60:

convert image.jpg \( watermark.png -resize 60x -write MPR:wm \) \
          -gravity northwest -geometry +10+10 -composite         \
   MPR:wm -gravity northeast -geometry +10+10 -composite         \
   MPR:wm -gravity southwest -geometry +10+10 -composite         \
   MPR:wm -gravity southeast -geometry +10+10 -composite result.png

因此,您需要了解 Andreas 亲切地向您展示的图像尺寸:

list($width, $height, $type, $attr) = getimagesize($mediumFileName);

然后将其乘以 0.15(即 15%)并在您的 -resize 参数中使用它。


如果上面括号内的 "aside processing" 令人不安或困惑,您可以通过先自行加载并调整水印大小来达到相同的结果,将其放入 MPR,然后加载主图像并覆盖 MPR 四次。它只是一个不同的,也许更简单的语法:

convert watermark.png -resize 60x -write MPR:wm +delete image.jpg \
   MPR:wm -gravity northwest -geometry +10+10 -composite          \
   MPR:wm -gravity northeast -geometry +10+10 -composite          \
   MPR:wm -gravity southwest -geometry +10+10 -composite          \
   MPR:wm -gravity southeast -geometry +10+10 -composite result.png