本文为转载内容,并对原始方法进行了修改优化。
原文地址: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;
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论