php - 如何通过 PHP 为 Imagick 标题的文本和背景着色
问题描述
我正在尝试转换这个 Imagick shell 命令:
convert -geometry 200x -quiet -background "#0003" -fill "#ffff" -size 200x35 -gravity center caption:"12:50" image-20171214165000.JPG +swap -gravity north -composite image-20171214165000-thumb.JPG 2>&1
使用 PHP Imagick 插件,但我在标题填充颜色方面遇到问题。
上面的 shell 命令产生这个(预期的)输出:
然而,我目前的 PHP 方法:
<?php
$time = "12:50";
$img = new \Imagick();
$img->readImage('image-20171214165000.JPG');
$img->setImageCompression(\Imagick::COMPRESSION_JPEG);
$imageprops = $img->getImageGeometry();
$width = $imageprops['width'];
$height = $imageprops['height'];
$img = $img->transformImage($width . "x" . $height, "200x");
$capt = new \Imagick();
$capt->setBackgroundColor("rgba(0, 0, 0, 0.3)");
$capt->setGravity(\Imagick::GRAVITY_CENTER);
$capt->newPseudoImage(200, 35, "Caption:" . $time);
// $opacityColor = new \ImagickPixel("rgba(255, 255, 255, 1)");
// $capt->colorizeImage("rgba(255, 255, 255, 1)", $opacityColor);
$img->setGravity(\Imagick::GRAVITY_NORTH);
$img->compositeImage($capt, \Imagick::COMPOSITE_OVER, 0, 0);
$capt->destroy();
$img->stripImage();
$img->writeImage('image-20171214165000-thumb.JPG');
$img->destroy();
?>
产生带有黑色文本的输出:
使用注释掉的colorizeImage()
功能时,文本(“12:50”)会生成白色,但这也会使标题的背景变白(这是不需要的)。
如何设置标题背景 ( rgba(0, 0, 0, 0.3)
) 和标题文本 ( rgba(255, 255, 255, 1)
) 的颜色而不相互影响?
解决方案
Approach (based on https://stackoverflow.com/a/10760237/451962) that satisfies my criteria is the following:
<?php
$time = "12:50";
$img = new \Imagick();
$img->readImage('image-20171214165000.JPG');
$img->setImageCompression(\Imagick::COMPRESSION_JPEG);
$imageprops = $img->getImageGeometry();
$width = $imageprops['width'];
$height = $imageprops['height'];
$img = $img->transformImage($width . "x" . $height, "200x");
$capt = new \Imagick();
$draw = new \ImagickDraw();
$draw->setFontSize(32);
$fillcolor = new \ImagickPixel("white");
$draw->setFillColor($fillcolor);
$draw->setGravity(\Imagick::GRAVITY_CENTER);
$bgcolor = new \ImagickPixel("rgba(0, 0, 0, 0.2)");
$capt->newImage('200', '35', $bgcolor);
$capt->annotateImage($draw, 0, 0, 0, $time);
$img->setGravity(\Imagick::GRAVITY_NORTH);
$img->compositeImage($capt, \Imagick::COMPOSITE_OVER, 0, 0);
$img->writeImage('image-20171214165000-thumb.JPG');
?>
推荐阅读
- python - lmfit 对复杂方程/数据进行最小化(或 scipy.optimize leastsq)
- python - pyspark计算当前时间和上次活动时间之间差异的移动平均值
- amazon-web-services - 通过 AWS Cloudfront 在特定端口上设置到源服务器资源的连接
- python - 自编码器算法和原理以及为什么编码器部分模糊
- spring - 具有多个 @Configuration 类的 Spring Boot/Batch 不实例化 bean(或加载属性)
- c# - MailKit 的 SendAsync() SmtpCommandException
- javascript - Chrome 正在缓存 service-worker.js,即使使用 Cache-Control: no-store, no-cache Max-Age: 0
- php - 我可以安全地删除 cpanel/php/sessions/ea-php56 吗?OpenCart 2.3.0.2
- python - 视图 management.views.home 没有返回 HttpResponse 对象。它返回 None 而不是
- angular - 在 React Router 中传递动态对象