当前位置 : 主页 > 网络编程 > PHP >

php生成图片

来源:互联网 收集:自由互联 发布时间:2021-06-28
php生成图片 php生成图片 TableImage.php title = $title; } } public function addRow(Row $row) { if ($row instanceof Row) { $this-rows [] = $row; } } public function setBottom(Row $bottom) { if ($bottom instanceof Row) { $this-bottom =
php生成图片
php生成图片
TableImage.php
 title = $title;
        }
    }

    public function addRow(Row $row)
    {
        if ($row instanceof Row) {
            $this->rows [] = $row;
        }
    }

    public function setBottom(Row $bottom)
    {
        if ($bottom instanceof Row) {
            $this->bottom = $bottom;
        }
    }

    public function setMargin($margin)
    {
        $this->margin = ImageCommon::getSize($margin);
    }

    public function setBorder($border)
    {
        $this->border = ImageCommon::getSize($border);
    }

    public function setBgColor($bgColor)
    {
        $this->bgColor = ImageCommon::getColor($bgColor);
    }

    public function setFont($font)
    {
        $this->font = ImageCommon::getText($font);
    }

    public function draw($path, $ucode)
    {
        $this->toRecalculateTheHeight();

        $this->width = $this->getWidth() + 2 * $this->border;
        $this->height = $this->getHeight() + 2 * $this->border;

        $this->img = imagecreatetruecolor($this->width, $this->height);

        $this->drawBg();

        $x = $this->border;
        $y = $this->border;

        $this->drawTitle($x, $y);
        $this->drawBody($x, $y);
        $this->drawBottom($x, $y);

        header("content-type:image/png");
        $time = mTime();

        $png = $path . $time . $ucode . '.png';

        $sys_p = TONG_ABSOLUTE_PATH . '/' . $png;

        chmod(TONG_ABSOLUTE_PATH, 0777);

        imagepng($this->img, $png);

        copy($png, $sys_p);

        imagedestroy($this->img);

        return substr($png, 1);
    }

    /**
     * 单元格高度重计算
     */
    private function toRecalculateTheHeight()
    {
        if ($this->title != null) {
            $rHeight = 0;
            foreach ($this->title->getCols() as $col) {
                $rHeight = max($this->title->getHeight(), $rHeight);

                if (!is_array($col->getText())) {
                    continue;
                }

                $fontHeight = ImageCommon::getTextHeight("请", $col->getFontSize(), $this->font);
                $nowHeight = $col->getHeight();
                $cHeight = $col->getHeight($fontHeight);

                $rHeight = max(array(
                    $cHeight, $rHeight, $nowHeight
                ));
            }

            foreach ($this->title->getCols() as $col) {
                $col->setHeight($rHeight);
            }
        }

        foreach ($this->rows as $row) {
            $rHeight = 0;
            foreach ($row->getCols() as $col) {
                $rHeight = max($col->getHeight(), $rHeight);

                if (!is_array($col->getText())) {
                    continue;
                }

                $fontHeight = ImageCommon::getTextHeight("请", $col->getFontSize(), $this->font);
                $nowHeight = $col->getHeight();
                $cHeight = $col->getHeight($fontHeight);

                $rHeight = max(array(
                    $cHeight, $rHeight, $nowHeight
                ));
            }

            foreach ($row->getCols() as $col) {
                $col->setHeight($rHeight);
            }
        }

        if ($this->bottom != null) {
            $rHeight = 0;
            foreach ($this->bottom->getCols() as $col) {
                $rHeight = max($this->bottom->getHeight(), $rHeight);

                if (!is_array($col->getText())) {
                    continue;
                }

                $fontHeight = ImageCommon::getTextHeight("请", $col->getFontSize(), $this->font);
                $nowHeight = $col->getHeight();
                $cHeight = $col->getHeight($fontHeight);

                $rHeight = max(array(
                    $cHeight, $rHeight, $nowHeight
                ));
            }

            foreach ($this->bottom->getCols() as $col) {
                $col->setHeight($rHeight);
            }
        }
    }

    /**
     * 画背景色
     */
    private function drawBg()
    {
        $bgColorData = ImageCommon::getColorArray($this->bgColor);
        $bgColor = imagecolorallocate($this->img, $bgColorData ['r'], $bgColorData ['g'], $bgColorData ['b']);
        imagefilledrectangle($this->img, 0, 0, $this->width, $this->height, $bgColor);
    }

    /**
     * 画标题头
     *
     * @param int $x
     *            标题头X轴偏移量
     * @param int $y
     *            标题头Y轴偏移量
     */
    private function drawTitle(&$x, &$y)
    {
        $this->drawRow($this->title, $x, $y);
    }

    /**
     * 画主体内容
     *
     * @param int $x
     *            主体内容X轴偏移量
     * @param int $y
     *            主体内容Y轴偏移量
     */
    private function drawBody(&$x, &$y)
    {
        foreach ($this->rows as $row) {
            $this->drawRow($row, $x, $y);
        }
    }

    /**
     * 画尾部
     *
     * @param int $x
     *            尾部X轴偏移量
     * @param int $y
     *            尾部Y轴偏移量
     */
    private function drawBottom(&$x, &$y)
    {
        $this->drawRow($this->bottom, $x, $y);
    }

    /**
     * 画单行
     *
     * @param Row $row
     *            行对象
     * @param int $x
     *            行X轴偏移量
     * @param int $y
     *            行Y轴偏移量
     */
    private function drawRow($row, &$x, &$y)
    {
        if (is_null($row) || !($row instanceof Row)) {
            return;
        }

        $cols = $row->getCols();
        $length = count($cols);

        $displacementY = 0;

        for ($i = 0; $i < $length; $i++) {
            $displacement = $this->drawRect($cols [$i], $x, $y);
            $displacementY = max($displacementY, $displacement ['y']);

            $x += $displacement ['x'] + $row->getMargin();
        }

        $x = $this->border;
        $y += $displacementY + $this->margin;
    }

    /**
     * 画单元格
     *
     * @param Col $col
     *            单元格对象
     * @param int $x
     *            单元格X轴偏移量
     * @param int $y
     *            单元格Y轴偏移量
     * @return int[] 偏移量
     */
    private function drawRect(Col $col, $x, $y)
    {
        $width = $col->getWidth();
        $height = $col->getHeight();

        // 偏移量返回值
        $displacement = [
            'x' => $width,
            'y' => $height
        ];

        // 起止结束坐标
        $xStart = $x;
        $yStart = $y;
        $xEnd = $xStart + $width;
        $yEnd = $yStart + $height;

        $borderSize = $col->getBorderSize();

        $fontSize = $col->getFontSize();

        $text = $col->getText();

        // 画外框
        $borderColorData = ImageCommon::getColorArray($col->getBorderColor());
        $borderColor = imagecolorallocate($this->img, $borderColorData ['r'], $borderColorData ['g'], $borderColorData ['b']);
        imagefilledrectangle($this->img, $xStart, $yStart, $xEnd, $yEnd, $borderColor);

        // 画内框
        $bgColorData = ImageCommon::getColorArray($col->getBgColor());
        $bgColor = imagecolorallocate($this->img, $bgColorData ['r'], $bgColorData ['g'], $bgColorData ['b']);
        imagefilledrectangle($this->img, $xStart + $borderSize, $yStart + $borderSize, $xEnd - $borderSize, $yEnd - $borderSize, $bgColor);

        // 输入文本
        $textColorData = ImageCommon::getColorArray($col->getColor());
        $textColor = imagecolorallocate($this->img, $textColorData ['r'], $textColorData ['g'], $textColorData ['b']);

        if (is_array($text)) {
            $tY = 0;
            $textsHeight = 0;

            Log::record("开始绘制多行文本框 => " . json_encode($text));

            $textBoxs = array();

            for ($i = 0; $i < count($text); $i++) {
                $textBox = ImageCommon::getTextSize($text[$i], $fontSize, $this->font);

                $textBoxs[] = $textBox;

                $textsHeight += $textBox['height'];
            }

            for ($i = 0; $i < count($text); $i++) {
                $t = $text[$i];

                $textBox = $textBoxs[$i];

                // 计算文本偏移位置
                $textX = $xStart + ($width - $textBox ['width']) / 2;
                $textY = $yStart + $tY + ($height - $textsHeight) / 2;

                $tY += $textBox ['height'];

                $data = array(
                    'x' => $textX,
                    'y' => $textY,
                    'w' => $textBox['width'],
                    'h' => $textBox['height'],
                );

                Log::record("绘制多行文本: " . $t . " => " . json_encode($data), Log::DEBUG);

                ImageTTFText($this->img, $fontSize, 0, $textX - $textBox ['x'], $textY - $textBox ['y'], $textColor, $this->font, $t);
            }
        } else {
            $textBox = ImageCommon::getTextSize($text, $fontSize, $this->font);

            // 计算文本偏移位置
            $textX = $xStart + ($width - $textBox ['width']) / 2;
            $textY = $yStart + ($height - $textBox ['height']) / 2;

            $data = array(
                'x' => $textX,
                'y' => $textY,
                'w' => $textBox['width'],
                'h' => $textBox['height'],
            );

            Log::record("绘制单行文本: " . $text . " => " . json_encode($data), Log::DEBUG);

            ImageTTFText($this->img, $fontSize, 0, $textX - $textBox ['x'], $textY - $textBox ['y'], $textColor, $this->font, $text);
        }

        return $displacement;
    }

    public function getWidth()
    {
        $width = 0;
        if ($this->title instanceof Row) {
            $width = $this->title->getWidth();
        }

        if ($this->bottom instanceof Row) {
            $width = max($width, $this->bottom->getWidth());
        }

        foreach ($this->rows as $row) {
            $width = max($width, $row->getWidth());
        }

        return $width;
    }

    public function getHeight()
    {
        $height = 0;
        if ($this->title instanceof Row) {
            $height += $this->title->getHeight();
        }

        foreach ($this->rows as $row) {
            $height += $this->margin;
            $height += $row->getHeight();
        }

        if ($this->bottom instanceof Row) {
            $height += $this->margin;
            $height += $this->bottom->getHeight();
        }

        return $height;
    }
}

