使用 PHP 和 GD 库生成仿古文书法样式的图片

使用 PHP 和 GD 库生成仿古文书法样式的图片

涟漪小筑
2025-03-25 / 0 评论 / 27 阅读 / 正在检测是否收录...

前言

 在现代信息技术的支持下,我们可以使用 PHP 生成具有中国传统书法风格的图片。本篇文章将介绍如何使用 GD 库,通过 PHP 代码实现书法网格排版图片的自动生成。

gif_img_1

效果展示

效果图


gif_img_1

项目概述

 本程序的主要功能是将输入的汉字内容按照 书法网格布局 自动排版,并以 图片 的形式输出。核心思路包括:

  1. 设定 固定列数 和 固定行数。
  2. 计算 字符大小、网格间距,确保文字规整排版。
  3. 使用 GD 库绘制 边框、网格,并将汉字写入画布。
  4. 支持 分页 机制,超出单页内容后自动换页生成新图片。
  5. 输出 PNG 图片,实现最终的可视化展示。

gif_img_1

代码实现

<?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, ...)";

gif_img_1

功能说明


gif_img_1

总结

11

评论 (0)

取消