PHP使用函数绘制图片梳理

作者: 乘风御上者 分类: PHP 发布时间: 2019-10-24 13:03

最近做项目时用到了php给海报图添加用户昵称、头像、二维码等操作,回头温习了下php的绘图相关函数。

整理下思路记录下来,以备下次使用。

要获取图片资源,从来源上分为两种方式:一种是通过本地路径或远程URL获得图片,一种是直接根据字符串中的图像流获得图片。

/**
 * 通过URL获得图片资源
 * @param $url 本地或远程地址
 */
public function getImgByUrl($url)
{
    $imgInfoArray = getimagesize($url);
    $mimeArray = explode('/', $imgInfoArray['mime']);
    switch ($mimeArray[1]) {
        case "png":
            $image = imagecreatefrompng($url);
            break;
        case "jpeg":
            $image = imagecreatefromjpeg($url);
            break;
        case "jpg":
            $image = imagecreatefromjpeg($url);
            break;
        case "gif":
            $image = imagecreatefromgif($url);
            break;
        default:
            $image = false;
    }
    return $image;
}

/**
 * 通过字符串图像流获得图片资源
 * @param $str 字符串的图像流
 */
public function getImgByStr($str)
{
    $image = imagecreatefromstring($str);
    return $image;
}

上面是根据已有图片获得图片资源,直接通过php生成图片资源就更简单了:

// 只记录创建真彩图像资源画布
$newImg = imagecreatetruecolor(宽, 高);
// 给画布填充颜色:RGB对应颜色十进制值
$color = imagecolorallocate($newImg, R, G, B);
// 上面是创建颜色,这里是填充操作
imagefill($newImg, 填充坐标X, 填充坐标Y, $color);

/**
 * $newImg:上面新建的画布图
 * $srcImg:载入的图片资源,将该图片合并到画布图上
 * $dst_x / $dst_y:设置载入的图片在画布中左上角XY坐标值
 * $src_x / $src_y:载入图片可选择只使用一部分原图,此处设置原图要使用的部分,左上角XY坐标值
 * $dst_w / $dst_h:设置载入的图片在画布中宽高值
 * $src_w / $src_h:载入图片可选择只使用一部分原图,此处设置原图要使用的部分,宽高值
 * 最后四个参数灵活运用即可缩放载入的图片
 */
imagecopyresampled($newImg, $srcImg, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

绘图过程中遇到绘制圆形头像,需要通过计算将头像的每个像素搬到画布上:

// 在画布上画圆形头像
$img = 画布资源;
// 头像可先缩放到合适大小(使用imagecopyresampled)
$avatarImg = 头像图资源;
// 正方形头像随便取一个值
$avatarWH = 图像宽或高;
$avatarX = 头像在画布的坐标X值;
$avatarY = 头像在画布的坐标Y值;
// 半径
$r = $avatarWH / 2;
for ($x = 0; $x < $avatarWH; $x++) {
    for ($y = 0; $y < $avatarWH; $y++) {
        // 获取像素点颜色
        $color = imagecolorat($avatarImg, $x, $y);
        if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r) < ($r * $r)))) {
            // 将上面获取到的像素点颜色绘制到画布上
            imagesetpixel($img, $x + $avatarX, $y + $avatarY, $color);
        }
    }
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复