class Row
{

    private $margin;

    private $cols = [];

    function __construct($margin = 1)
    {
        $this->margin = ImageCommon::getSize($margin);
    }

    public function addCol(Col $col)
    {
        if ($col instanceof Col) {
            $this->cols [] = $col;
        }
    }

    public function getMargin()
    {
        return $this->margin;
    }

    public function getCols()
    {
        return $this->cols;
    }

    public function getWidth()
    {
        $width = 0;

        foreach ($this->cols as $col) {
            $width += $col->getWidth();
            $width += $this->margin;
        }

        return $width - $this->margin;
    }

    public function getHeight($fontHeight = null)
    {
        $height = 0;

        foreach ($this->cols as $col) {
            $height = max($height, $col->getHeight($fontHeight));
        }

        return $height;
    }

    public function __toString()
    {
        $colsString = '';
        $isFirst = true;
        foreach ($this->cols as $col) {
            $colsString .= ($isFirst ? '' : ', ') . $col;
            $isFirst = false;
        }

        return 'Row [margin=' . $this->margin . ', cols=[' . $colsString . ']]';
    }
}

class Col
{

    private $text;

    private $width;

    private $height;

    private $bgColor;

    private $borderColor;

    private $borderSize;

    private $fontSize;

    private $color;

    function __construct($text, $width, $height, $bgColor = ImageCommon::DEFAULT_COLOR, $borderColor = ImageCommon::DEFAULT_COLOR, $borderSize = ImageCommon::DEFAULT_SIZE, $fontSize = ImageCommon::DEFAULT_SIZE, $color = ImageCommon::DEFAULT_COLOR)
    {
        Log::record(is_array($text) ? "多行" : "单行", Log::DEBUG);

        $this->text = ImageCommon::getText($text);

        $this->width = ImageCommon::getSize($width);
        $this->height = ImageCommon::getSize($height);

        $this->bgColor = ImageCommon::getColor($bgColor);
        $this->borderColor = ImageCommon::getColor($borderColor);
        $this->borderSize = ImageCommon::getSize($borderSize);

        $this->fontSize = ImageCommon::getSize($fontSize);
        $this->color = ImageCommon::getColor($color);
    }

