PHP生成任意尺寸并居中裁剪缩略图的函数

  在项目中经常需要对图片进行各种处理,比如生成缩略图,并且生成的缩略图还要保持原有图片的宽高比例不变形,下面就分享一个非常好用的PHP生成缩略图函数,可以手动输入自定义尺寸并居中裁剪保持图片比例不变形,代码如下:

<?php
// 应用公共文件
/**
 * 居中裁剪图片
 * @param string $source [原图路径]
 * @param int $width [设置宽度]
 * @param int $height [设置高度]
 * @param string $target [目标路径]
 * @return bool [裁剪结果]
 */

function image_center_crop($source, $width, $height, $target)
{
	if (!file_exists($source)) return false;
	/* 根据类型载入图像 */
	switch (exif_imagetype($source)) {
		case IMAGETYPE_JPEG:
			$image = imagecreatefromjpeg($source);
			break;
		case IMAGETYPE_PNG:
			$image = imagecreatefrompng($source);
			break;
		case IMAGETYPE_GIF:
			$image = imagecreatefromgif($source);
			break;
	}
	if (!isset($image)) return false;
	/* 获取图像尺寸信息 */
	$target_w = $width;
	$target_h = $height;
	$source_w = imagesx($image);
	$source_h = imagesy($image);
	/* 计算裁剪宽度和高度 */
	$judge = (($source_w / $source_h) > ($target_w / $target_h));
	$resize_w = $judge ? ($source_w * $target_h) / $source_h : $target_w;
	$resize_h = !$judge ? ($source_h * $target_w) / $source_w : $target_h;
	$start_x = $judge ? ($resize_w - $target_w) / 2 : 0;
	$start_y = !$judge ? ($resize_h - $target_h) / 2 : 0;
	/* 绘制居中缩放图像 */
	$resize_img = imagecreatetruecolor($resize_w, $resize_h);
	imagecopyresampled($resize_img, $image, 0, 0, 0, 0, $resize_w, $resize_h, $source_w, $source_h);
	$target_img = imagecreatetruecolor($target_w, $target_h);
	imagecopy($target_img, $resize_img, 0, 0, $start_x, $start_y, $resize_w, $resize_h);
	/* 将图片保存至文件 */
	if (!file_exists(dirname($target))) mkdir(dirname($target), 0777, true);
	switch (exif_imagetype($source)) {
		case IMAGETYPE_JPEG:
			imagejpeg($target_img, $target);
			break;
		case IMAGETYPE_PNG:
			imagepng($target_img, $target);
			break;
		case IMAGETYPE_GIF:
			imagegif($target_img, $target);
			break;
	}
	return boolval(file_exists($target));
}
<?php
// 使用方法
if (image_center_crop($source,220,150,$target)) {
	echo "<img src='$target'>";
}

本站原创内容,如需转载请注明来源:https://www.liutonghui.com/186.html

上一篇 2020-08-22
下一篇 2020-12-11

评论列表(2条)

发表评论

captcha

