PHP图片不变形处理(留白与截取)

本文为转载内容,并对原始方法进行了修改优化。
原文地址:PHP:图片不变形处理(留白处理与截取处理)
此函数用于处理图片,变成缩略图,能使图片不变形,能选择两种模式,
一是图片留白处理(放在画布中间),另一个是截取图片处理(从中间截取);
(对函数进行了优化,进行通用文件类型适配)

/**
 * [get_thumb 图片裁切]
 * @param  [type] $url       [原始图片地址]
 * @param  [type] $dstwidth  [宽]
 * @param  [type] $dstheight [高]
 * @param  [type] $type      [type 用1表示留白方式处理,2表示截取方式处理]
 * @return [type]            [description]
 */
function get_thumb($url, $dstwidth, $dstheight, $type)
{
    //0.局部变量声明
    $srcimg=0;
    $dstx=$dsty=$srcx=$srcy=0;
    $dstimg=imagecreatetruecolor($dstwidth,$dstheight);
    //1.得到读取远程文件
    $yuan = @file_get_contents($url);
    $srcimg = imagecreatefromstring($yuan);
    //2.得到原来文件的宽和高$src_w,$src_h
    $src_w=imagesx($srcimg);
    $src_h=imagesy($srcimg);
    //3.计算变形
    if($dstwidth/$dstheight < $src_w/$src_h) { //传来的图像是横图
        if($type==1) { //用户需要留白处理
            $dsty=(int)($dstheight-$src_h*$dstwidth/$src_w)/2;
            $dstheight=$dstheight-2*$dsty;
        } else { //用户需要截取处理
            $srcx=(int)($src_w-$dstwidth*$src_h/$dstheight)/2;
            $src_w=$src_w-2*$srcx;
        }
    } else { //传来的图像是竖图或等比的图
        if($type==1) { //用户需要留白处理
            $dstx=(int)($dstwidth-$src_w*$dstheight/$src_h)/2;
            $dstwidth=$dstwidth-2*$dstx;
        } else { //用户需要截取处理
            $srcy=(int)($src_h-$dstheight*$src_w/$dstwidth)/2;
            $src_h=$src_h-2*$srcy;
        }
    }
    //4.绘制缩略图
    imagecopyresampled($dstimg,$srcimg,$dstx,$dsty,$srcx,$srcy,$dstwidth,$dstheight,$src_w,$src_h);
    return $dstimg;
}

完整测试代码:

<?php
/**
 * @Author: [FENG] <1161634940@qq.com>
 * @Date:   2020-06-03T17:24:34+08:00
 * @Last Modified by:   [FENG] <1161634940@qq.com>
 * @Last Modified time: 2020-06-03T19:15:03+08:00
 */

$url = './ceshi.jpg';

$image = get_thumb($url, 720, 480, 2);

header("Content-Type: image/jpeg; charset=utf-8"); // 设置header头
imagealphablending($image, false); // (很重要)不合并颜色,直接用 PNG 图像颜色替换,包括透明色;
imagesavealpha($image, true);  // (很重要)设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息;
imagepng($image); // 保存图片为png
imagedestroy($image); // 清除画布资源
die;

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论