    public function getText()
    {
        return $this->text;
    }

    public function getWidth()
    {
        return $this->width;
    }

    public function getHeight($fontHeight = null)
    {
        if ($fontHeight != null && is_array($this->text) && intval($fontHeight) > 0) {
            return $this->height + (count($this->text) - 1) * $fontHeight;
        }

        return $this->height;
    }

    public function setHeight($height)
    {
        $this->height = ImageCommon::getSize($height);
        Log::record("设置高度->" . $this->height, Log::DEBUG);
    }

    public function getBgColor()
    {
        return $this->bgColor;
    }

    public function getBorderColor()
    {
        return $this->borderColor;
    }

    public function getBorderSize()
    {
        return $this->borderSize;
    }

    public function getFontSize()
    {
        return $this->fontSize;
    }

    public function getColor()
    {
        return $this->color;
    }

    public function __toString()
    {
        return 'Col [color=' . $this->color . ', fontSize=' . $this->fontSize . ', text=' . $this->text . ', width=' . $this->width . ', height=' . $this->height . ', bgColor=' . $this->bgColor . ', borderColor=' . $this->borderColor . ', borderSize=' . $this->borderSize . ']';
    }
}

/**
 * 图片公共方法和常亮
 *
 * @author Administrator
 *
 */
class ImageCommon
{

