使用imagettftext使用图像设置带纹理的背景

时间:2011-08-24 20:42:08

标签: php

我可以使用imagettftext()函数使用GD和PHP创建图像。文本的颜色使用imagecolorallocate()指定,但颜色采用RGB格式。

我有一系列纹理图像 - 每个10 x 10像素。我想使用这些纹理图像作为文本的颜色而不是单个RBG颜色。

我看不出怎么做到这一点,有可能吗?

2 个答案:

答案 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

enter image description here

答案 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