相关推荐

  • 解决 PHP 8.1 隐式类型转换导致缩略图生成错误

      这几天解决了一个困扰已久的问题,我的博客系统在文章上传图片生成缩略图时,在本地测试环境没有任何问题,但在服务器环境中总是生成缩略图失败,报错:"Implicit conversion from float"。排查了 PHP 和环境扩展组件库、目录权限、图片格式大小等都没有问题。在百思不得其解时,我注意到了一个平时不太注意的细节,我在本地测试环境用的是 PHP 8.0,服务器上用的是 PHP 8.1,经过反复测试问题果然出在这里。  ......

    2023-09-04
    7150
  • 小米手机的营销策略为什么让人反感

      近年来,小米手机备受用户关注,但也频频引发争议。小米创始人雷军以其低价策略和饥饿营销战略闻名,成功吸引了大批忠实粉丝,然而,这一商业模式也让小米备受用户抱怨和吐槽。让我们一起深入探讨这些争议点。   首先,雷军的低价策略一直是小米的杀手锏。小米的产品通常价格相对较低,却能提供相对不错的性能。这种性价比吸引了大量用户,特别是那些有着有限预算的消费者。然而,问题在于这一策略是建立在所谓的&ldquo;饥饿营销&rdquo;基础之上......

    2014-01-10
    18164
  • PHP中冒号、endif、endforeach、endwhile使用介绍

      在做项目开发时,我们经常见到一些奇怪的PHP语法,比如下面这段代码: &lt;?php if(empty($GET_['a'])): ?&gt; &lt;font color="red"&gt;空的&lt;/font&gt; &lt;?php endif; ?&gt;   这段if语句后面没有大括号{},而是使用了冒号:,后面又来了一句endif   对于相当一部分PHP爱好者来说根本没见过啊,这些是什么东西呢?难道是那些博客的开发......

    2014-08-21
    21570
  • 王杰出道35周年出新歌,60岁浪子仍洒脱

      12月17日,消失在歌迷视线中多年的老牌创作型歌手王杰突然发布了一首新歌《一场游戏一场梦(结束篇)》,今年是2022年,正好是王杰出道35年整。1987年12月19日,王杰在台湾发行首张专辑《一场游戏一场梦》正式出道,这张专辑一经发行就轰动了整个华语乐坛,在中国台湾、中国香港、中国大陆、东南亚等地都创下了惊人的销量,专辑中的同名主打歌《一场游戏一场梦》、《安妮》等歌曲直到今天依然是KTV点唱率非常高的歌曲。 点击上方播放视......

    2022-12-24
    8160
  • 1比3惨败越南,中国足球脸都不要了

      以国足目前的能力来看,1比3大比分惨败给越南似乎也不是什么出人意料的结果。大年初一的晚上,2022年世界杯亚洲区预选赛中,中国队以1比3惨败给越南队,很多人认为这样的比赛结果出人意料,这是一场爆冷的比赛,因为中国队几十年来从来没有输给过越南。   事实上这些人对国足目前的水平了解不够多,认为中国队的实力要强于越南队,轻松拿下这场比赛是情理之中的事。其实有这样想法的人完全是不懂球,自从中超联赛十几年前由广州恒大开始搞金元足球以来,中......

    2022-02-02
    5680
  • 梅西圆梦世界杯冠军,职业生涯圆满无遗憾

      2022年卡塔尔世界杯落下了帷幕,阿根廷队以7:5艰难的战胜了法国队,获得了本届世界杯冠军。梅西还拿到了本届世界杯的最佳球员奖项。梅西在赛后激动的捧起并亲吻大力神杯,这一刻他终于圆了自己的世界杯冠军梦。   在赛前很多球迷预测法国队将会战胜阿根廷队卫冕本届冠军,因为从球员的阵容和状态来看,法国队的优势更明显一些。比赛的过程真的是一波三折,充满了跌宕起伏的戏剧性。阿根廷队一度场面占优,上半场梅西点球破门,随后迪马利亚进球,让阿根廷队......

    2022-12-19
    5460
  • PHP数据分页实现原理

      数据分页是将大量数据分割成若干较小的页面,以提高用户体验和系统性能的技术。在PHP中,实现数据分页通常涉及以下步骤和原理:   查询总记录数:在进行分页之前,需要知道总共有多少条记录。通常使用 COUNT() 查询获取总记录数。   计算分页信息:根据总记录数、每页显示的记录数以及当前页码,计算出分页所需的信息,如总页数、当前页的起始记录索引等。   执行分页查询:根据分页信息,从数据库中获取相应页码的数据。   在页面上呈现数据:......

    2013-10-21
    9530
  • 华为Mate60手机开售,麒麟5G芯片回归,遥遥领先!

      没开发布会,没有预告就直接开卖备受关注的旗舰手机,华为Mate60系列算是开了个头。这几天华为登上了热搜,这次是因为华为Mate60手机携带&ldquo;麒麟芯片&rdquo;提前开售,瞬间售罄,同时也标志着麒麟5G芯片的正式回归。这一消息在各大主流媒体平台上迅速引发热议,网友们纷纷发表意见,自媒体人也争相蹭热度,提出各自观点。   如果你打开华为商城app,可以看到华为已经在自家商城上架了华为Mate60系列手机,而这些手机已经......

    2023-08-31
    7270