    /**
     * 默认RGB颜色
     *
     * @var string RBG颜色字符串
     */
    const DEFAULT_COLOR = '#000000';

    /**
     * 默认尺寸
     *
     * @var integer 默认尺寸
     */
    const DEFAULT_SIZE = 20;

    /**
     * 获取颜色RGB信息
     *
     * @param string $color
     *            RGB代码
     * @return number[] RGB数组
     */
    public static function getColorArray($color)
    {
        if (!self::getColor($color)) {
            return [
                'r' => 0,
                'g' => 0,
                'b' => 0
            ];
        }

        return [
            'r' => hexdec(substr($color, 1, 2)),
            'g' => hexdec(substr($color, 3, 2)),
            'b' => hexdec(substr($color, 5, 2))
        ];
    }

    /**
     * 判断该字符串是否为RGB颜色字符串
     *
     * @param string $color
     *            待判断字符串
     * @return boolean 是否为RGB颜色字符串
     */
    public static function isColor($color)
    {
        return preg_match('/\#[0-9a-fA-F]{6}/i', $color);
    }

    /**
     * 判断该字符串是否为RGB颜色字符串,如果不为RGB颜色字符串则返回默认RGB颜色字符串
     *
     * @param string $color
     *            待验证字符串
     * @return string RGB颜色字符串
     */
    public static function getColor($color)
    {
        return self::isColor($color) ? $color : self::DEFAULT_COLOR;
    }

    /**
     * 获取有效尺寸
     *
     * @param int $size
     *            尺寸
     * @return int 有效尺寸
     */
    public static function getSize($size)
    {
        return is_int($size) ? abs($size) : self::DEFAULT_SIZE;
    }

    /**
     * 获取文本内容
     *
     * @param string $text
     *            输入内容
     * @return string 文本字符串
     */
    public static function getText($text)
    {
        Log::record(json_decode($text), Log::DEBUG);
        if (is_array($text)) {
            return $text;
        }

        if (!is_string($text)) {
            return '';
        }

        $nowText = trim($text);

        if (strlen($nowText) == 0) {
            return '';
        }

        return $nowText;
    }

    /**
     * 获取文本框区域大小
     *
     * @param string $text
     *            文本内容
     * @param int $fontSize
     *            字号
     * @param string $font
     *            字体文件路径
     * @throws Exception 当字体文件无法读取的时候抛出异常
     * @return number[] 高度/宽度/X偏移量/Y偏移量
     */
    public static function getTextSize($text, $fontSize, $font)
    {
        if (is_null($font) || strlen($font) == 0 || !is_file($font)) {
            throw new Exception ("font is must be file");
        }

        $textBox = ImageTTFBBox(self::getSize($fontSize), 0, $font, self::getText($text));

        // 文本区域框大小
        return [
            'width' => $textBox [2] - $textBox [0],
            'height' => $textBox [1] - $textBox [7],
            'x' => $textBox [6],
            'y' => $textBox [7]
        ];
    }

    /**
     * 获取文本高度
     * @param string $text
     *            文本内容
     * @param int $fontSize
     *            字号
     * @param string $font
     *            字体文件路径
     * @throws Exception 当字体文件无法读取的时候抛出异常
     * @return number 高度
     */
    public static function getTextHeight($text, $fontSize, $font)
    {
        return self::getTextSize($text, $fontSize, $font)['height'];
    }
}
网友评论