项目要求宽,高为传入参数;文字大小,文字间隔需要自动调节;

由于imagettftext()函数写入文字坐标点不以画布左上角为原点,而是根据文字的字体类型,字体大小,中英文,标点等因素变换(测试多组数据,Y轴0坐标点位于一个字体宽度左右位置),所以文字居中问题还未得到解决;

由于文字坐标

<?php
class Index
{
private $config = array(
'width' => '160',
'height' => '90',
'frame' => '0.05',

// 默认背景色红色,字体白色
'imageColor' => array(220,20,60,0),
'fontColor' => array(255,255,255,0),

'extend' => array(
'fontType' => 'c:/windows/fonts/simhei.ttf', // 字体类型
),
);

public function newimage($text = '测试',$options = array())
{
header("Content-type: text/html; charset=utf-8");

$options = $_GET;

$text = $_GET['text'];

$this->config = array_merge($this->config,$options);

$location = array(0,0,0);

$imageColor = $this->config['imageColor'];
$fontColor = $this->config['fontColor'];

$width = $this->config['width'];
$height = $this->config['height'];

//处理中英,标点计算字符长度
$strlength = $this->utf8_strlen($text);

// 计算边框长度
$padding = $this->config['frame'];

if( $padding < 0.5 )
{
// 百分比 以短边为标准计算padding
$padding = $height*$padding*2;
}
else
{
$padding = $padding*2;
}

// 去掉边框的有效长度
$width_1 = $width-$padding;
$height_1 = $height-$padding;

// 判断单个字体长度和高的大小
if( $strlength >=1 )
{
$oneBox = $width_1/$strlength;
}
else
{
exit('字符不能为空');
}

if( $oneBox > $height_1 )
{
$oneBox = $height_1;

if( $strlength <=1 )
{
// 一个字符
$gap = 0;

$location[1] = ($width - $oneBox)/2;
}
else
{
// 计算横向间距
$gap = ($width_1 - ($oneBox*$strlength))/($strlength-1);

$location[1] = $padding/2;
}

$location[2] = ($padding/2)+$oneBox;
// $location[2] = ($height-($padding/2)+$oneBox)*0.5;
}
else
{
$gap = 0;

$location[1] = $padding/2;

// 计算纵向坐标Y
$location[2] = (($height-$oneBox)/2)+$oneBox;
// $location[2] = ($height-($padding/2)+$oneBox)*0.5;
}

// 字体磅数计算
$size = 72*$oneBox/96;

// 分割中文字体为数组
$fontArr = preg_split('/(?<!^)(?!$)/u', $text );

// 调试
if($_GET['debug'] === 'true')
{
print_r('字符长度:'.$strlength . '<br/>');
print_r('字符磅数:'.$size . '<br/>');

print_r('单个字符:' . $oneBox . '<br/>');
print_r('边距:' . $padding/2 . '<br/>');
print_r('去掉边框的高度:' . $height_1 . '<br/>');

var_dump($fontArr);
exit();
}

$font = $this->config['extend']['fontType'];

//创建空白图片的长 、高
$img = imagecreate($width, $height);

//给图片分配颜色
imagecolorallocatealpha($img, $imageColor[0], $imageColor[1], $imageColor[2] ,$imageColor[3]);

//设置字体颜色
$color = imagecolorallocatealpha($img, $fontColor[0], $fontColor[1], $fontColor[2] ,$fontColor[3]);

//将ttf文字写到图片中
foreach ($fontArr as $key => $value)
{
imagettftext($img, $size, $location[0], $location[1]+($oneBox+$gap)*($key), $location[2], $color, $font, $value);

// imagestring($img, 5, $location[1]+($oneBox+$gap)*($key), $location[2], $value,$color);
}

//发送头信息
header('Content-Type: image/png');

imagepng($img);

imagedestroy($img);

}

// 计算中文字符串长度
public function utf8_strlen($string = null)
{
// 将字符串分解为单元
preg_match_all("/./us", $string, $match);
// 返回单元个数
return count($match[0]);
}
}

$obj = new Index();

$obj->newimage();

