php 多个图片合并为一张

摘要:
文本换行生成一张图片并将其与多张图片合并为一张$mWidth?

文字换行生成一张图片

且和多张图片合并为一张

<?php
$fontUrl = '/usr/share/fonts/truetype/myyuanjian/汉仪细中圆简.ttf';
$fontUrl = '/usr/share/fonts/truetype/arphic/ukai.ttc';
header("Content-type: image/png");
mb_internal_encoding("UTF-8"); // 设置编码




function autowrap($fontsize, $angle, $fontface, $string, $width) {
// 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度
    $content = "";
    // 将字符串拆分成一个个单字 保存到数组 letter 中
    for ($i = 0; $i < mb_strlen($string); $i++) {
        $letter[] = mb_substr($string, $i, 1);
    }
    foreach ($letter as $l) {
        $teststr = $content . "" . $l;
        $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
//        var_dump($teststr, $testbox);
        // 判断拼接后的字符串是否超过预设的宽度
        if (($testbox[2] > $width) && ($content !== "")) {
            
            $content .= "
";
        }
        $content .= $l;
    }
    return array($content, $testbox);
}
//
$imgWidth = 640;
$imgHeight = 1024;
$text = "前段时间练习使用 PHP 的 GD 库时,为了文本的自动换行纠结了很久。虽然可以通过插入 \n 实现换行,但考虑到文本中既有中文又有英文,强制限定每多少个文字就换行的效果很差。后来终于找到了一个英文下的自动换行的方法,其大概原理是将空格作为分隔符,将字符串分割为一个个单词,然后再一个接一个地拼接在一起,判断其长度是否超过画布,若超过则换行再拼接,否则继续拼接。考虑到中文需要将每个文字都拆开,所以我进行了一点修改,完整代码如下。";
list($text, $textBox) = autowrap(14, 0, $fontUrl, $text, 640); // 自动换行处理
$imgHeight = $textBox[1] - $textBox[7] + 20;
$bg = imagecreate($imgWidth, $imgHeight); // 创建画布
$color = imagecolorAllocate($bg,250,250,250);   //分配一个灰色
imagefill($bg,0,0,$color); 
$white = imagecolorallocate($bg, 0, 0, 0); // 创建白色
// 若文件编码为 GB2312 请将下行的注释去掉
// $text = iconv("GB2312", "UTF-8", $text);
imagettftext($bg, 13, 0, 20, 30, $white, $fontUrl, $text);
imagejpeg($bg, '/tmp/words.jpg');
imagedestroy($bg);
//exit();

//人物
$path_1 = "/tmp/2.jpg";
//装备图片
$path_2 = "/tmp/5.jpg";

$path_3 = "/tmp/words.jpg";

$img1Info = getimagesize($path_1);
$img2Info = getimagesize($path_2);
$img3Info = getimagesize($path_3);

$mWidth = 640;
$mHeight = $img1Info[1] + $img2Info[1] + $img3Info[1];

//将人物和装备图片分别取到两个画布中
$image_1 = imagecreatefromjpeg($path_1);
$image_2 = imagecreatefromjpeg($path_2);

$image_4 = imagecreatefromjpeg($path_3);
////创建一个和人物图片一样大小的真彩色画布(ps:只有这样才能保证后面copy装备图片的时候不会失真)
//$image_3 = imageCreatetruecolor(imagesx($image_1),imagesy($image_1));

$image_3 = imageCreatetruecolor($mWidth,$mHeight);



//为真彩色画布创建白色背景,再设置为透明
$color = imagecolorallocate($image_3, 255, 255, 255);
imagefill($image_3, 0, 0, $color);
//imageColorTransparent($image_3, $color);
//首先将人物画布采样copy到真彩色画布中,不会失真
$xPos = $img1Info[0] > $mWidth ? 0 : ($mWidth - $img1Info[0])/2;
$tmpWidth = $img1Info[0] > $mWidth ? $mWidth : $img1Info[0];
imagecopyresampled($image_3,$image_1,$xPos,0,0,0,$tmpWidth,imagesy($image_1),imagesx($image_1),imagesy($image_1));
//再将装备图片copy到已经具有人物图像的真彩色画布中,同样也不会失真

$xPos = $img2Info[0] > $mWidth ? 0 : ($mWidth - $img2Info[0])/2;
$tmpWidth = $img2Info[0] > $mWidth ? $mWidth : $img2Info[0];
imagecopyresampled($image_3,$image_2,$xPos,$img1Info[1],0,0,$tmpWidth,imagesy($image_2),imagesx($image_2),imagesy($image_2));

imagecopyresampled($image_3,$image_4,0,$img1Info[1] + $img2Info[1],0,0,min($mWidth, imagesx($image_4)),imagesy($image_4),imagesx($image_4),imagesy($image_4));


//imagecopymerge($image_3,$image_2, 0,$img1Info[1],0,0,imagesx($image_2),imagesy($image_2), 100);
//imagecopymerge($image_3,$image_4, 0,$img1Info[1] + $img2Info[1],0,0,imagesx($image_2),imagesy($image_2), 100);
//将画布保存到指定的gif文件
//imagegif($image_3);
imagepng($image_3);
imagedestroy($image_3);

免责声明:文章转载自《php 多个图片合并为一张》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sleep() 与 wait()的比较centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Notepad++使用小技巧

Notepad++是一款很好用的写笔记和代码的应用。 我们可以用它来写博客草稿和日常的笔记。那么,长时间看一个界面,当然会对眼睛有伤害。 所以,一个护眼的背景。是必须的。 下面就是我经常用到的护眼色,绿色。。。 而且,作为程序员,写的代码也必须要有高亮格式。和自动补齐的功能,Notepad++自带这种功能。   Notepad++护眼色与代码高亮设置 下面...

Notepad++中如何设置自动换行以及行宽

view-->word wrap; setting->preference-->vertical edge settings; Notepad++中如何设置自动换行以及行宽 http://jingyan.baidu.com/article/6c67b1d68eddbc2787bb1e8c.html...

jquery.dataTables表格中的内容怎么设置让它不自动换行

在table中增加 ,这样会撑大td。会出现滚动条。其他内容配置:每列宽度: "aoColumnDefs": [ { "sWidth": "10%", "aTargets": [ 0 ] }, { "sWidth": "12%", "aTargets"...

CSS网页制作时实现自动换行的小技巧

<style><style><style><style>.tb{}{table-layout:fixed}.td{}{overflow:hidden;}</style><tableclass=tbwidth=80><tr><tdwidth=25%class=tdno...

程序员解决问题的60个策略

根本的指导方针 首先写代码的时候最好不要有缺陷。最好的修复方法就是让bug胎死腹中。 良好的单元测试 强制数据库约束 使用输入验证框架 避免未实现的“else”条件 在应用到主程序之前知道如何在孤立的情况下使用 日志 2.print语句。往往额外输出个一两行将有助于隔离问题。 3.切换至详细的日志记录。详细的日志记录有助于发现更多的线索。 4.搜索日志。如...

C#(winform)的label自动换行

Label是没有自动换行属性的,不像Textbox有WordWrap属性 尽管没有自动换行的属性,但也能够自动换行, 首先AutoSize改成false; 然后调整Label的大小,长和宽 (也就是说Label的面积是固定的,只要内容不超过label的面积,内容就可以实现自动换行 缺点:占用比较多的位置,尽管有时内容仅有一行)...