专栏首页仙士可博客PHP图片文字合成居中

PHP图片文字合成居中

PHP处理图片

PHP使用GD库创建和处理包括GIF,PNG,jpef,wbmp以及xpm在内的多种格式的图像。

以下教程:图片合成文字,实现合成文字水平、垂直居中。

读取图片资源

imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字符串。

根据图片格式选用不同函数

imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像 imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像 imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像 imagecreatefromwbmp():创建一块画布,并从 WBMP 文件或 URL 地址载入一副图像 imagecreatefromstring():创建一块画布,并从字符串中的图像流新建一副图像

获取图片尺寸

imagesx($image);
imagesy($image);

创建颜色

imagecolorallocatealpha(resource $image , int $red , int $green , int $blue , int $alpha); // 带透明度
imagecolorallocate(resource $image , int $red , int $green , int $blue);      // 普通

获取文字内容所需尺寸

imagettfbbox ( float $size, float $angle, string $fontfile, string $text):array

 取得使用 TrueType 字体的文本的范围。(种类型字体文件的扩展名是.ttf,类型代码是tfil。)

以上是每个步骤使用的关键函数说明。以下是完整代码示例。

<?php
/**
 * Created by PhpStorm.
 * User: Siam
 * Date: 2019/2/4 0004
 * Time: 下午 10:58
 */

$main = imagecreatefromjpeg('./test.jpg');

$fontSize = 38;
$width   = imagesx($main);
$height   = imagesy($main);

//1.设置字体的路径
$font    = "./t.ttf";
//2.填写水印内容
$content = "My name is Siam,中文是宣言";
//3.设置字体颜色和透明度
$color   = imagecolorallocatealpha($main, 255, 255, 255, 0);

$fontBox = imagettfbbox($fontSize, 0, $font, $content);//获取文字所需的尺寸大小 

//4.写入文字 (图片资源,字体大小,旋转角度,坐标x,坐标y,颜色,字体文件,内容)
imagettftext($main, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), ceil(($height - $fontBox[1] - $fontBox[7]) / 2), $color, $font, $content);

// 浏览器输出 也可以换成保存新图片资源
header("Content-type:jpg");
imagejpeg($main);

效果:

最关键的步骤是获取到文字内容所需的尺寸大小

原图的大小 - 文字内容的大小 = 剩余空白大小;

剩余空白大小 / 2 的效果就是自动居中。

我们可以在以上基础上封装成一个灵活的函数

<?php
function imageAddText($path, $content, $x = 'auto', $y = 'auto', $fontSize = 38, $font = './t.ttf'){
    $temp = array(1=>'gif', 2=>'jpeg', 3=>'png');
    // 获取图片信息
    $imageInfo = getimagesize($path);
    $imageType = $temp[$imageInfo[2]];

    $getfunc = "imagecreatefrom$imageType";
    $outfunc = "image$imageType";

    $resource = $getfunc($path);

    $width    = imagesx($resource);
    $height   = imagesy($resource);

    $color = imagecolorallocatealpha($resource, 255, 255, 255, 0);

    $fontBox = imagettfbbox($fontSize, 0, $font, $content);//文字水平居中实质

    if ($x === 'auto'){
        $x = ceil(($width - $fontBox[2]) / 2);
    }
    if ($y === 'auto'){
    $y = ceil(($height - $fontBox[1] - $fontBox[7]) / 2);
}

    imagettftext($resource, $fontSize, 0, $x, $y, $color, $font, $content);

    /*输出图片*/
    //浏览器输出
    header("Content-type:".$imageType);
    $outfunc($resource);
}

// 自动居中
// imageAddText('./test.jpg', 'My name is Siam,中文名是宣言');
// 声明x y值
// imageAddText('./test.jpg', 'My name is Siam,中文名是宣言',200);
// imageAddText('./test.jpg', 'My name is Siam,中文名是宣言','auto', '300');

Siam博客原文链接:→→→传送门

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 怒薅羊毛:白嫖GitHub作为个人博客免费图床

    很多小伙伴私信反馈说,个人博客搭建完以后,写文章时,图片上传和存放成了一个问题。我看很多人都把图片放在仓库一起,然后试图通过相对路径的方式来引用图片,结果很多人...

    AI算法与图像处理
  • [PHP] pmap可以查看进程占用内存的详细情况

    while true;do clear;date;for i in `ps --no-headers -o "pid" -C php-fpm`;do pmap...

    陶士涵
  • 让自动化工作流解放你的双手

    相信很多小伙伴和我目前的现状是一样的,公司的前端部署测试和上线都是通过人工去操作,当我们本地开发完成之后,在本地进行打包,然后将打包后的 dist 文件上传到服...

    石燕平
  • web前端开发可以从事哪些工作

    随着互联网进几年来的高速发展,web前端这一门技术和对应的行业岗位就应运而生。Web前端主要就是网站的页面展现以及动态交互部分,比如大家逛淘宝所看到的页面就是w...

    千锋哈尔滨IT培训
  • php连接mysql数据库详细步骤(图文)

    mysql 是一款广受欢迎的数据库,由于它是开源的半商业软件,所以市场占有率高,备受php开发者的青睐,一直被认为是php的最佳搭档。同时php也具有强大的数据...

    叫我可儿呀
  • Python实用技巧大任务切分

    今天来说说,Python 中的任务切分。以爬虫为例,从一个存 url 的 txt 文件中,读取其内容,我们会获取一个 url 列表。我们把这一个 url 列表称...

    用户1564362
  • 性能测试-Jmeter工具介绍

    1.测试计划(test plan)---描述一个性能测试,包含本次测试所有相关功能

    用户6367961
  • php配置redis拓展流程与redis的使用

    开发架构二三事
  • [PHP] 循环查看php-fpm的内存占用情况

    在webmail的业务中进行发信,如果携带了附件,会把附件拼接内嵌到邮件正文里,这时会极大的占用内存,可以使用以下命令查看fpm的进程内存占用

    陶士涵
  • 内存崩溃了?其实你只需要换一种方式

    使用 JDK 自带的 Set 集合来进行 URL 去重,看上去效果不错,但是这种做法有一个致命了缺陷,就是随着采集的 URL 增多,你需要的内存越来越大,最终会...

    Java_老男孩

扫码关注云+社区

领取腾讯云代金券