粗略写了使用GD2制作文字图像demo的更多相关文章

  1. cocos2d-x 利用CCLabelTTF制作文字描边与阴影效果的实现方法

    // // myttf.h// // Created by 王天宇 on 14-6-12. // // #ifndef ____SLG__myttf__ #define ____SLG__myttf_ ...

  2. 利用Adorner制作用于图像裁切的选择框

    原文:利用Adorner制作用于图像裁切的选择框 前天,我写了一篇"使用Adorner显示WPF控件的边界点"的文章.这次,使用从Adorner继承来写一个用于图像裁切的选择框. ...

  3. dreamweaver中的 map怎么调用?_制作热点图像区域

    我们浏览网页时,经常看到一些图片上会出现特别的超链接,即在一张图片上有多个局部区域和不同的网页链接,比如地图链接. 这就是映射图像(Image Map),它是指一幅根据链接对象不同而被人为划分为若干指 ...

  4. HTML5火焰文字特效DEMO演示

    效果展示:http://hovertree.com/texiao/html5/26/ 效果图: 扫描二维码查看效果:

  5. HTML5火焰文字特效DEMO演示---转载

    只有google支持 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  6. PHP中应用GD2函数在图像上添加文字

    <?php header("Content-type:text/html;charset=utf-8"); header("Content-type:image/g ...

  7. [2014.01.27]wfTextImage 文字图像组件 1.6

    全新开发的文字转图像组件--wfTextImage,使用简单,功能强大,图像处理效果极佳.     将大段的文本内容转换成GIF图片.     有效防止文字内容被复制抄袭,有效保护文字资料.      ...

  8. 【iOS发展-28】制造业UITabBarController标记控制器、定制UITabBarItem文字图像6途径和More评论

    一个.一个简单的制作过程(实际工程中不建议这样的方式,不要只展示所用原理的理解) 在AppDelegate.m在: - (BOOL)application:(UIApplication *)appli ...

  9. Quart2D文字图像绘制

    上一个是绘制简单图形,这一篇学习绘制文字.图像 //获取画布 CGContextRef context=UIGraphicsGetCurrentContext(); //设置边框颜色 CGContex ...

随机推荐

  1. JavaScript自学笔记(3)--- 用JS来实现网页浮窗

    最近做个小项目,给网页加个浮窗,考验了基础的css,js技术,还是蛮有意思的,代码如下(部分代码来源于引用,见底部) <!DOCTYPE html> <html> <he ...

  2. 获取redis实例绑定cpu的情况

    redis是一个单线模型的nosql类型的数据库,而目前接触到的服务器大都是多核的,比如8c,16c,32c,64c等等.为了充分利用主机,在一台主机上必然会部署多个redis实例,默认情况cpu会随 ...

  3. 00 - PXE | 环境准备

    00 - PXE | 环境准备 TFTP PXE 1. TFTP服务搭建 安装环境Centos7.3 1.1 安装 # yum install xinetd # yum install tftp # ...

  4. [Python机器学习]鸢尾花分类 机器学习应用

    1.问题简述 假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣.她收集了每朵鸢尾花的一些测量数据: 花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米. 她还有一些鸢尾花的测量数据, ...

  5. 容错保护机制:Spring Cloud Hystrix

    最近在学习Spring Cloud的知识,现将容错保护机制Spring Cloud Hystrix 的相关知识笔记整理如下.[采用 oneNote格式排版]

  6. MySQL 8 服务器插件

    安装插件 内置插件时服务器能够自动识别的,通常在服务器启动时加载内置插件. 在mysql.plugin表中注册的插件,这种插件不同于内置插件(内置插件不需要注册),通常在服务器启动时会加载mysql. ...

  7. 哈夫曼树 动态数组的使用vector

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  8. gulp常用插件之gulp-babel使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-babel这是Babel的Gulp插件. 此自述文件适用于gulp-babel v8 + Babel v7检查7.x分支以了解使用Bab ...

  9. gulp常用插件之autoprefixer使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 autoprefixer这是一款自动管理浏览器前缀的插件,它可以解析CSS文件并且添加浏览器前缀到CSS内容里. 更多使用文档请点击访问autop ...

  10. [HNOI2009]图的同构记数

    题意 在所以置换下,本质不同的\(n\)阶图个数 做法 可以假想成\(K_n\),边有黑白两色,黑边存在于原图,白边存在于补图 由于\(n\le 60\),可以手算出拆分数不大,所以我们爆搜置换群 对 ...