签名档动态图片:大超超范例

2013-01-15 1,873 2 技术 大超超。

考试考的很郁闷,所以回来写程序让自己开心开心。

之前在一篇文章期末考试之后网站的一些想法中提到过要开发独立文章发布页面和一个签名档动态图片,现在都已经实现了,编辑器实现时写过一篇文章,现在签名档动态图片实现,又来发发文。

写这个签名档的前提是:

1、要有内容,不是博客长文章,而是像微博形式的短小的话语;

2、要有可展示的地方,一般是放在论坛签名档里,或者其他地方;

3、其他还没考虑到

动态展示效果如下:

大超超在随记

这几个前提条件对于我来说已经具备了,所以就动手写了,花的时间比较长,是1个像素1个像素地调整的,因此做的比较精心,代码贴出分享:

<?php
include '../../include/common.php';
   
$w = ( $_GET['w'] ) ? $_GET['w'] : 430;
$w = ( $w>=680 ) ? 680 : $w;
$w = ( $w<=280 ) ? 280 : $w;
$h = 120;
$f_path = "msyahei.ttf";
$f_maobi_path = "maobi.ttf";
$save_path = './record/';
$dcc = imagecreatefrompng("dcc_self_70.png");
$logo = imagecreatefrompng("dcc_logo_28.png");
$im = imagecreate($w,$h);
$c_arr = array(
    'border'     => imagecolorallocate($im, 169, 169, 169),
    'record'     => imagecolorallocate($im,  70, 160,  88),
    'body'       => imagecolorallocate($im,  70,  70,  70),
    'background' => imagecolorallocate($im, 245, 245, 245),
    'mark'       => imagecolorallocate($im,  79,  97, 190),
    'white'      => imagecolorallocate($im, 255, 255, 255)
);
$r = $db->row("select value,datetime from wap
 where meta='add' order by datetime desc");
$value = dejson($r['value']);
$value['title'] = ( $value['title'] ) ? $value['title'].' - ' : '';
$title = $value['title'].$r['datetime'];
$mark = BLOG_NAME.' - '.substr(ROOT_URL, 0, -1);
if( substr_count($r['value'], 'MI 2') ) $title_add = '(by小米2)';
else if( substr_count($r['value'], '微信') ) $title_add = '(by微信)';
else if( substr_count($r['value'], 'Windows 7') ) $title_add = '(by电脑)';
else $title_add = '(by What?)';
$title .= $title_add;
   
$body = '  '.$value['content'];
$body = str_replace("\n", '', $body);
//对文字部分进行处理,控制textBox的宽高
$body_wh_arr = imagettfbbox(9, 0, $f_path, $body);
$body_w = $body_wh_arr[2] - $body_wh_arr[0];
$body_h = $body_wh_arr[1] - $body_wh_arr[5];
$body_cut = array($body);
$body_res = array();
$i = 0;
while( $body_w>$w-100 ){
    $body_tmp = sub_str($body_cut[$i], $w/5.8, '', 0);
    $body_res[] = $body_tmp;
    $body_cut[++$i] = end(explode($body_tmp, $body));
    $body_wh_arr = imagettfbbox(9, 0, $f_path, $body_cut[$i]);
    $body_w = $body_wh_arr[2] - $body_wh_arr[0];
    $body_h = $body_wh_arr[1] - $body_wh_arr[5];
    if( $i>2 ) break;
}
if( $i<=2 ) $body_res[] = $body_cut[$i];
$body_render = join("\n", $body_res);
if( $i>2 ) $body_render .= '...';
//设置画线宽
imagesetthickness($im, 3);
//填充背景
imagefill($im, 0, 0, $c_arr['background']);
//写主要内容(要在填充背景之后)
imagettftext($im, 8, 0, 100, 25, $c_arr['mark'], $f_path, $title);
imagettftext($im, 9, 0, 75, 50, $c_arr['body'], $f_path, $body_render);
imagettftext($im, 8, 0, $w-200, $h-10, $c_arr['mark'], $f_path, $mark);
imagettftext($im, 18, -7, 43, 25, $c_arr['record'], $f_maobi_path, '随记');
imagecopyresampled($im, $dcc, 16, 38, 0, 0, 50, 50, 70, 70);//大超超真像
imagecopyresized($im, $logo, $w-220, $h-22, 0, 0, 16, 16, 28, 28);//博客logo
//画边框(也可以用imageline画)
imagerectangle($im, -1, -1, $w, $h, $c_arr['border']);
/*
imageline($im,    0,    0, $w-1,    0, $c_arr['border']);//上横
imageline($im,    0,    0,    0, $h-1, $c_arr['border']);//左竖
imageline($im,    0, $h-1, $w-1, $h-1, $c_arr['border']);//下横
imageline($im, $w-1,    0, $w-1, $h-1, $c_arr['border']);//右竖
*/
//修饰框框四个角(每个角要削3个像素)
$four_nook = array(
    '0,0',              //左上
    ($w-1).',0',        //右上
    '0,'.($h-1),        //左下
    ($w-1).','.($h-1)   //右下
);
foreach( $four_nook as $v ){
    $k  = reset(explode(',', $v));
    $v  =   end(explode(',', $v));
    $k1 = ( $k==0 ) ? $k+1 : $k-1;
    $v1 = ( $v==0 ) ? $v+1 : $v-1;
    for( $i=2; $i<$k-1; $i++ ){//削去内边1px - 横
        imagesetpixel($im,  $i,  $v1, $c_arr['background']);
    }
    for( $i=2; $i<$v-1; $i++ ){//削去内边1px - 竖
        imagesetpixel($im,  $k1,  $i, $c_arr['background']);
    }
    imagesetpixel($im,  $k,  $v, $c_arr['white']);
    imagesetpixel($im, $k1,  $v, $c_arr['white']);
    imagesetpixel($im,  $k, $v1, $c_arr['white']);
}
//$save_ = $save_path.get_dcc_time().'.png';
//imagepng($im, $save_);
header('content-type:image/png');
imagepng($im);
imagedestroy($im);
?>

里面有较多的PHP图片处理函数,可以参考http://www.itlearner.com/code/php/group.php-20.php。在做的时候我也不熟悉,是通过结合图片验证码、图片上传水印这两个功能实现的动态签名档图片。

里面要用到字体文件,微软雅黑还比较大有19M(不知道是不是我这里的比较大),字体文件可以到“我的电脑-》控制面板-》字体”里面搜索,如果没有也可以留下你的邮件我发给你。

PS @ 2013-04-21 14:33:40:

昨天晚上改了部分代码,主要是设备来源部分的,就不贴上了。

 



声明: 本文由大超超。原创编译,转载请保留链接: http://www.thinkful.cn/archives/159.html