正文

彩字图片处理程序2005-09-14 13:53:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yang/4736.html

分享到:

<?php
/**
功能:获得一个图片文件的尺寸大小,返回一个数组
参数:
filename:图片文件名
*/
    function GetFileSize($filename){
        $str = exec("identify '$filename'");
        $s = split(" ",$str);
        $s = split("x",$s[2]);
        return $s;
        $src_image_w=$s[0];
        $src_image_h=$s[1];
    }

/**
功能:将多个GIF文件合成一个
参数:
scr:原文件名列表
dst:目的文件名
pos_x,pos_y:合成后的图片位置列表
delay:图片间隔显示时间
loop:图片循环次数;0,无限循环
*/
    function ComposeGIF($src = array(),$dst,$pos_x = array(),$pos_y = array(),$delay=100,$loop=0){
        $s = GetFileSize($dst);
        $src_image_w=$s[0];
        $src_image_h=$s[1];
        //$cmdline = "convert -delay $delay -size ".$src_image_w."x".$src_image_h." -page +0+0 $dst";
        for($i=0;$i<count($src);$i++){
            //$cmdline .= " -page +".$pos_x[$i]."+".$pos_y[$i]." ".$src[$i];
            $cmdline .= "composite -geometry +".($pos_x[$i]+0)."+".($pos_y[$i]+0)." '". $src[$i]."' $dst $dst";
            $x=exec($cmdline);
        }
    }

/**
功能:创建一个GIF文件
参数:
dst:目的文件名
pos_x,pos_y:要创建的图片大小,象素
color:图片颜色
*/
    function CreateGIF($dst,$pos_x,$pos_y,$color){
        $cmdline = "convert -size $pos_x"."x"."$pos_y xc:$color $dst";
        $x=exec($cmdline);
    }

/**
功能:将一个字符串写入图片文件
参数:
str:字符串
src:源文件名
dst:目的文件名
pos_x,pos_y:要写入图片文件的位置
color:填充字的颜色
font:选用的字体
fontsize:选用的字号
*/
    function Char2GIF($str,$src,$dst,$pos_x,$pos_y,$color,$font,$fontsize=22){
        $utf_str = gb2utf8($str);
        $cmdline = "convert -pointsize $fontsize -encoding unicode -fill \"$color\" -font $font -draw \"text ".($pos_x+0).",".($pos_y+0)." '".$utf_str."'\" $src $dst";
        $x=exec($cmdline);
    }

