我可以使用imagettftext()
函数使用GD和PHP创建图像。文本的颜色使用imagecolorallocate()
指定,但颜色采用RGB格式。
我有一系列纹理图像 - 每个10 x 10像素。我想使用这些纹理图像作为文本的颜色而不是单个RBG颜色。
我看不出怎么做到这一点,有可能吗?
答案 0 :(得分:3)
如果可以,请使用ImageMagick。它可以开箱即用。
examples的示例:
convert -size 800x120 xc:black -font Corsiva -pointsize 100 \
-tile tile_disks.jpg -annotate +20+80 'Psychedelic!' \
-trim +repage -bordercolor black -border 10 funfont_groovy.jpg
答案 1 :(得分:1)
我制作了这个函数,它根据定义的颜色逐个像素地替换
function imagettftexture(&$im,$textureimage, $size, $angle, $_x, $_y, $font, $text){
$w = imagesx($im);
$h = imagesy($im);
$sz = getimagesize($textureimage);
$tx = null;
switch($sz['mime']){
case 'image/png':
$tx = imagecreatefrompng($textureimage);
break;
case 'image/jpeg':
$tx = imagecreatefromjpeg($textureimage);
break;
case 'image/gif':
$tx = imagecreatefromgif($textureimage);
break;
}
//same size as $im
$tmp = imagecreatetruecolor($w,$h);
//fill with texture
imagesettile($tmp,$tx);
imagefilledrectangle($tmp, 0, 0, $w, $h, IMG_COLOR_TILED);
//a weird color
$pink = imagecolorclosest($im,255,0,255);
$rect = imagettftext($im,$size,$angle,$_x,$_y,-$pink,$font,$text); // "minus" to draw without aliasing
for($x=0;$x<$w;$x++){
$x = $x;
for($y=0;$y<$h;$y++){
$tmpcolor = imagecolorat($tmp,$x,$y);
$color = imagecolorat($im,$x,$y);
if($color == $pink)
imagesetpixel($im,$x,$y,$tmpcolor);
}
}
//useful to return same value as imagettftext
return $rect;
}
这很慢,花了很多
100ms处理350x127图像
760ms来处理1024x342图像
还有其他解决方案here