我需要能够在图像中自动写入一些文本。根据图像的亮度,脚本必须以白色或黑色写入。
那么如何使用Imagick检查图像的亮度/暗度?
答案 0 :(得分:3)
你可以这样做:
// Load the image
$imagick = new Imagick("image.jpg");
// convert to HSL - Hue, Saturation and LIGHTNESS
$imagick->transformImageColorspace(imagick::COLORSPACE_HSL);
// Get statistics for the LIGHTNESS
$Lchannel = $imagick->getImageChannelMean(imagick::CHANNEL_BLUE);
$meanLightness = $Lchannel['mean']/65535;
printf("Mean lightness: %f",$meanLightness);
如果您想根据Fred的建议做淡色文本,可以在PHP中使用:
$image = new Imagick("image.jpg");
$draw = new ImagickDraw();
$draw->setFillColor('#ffffff');
$draw->setFontSize(24);
$draw->setTextUnderColor('#ff000080');
$image->annotateImage($draw,30,50,0,"Undercoloured Text");
$image->writeImage('result.jpg');
答案 1 :(得分:1)
您还可以在某些背景颜色上创建文本图像并将其覆盖在图像上。或者使用-undercolor和-draw或-annotate。这样,您就不必担心图像的颜色。或者,您可以指定要在其上写入文本的区域,然后获取该区域的平均亮度。然后测试该区域是否比中灰色更亮或更暗。如果更亮,则使用透明背景创建相同大小的文本图像,并使用黑色文本颜色。同样,如果颜色较深,请使用白色文字颜色。所以在ImageMagick命令行中,这些将是:
输入:
Pink Undercolor:
convert logo.png \
\( -size 110x -background pink -font ubuntu-bold -fill $textcolor label:"Testng" \) \
-gravity northwest -geometry +395+400 -compose over -composite result3.png
测试(黑暗区域) - Unix语法:
test=`convert logo.png -crop 110x36+395+400 +repage -colorspace gray -format "%[fx:(mean>0.5)?1:0]" info:`
if [ $test -eq 1 ]; then
textcolor="black"
else
textcolor="white"
fi
convert logo.png \
\( -size 110x -background none -font ubuntu-bold -fill $textcolor label:"Testng" \) \
-gravity northwest -geometry +395+400 -compose over -composite result1.png
测试(明亮区域):
test=`convert logo.png -crop 110x36+100+400 +repage -colorspace gray -format "%[fx:(mean>0.5)?1:0]" info:`
if [ $test -eq 1 ]; then
textcolor="black"
else
textcolor="white"
fi
convert logo.png \
\( -size 110x -background none -font ubuntu-bold -fill $textcolor label:"Testng" \) \
-gravity northwest -geometry +100+400 -compose over -composite result2.png
对不起,我不知道Imagick。所以其他人可能需要帮助。