当前位置: 首页 > 工具软件 > Imagine-PHP > 使用案例 >

yii2-imagine 处理图片 php图片切圆角

璩和璧
2023-12-01
<?php

namespace frontend\controllers;

use frontend\components\BaseRestController;
use Imagine\Image\Box;
use Imagine\Image\ImageInterface;
use Imagine\Image\ImagineInterface;
use Imagine\Image\Palette\RGB;
use Imagine\Image\Point;
use Imagine\Imagick\Font;
use Yii;
use yii\imagine\Image;

class TestImageController extends BaseRestController
{
    const VERSION = 02;

    private $_imagine;

    private $_palette;

    /**
     * @return ImagineInterface
     */
    protected function getImagine()
    {
        if (!$this->_imagine) {
            $this->_imagine = Image::getImagine();
        }
        return $this->_imagine;
    }

    /**
     * @return RGB
     */
    protected function getPalette()
    {
        if (!$this->_palette) {
            $this->_palette = new RGB();
        }
        return $this->_palette;
    }

    /**
     * @param ImageInterface $bg
     * @param int $x
     * @param int $y
     * @param string $imagePath
     * @param int $w
     * @param int $h
     */
    protected function fillImage($bg, $x, $y, $imagePath, $w, $h)
    {
        $imagine = $this->getImagine();
        $imageImagine = $imagine->open($imagePath);
        $imageImagine->resize(new Box($w, $h));
        $bg->paste($imageImagine, new Point($x, $y));
    }

    // 四张竖向模板
    public function actionCreate()
    {
        $imagine = $this->getImagine();
        $palette = $this->getPalette();

        $fileName = "/temp/make-test-test-test.jpg";
        // 图片1
        $onePath = Yii::getAlias('@webroot' . '/temp/1.jpg');
        $oneInfo = getimagesize($onePath);
        $oneWidth = 375 / 2;
        $oneHeight = 375 / 2 / $oneInfo[0] * $oneInfo[1];
        $oneWidth = (int)$oneWidth;
        $oneHeight = (int)$oneHeight;
        // 图片2
        $twoPath = Yii::getAlias('@webroot' . '/temp/2.jpg');
        $twoInfo = getimagesize($twoPath);
        $twoWidth = 375 - $oneWidth;
        $twoHeight = $twoWidth / $twoInfo[0] * $twoInfo[1];
        $twoWidth = (int)$twoWidth;
        $twoHeight = (int)$twoHeight;
        // 图片3
        $threePath = Yii::getAlias('@webroot' . '/temp/3.jpg');
        $threeInfo = getimagesize($threePath);
        $threeWidth = 375 - $oneWidth;
        $threeHeight = $oneHeight - $twoHeight;
        $threeWidth = (int)$threeWidth;
        $threeHeight = (int)$threeHeight;
        // 图片4
        $fourPath = Yii::getAlias('@webroot' . '/temp/4.jpg');
        $fourInfo = getimagesize($fourPath);
        $fourWidth = 375;
        $fourHeight = 375 / $fourInfo[0] * $fourInfo[1];
        $fourWidth = (int)$fourWidth;
        $fourHeight = (int)$fourHeight;
        // 二维码
        $codePath = Yii::getAlias('@webroot' . '/temp/code.jpg');
        $codeInfo = getimagesize($codePath);
        $codeWidth = 100;
        $codeHeight = 100 / $codeInfo[0] * $codeInfo[1];
        $codeWidth = (int)$codeWidth;
        $codeHeight = (int)$codeHeight;
        // 参数定义
        $width = 375;
        $totalHeight = 0;
        $totalHeight = $totalHeight + $oneHeight + $fourHeight + $codeHeight;


        $bg = $imagine->create(new Box($width, $totalHeight), $palette->color('#fff'));
        $this->fillImage($bg, 0, 0, $onePath, $oneWidth, $oneHeight);
        $this->fillImage($bg, $oneWidth, 0, $twoPath, $twoWidth, $twoHeight);
        $this->fillImage($bg, $oneWidth, $twoHeight, $threePath, $threeWidth, $threeHeight);
        $this->fillImage($bg, 0, $oneHeight, $fourPath, $fourWidth, $fourHeight);
        $this->fillImage($bg, 0, $oneHeight + $fourHeight, $codePath, $codeWidth, $codeHeight);
        $bg->draw()->text(
            '哈哈哈',
            new \Imagine\Gd\Font(Yii::getAlias('@webroot/font/msyh.ttc'), '18', $palette->color('#333')),
            new Point($codeWidth + 10, $oneHeight + $fourHeight + 10)
        );
        $bg->save(Yii::getAlias('@webroot' . $fileName), [
            'jpeg_quality' => 200,
        ]);
    }


    // 图片切圆,拼到小程序码上
    public function actionTest()
    {

        // 头像
        $imgPath = Yii::getAlias('@webroot' . '/temp/header.jpg');
        // 小程序码
        $minCode = Yii::getAlias('@webroot' . '/temp/min_code.jpg');
        // 头像的存储位置
        $header = Yii::getAlias('@webroot' . '/temp/default_avatar.jpg');
        // 合成的小程序存储位置
        $codeSavePath = Yii::getAlias('@webroot' . '/temp/make-min-code.jpg');
        // 切圆
        $this->radiusImage($imgPath);
        $imagine = $this->getImagine();
        $minCodeImagine = $imagine->open($minCode);
        $minCodeImagine->resize(new Box(1000, 1000));
        $headerImagine = $imagine->open($header);
        $headerImagine->resize(new Box(440, 440));
        $minCodeImagine->paste($headerImagine, new Point(280, 280));
        $minCodeImagine->save($codeSavePath, [
            'jpeg_quality' => 200,
        ]);
    }

    protected function radiusImage($imgPath)
    {
        $extension = pathinfo($imgPath);
        $savePath = Yii::getAlias('@webroot' . '/temp/default_avatar.' . $extension['extension']);
        $srcImg = null;
        switch ($extension['extension']) {
            case 'jpg':
                $srcImg = imagecreatefromjpeg($imgPath);
                break;
            case 'png':
                $srcImg = imagecreatefrompng($imgPath);
                break;
        }
        $info = getimagesize($imgPath);
        $width = $info[0];
        $height = $info[1];
        $minLength = min($width, $height);
        $img = imagecreatetruecolor($width, $height);
        //这一句一定要有
        imagesavealpha($img, true);
        //拾取一个完全透明的颜色,最后一个参数127为全透明
        $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
        imagefill($img, 0, 0, $bg);
        $radius = $minLength / 2; //圆半径
        for ($x = 0; $x < $minLength; $x++) {
            for ($y = 0; $y < $minLength; $y++) {
                $rgbColor = imagecolorat($srcImg, $x, $y);
                if (((($x - $radius) * ($x - $radius) + ($y - $radius) * ($y - $radius)) <= ($radius * $radius))) {
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
            }
        }
        $result = imagepng($img, $savePath);
        imagedestroy($img);
        return $result ? $savePath : false;
    }

}

 

 类似资料: