前言
在现代信息技术的支持下,我们可以使用 PHP 生成具有中国传统书法风格的图片。本篇文章将介绍如何使用 GD 库,通过 PHP 代码实现书法网格排版图片的自动生成。
效果展示
项目概述
本程序的主要功能是将输入的汉字内容按照 书法网格布局 自动排版,并以 图片 的形式输出。核心思路包括:
- 设定 固定列数 和 固定行数。
- 计算 字符大小、网格间距,确保文字规整排版。
- 使用 GD 库绘制 边框、网格,并将汉字写入画布。
- 支持 分页 机制,超出单页内容后自动换页生成新图片。
- 输出 PNG 图片,实现最终的可视化展示。
代码实现
<?php
// 生成书法图片
// 设定字体文件路径(不强制使用字体)
$fontPath = realpath('./中魏碑简体.ttf');
// 文字内容
$text = "见天地方知寒来暑往,秋收冬藏,感受天高无穷,体悟自身渺小,如沧桑一束。
见众生人性百态徐徐展开,虽人心难测,如神明不可探,却知众生皆有所因。
见自己看到贪嗔痴恨,七情六欲,在真我本我面前,学会敬畏豁达与宽容,内心平静,万籁俱寂,再无纷扰能够影响。
人是未来佛,佛是过来人,与天地间感悟规律,与众生中洞察事相,于自我处寻找安宁,此乃人生之境也。";
$text = preg_replace('/\s/', '', $text); // 去除空白字符
$textLength = mb_strlen($text, 'UTF-8');
// 设置字体大小 & 网格间距
$fontSize = 18;
$padding = 30;
// 每个字的宽高(加上间距)
$charWidth = $fontSize + $padding;
$charHeight = $fontSize * 1.5 + $padding;
// 设定**固定列数**
$fixedColCount = 11; // 固定11列
$rowCount = 14; // 每列14行
// 设定外边距
$marginTop = 70;
$marginBottom = 70;
// 计算**单页最多可容纳的字数**
$maxCharsPerPage = $fixedColCount * $rowCount;
// 计算需要的页数
$pageCount = ceil($textLength / $maxCharsPerPage);
// echo $pageCount;die;
// 计算单页大小(加上边框 & 外边距)
$pageWidth = $charWidth * $fixedColCount + 4 + 100; // 4px 边框
$pageHeight = $charHeight * $rowCount + $marginTop + $marginBottom + 4 + 100; // 4px 边框
// 依次生成每页
for ($page = 0; $page < $pageCount; $page++) {
// 创建画布
$image = imagecreatetruecolor($pageWidth + 50, $pageHeight - 75);
if (!$image) {
die("错误:无法创建图像!");
}
// 颜色定义
$white = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 200, 0, 0);
$black = imagecolorallocate($image, 0, 0, 0);
$borderColor = imagecolorallocate($image, 200, 0, 0); // 边框颜色
// 填充背景
imagefill($image, 0, 0, $white);
// 画最外层边框(2px)
imagerectangle($image, 51, 71, $pageWidth - 2, $pageHeight - 65 - 100, $borderColor);
imagerectangle($image, 55, 75, $pageWidth - 7, $pageHeight - 70 - 100, $borderColor);
$charWidth = ($pageWidth - 2 - 51) / $fixedColCount;
// 画网格
for ($i = 1; $i < $fixedColCount; $i++) {
$x = $marginLeft + $i * $charWidth + 50;
imageline($image, $x, $marginTop + 5, $x, $pageHeight - $marginBottom - 100, $red);
}
// 计算当前页的起始文字索引
$startIndex = $page * $maxCharsPerPage;
$endIndex = min($startIndex + $maxCharsPerPage, $textLength);
// 写入文字(从右到左,列满再换)
for ($i = $startIndex; $i < $endIndex; $i++) {
$relativeIndex = $i - $startIndex;
$col = $fixedColCount - 1 - floor($relativeIndex / $rowCount); // 从最右列开始
$row = $relativeIndex % $rowCount; // 从上到下填充
$x = $marginLeft + $col * $charWidth + ($padding / 2) + 50;
$y = $marginTop + $row * $charHeight + $charHeight - ($padding / 2);
imagettftext($image, $fontSize, 0, $x, $y, $black, $fontPath, mb_substr($text, $i, 1, 'UTF-8'));
}
// 保存图片(多页用文件存储)
imagepng($image, "page_$page.png");
imagedestroy($image);
}
// 输出最终提示
echo "已生成 $pageCount 张图片 (page_0.png, page_1.png, ...)";
评论 (0)