/**
功能:将一个字符串写入图片文件,实现图文混排的内部函数每次调用生成一张JPG,以便最终合成为多帧动画GIF
参数:
string:字符串
background:选用的背景图,源文件名
dst:目的文件名
font:选用的字体
fontsize:选用的字号
pn:第n张图,pn为奇数或偶数的时候图片的位置不同(合成GIF会形成动画效果)
*/
function color_msg_in($string,$background,$dst,$font,$fontsize,$pn){
    global $array_pic;
    global $n_pic;
    $font_array = array();
    $font_array[0] = "/www/webroot/caizi/stxinwei.ttf";
    $font_array[1] = "/www/webroot/caizi/stxinwei.ttf";
    $font_array[2] = "/www/webroot/caizi/stxinwei.ttf";
    //取原图片大小
    $s = GetFileSize($background);
    $src_image_w=$s[0];
    $src_image_h=$s[1];

    $array_pos_x = array();
    $array_pos_y = array();
    $array_scr = array();
    //找一个字数尽可能多的词,是否对应一个图片
    for(;strlen($string)!=0;){
        $n++;
        //echo ($string)."<br>";//调试语句*********************************************
        for($k=strlen($string);$k>0;$k--){
            $str = substr($string,0,$k);
            //echo $k."<br>";//调试语句*********************************************
            if (file_exists("/www/webroot/caizi/image/".$str.".gif")){        //有图片可以使用
                $s = GetFileSize("/www/webroot/caizi/image/".$str.".gif");
                $image_w=$s[0];
                $image_h=$s[1];
                if($next_x+$image_w<=$src_image_w){//加上当前图片,当前行不会超过右边界
                    $image_x = $next_x;
                    $image_y = $next_y;
                }
                else{//另起一行
                    $image_x = 0;
                    $next_y += $curr_height;
                    $curr_height = 0;
                    $image_y = $next_y;
                    $next_x = 0;
                }
                if($next_y+$image_h>$src_image_h){//加上当前图片,超过下边界
                    $fn=create_new_file("/www/webroot/caizi","result",".gif");
                    color_msg($string,$background,$fn,$font,$fontsize);
                    $array_pic[$n_pic++]=$fn;
                    return 0;
                    break;
                }
                //写入图片文件
                $array_scr = array();
                $array_scr[0] = "/www/webroot/caizi/image/".$str.".gif";
                $array_pos_x[0]=$image_x;$array_pos_y[0]=$image_y;
                if ($pn==1&&$n%2==0)$array_pos_y[0]++;
                if ($pn==2&&$n%2==1)$array_pos_y[0]++;
                ComposeGIF($array_scr,$dst,$array_pos_x,$array_pos_y);
                $next_x += $image_w;//计算下一次要写的位置
                if ($curr_height<$image_h) $curr_height=$image_h;
                $string = substr($string,$k);//截掉已写入的字!
                break;
            }
            if (file_exists("/www/webroot/caizi/image/".$str.".jpg")){        //有图片可以使用
                $s = GetFileSize("/www/webroot/caizi/image/".$str.".jpg");
                $image_w=$s[0];
                $image_h=$s[1];
                if($next_x+$image_w<=$src_image_w){//加上当前图片,当前行不会超过右边界
                    $image_x = $next_x;
                    $image_y = $next_y;
                }
                else{//另起一行
                    $image_x = 0;
                    $next_y += $curr_height;
                    $curr_height = 0;
                    $image_y = $next_y;
                    $next_x = 0;
                }
                if($next_y+$image_h>$src_image_h){//加上当前图片,超过下边界
                    $fn=create_new_file("/www/webroot/caizi","result",".gif");
                    color_msg($string,$background,$fn,$font,$fontsize);
                    $array_pic[$n_pic++]=$fn;
                    return 0;
                    break;
                }
                //写入图片文件
                $array_scr[0] = "/www/webroot/caizi/image/".$str.".jpg";
                $array_pos_x[0]=$image_x;$array_pos_y[0]=$image_y;
                if ($pn==1&&$n%2==0)$array_pos_y[0]++;
                if ($pn==2&&$n%2==1)$array_pos_y[0]++;
                ComposeGIF($array_scr,$dst,$array_pos_x,$array_pos_y,0);
                $next_x += $image_w;//计算下一次要写的位置
                if ($curr_height<$image_h) $curr_height=$image_h;
                $string = substr($string,$k);//截掉已写入的字!
                break;
            }

            if(($k==2&&$str>"~")||$k==1){//这是一个汉字,并且没有对应的图片,写入TTF汉字
                $text_x = $next_x;
                $text_y = $next_y;
                //生成汉字随机色
                $string_color = "#";
                $c1 = dechex(rand(0,255));$c2 = dechex(rand(0,255));$c3 = dechex(rand(0,255));
                $string_color .= (strlen($c1)==1 ? ("0".($c1)) : ($c1));
                $string_color .= (strlen($c2)==1 ? ("0".($c2)) : ($c2));
                $string_color .= (strlen($c3)==1 ? ("0".($c3)) : ($c3));
                //随机生成汉字使用的字体
                $font_num = ($i/2) % count($font_array);
                $font = $font_array[$font_num];

                if($next_x+$fontsize<=$src_image_w){//加上当前图片,当前行不会超过右边界
                    $text_x = $next_x - 2;
                    $text_y = $next_y+$fontsize;
                }
                else{//另起一行
                    $text_x = 0;
                    $next_y += $curr_height;
                    $curr_height = 0;
                    $text_y = $next_y+$fontsize;
                    $next_x = 0;
                }
                if($next_y+$fontsize>$src_image_h){//加上当前图片,超过下边界
                    $fn=create_new_file("/www/webroot/caizi","result",".gif");
                    color_msg($string,$background,$fn,$font,$fontsize);
                    $array_pic[$n_pic++]=$fn;
                    return 0;
                    break;
                }
                //写入图片文件
                $array_scr[0] = "/www/webroot/caizi/image/".$str.".gif";
                $array_pos_x[0]=$text_x;$array_pos_y[0]=$text_y;
                Char2GIF($str,$dst,$dst,$text_x,$text_y,$string_color,$font,$fontsize);
                $next_x += $fontsize;//计算下一次要写的位置
                if ($curr_height<$image_h) $curr_height=$image_h;
                //截掉已写入的字!
                $string = substr($string,$k);
                break;
            }
        }//内循环
    }//外循环

}

function create_new_file($path,$pre,$suf){
    $tmpfname = tempnam($path,$pre);
    rename($tmpfname, $tmpfname.$suf);
    $tmpfname.=$suf;
    return $tmpfname;
}
function color_msg($string,$background,$dst,$font,$fontsize){
    $fn1=create_new_file("/www/webroot/caizi","tmp",".jpg");
    $fn2=create_new_file("/www/webroot/caizi","tmp",".jpg");
    $x=exec("cp /www/webroot/caizi/background.jpg $fn1");
    $x=exec("cp /www/webroot/caizi/background.jpg $fn2");
    color_msg_in($string,$background,$fn1,0,22,1);
    color_msg_in($string,$background,$fn2,1,22,2);
    exec("convert -delay 50 -size 128x128 -page +0+0 $fn1 -page +0+0 $fn2 -loop 0 $dst");
    unlink($fn1);
    unlink($fn2);
}

global $array_pic;
global $n_pic;
$array_pic = array();

/*
$fn=create_new_file("/www/webroot/caizi","result",".gif");
$n_pic=0;
$array_pic[$n_pic++]=$fn;
color_msg("将一个字符串写入图片文件,实现图文混排的内部函数每次调用生成一张JPG。将一个字符串写入图片文件,实现图文混排的内部函数每次调用生成一张JPG。","background.jpg",$fn,0,22);

switch($n_pic){
    case 7:    $n_pic = 3;break;
    case 3: $n_pic = 2;break;
}
echo $n_pic."\n";
echo $array_pic[0]."\n";
$array_result = array();
$array_result[0] = $array_pic[0];
for ($i=1;$i<$n_pic;$i++){
    $array_result[$i] = $array_pic[count($array_pic)-$i];
    echo $array_result[$i]."\n";
}

for ($i=1;$i<count($array_pic);$i++){
    if(!in_array($array_pic[$i],$array_result)) unlink($array_pic[$i]);
}
*/
?>

阅读(369) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册