PHP 裁剪图片成固定大小代码方法


Posted in PHP onSeptember 09, 2009

做一个首页调用图像,有时候往往需要获得固定大小的图像,因为首页的图像位置通常由设计人员指定好了,如果是做最新发布图像调用,因为不知道客户会上传什么比例的图像,所以,有时候也就没有办法确定图像的比例,前台页面编写人员通常会采用固定 img 元素高宽的办法来达到控制图像不溢出,但如果图像的比例不是需要的比例,就会造成图像调用后变形,很大程度上影响了页面的美观,有解决的方法是,按照原图比例进行缩放,缩放后的图像难免会有空白,空白处填以颜色,这样虽然图像不变形了,但这样会有很多问题,比如,如果用户发一个图像很高但宽度一般的图像,如果压缩成一个1:1的图像,那么压缩后基本就会看不到图像了。
我这里的解决办法是,任意图像裁剪成固定大小,图像不变形,空白处拉伸填充,图像始终铺满,不留空白,用过bcastr的朋友应该知道,bcastr就是保证了图像调用的不变形,对一个固定大小输出的图像框,源图有以下几种情况:
1:需要输出的图像的高宽比源图的高宽都小,写成判断 $new_width<$src_width && $new_height<$src_width
2:需要输出的图像的高宽比原图的高宽都大,写成判断 $new_width>$src_width && $new_height>$src_width
3:排除第1,2两种,即一边放大,一边缩小的情况加上等于的判断
对于1,2,函数处理代码完全相同,所以可以归纳成一个处理语句

给出php实现代码

<?php 
/* 
*说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 
* 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高 
* written by smallchicken 
* time 2008-12-18 
*/ 
// 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白 
function my_image_resize($src_file, $dst_file , $new_width , $new_height) { 
if($new_width <1 || $new_height <1) { 
echo "params width or height error !"; 
exit(); 
} 
if(!file_exists($src_file)) { 
echo $src_file . " is not exists !"; 
exit(); 
} 
// 图像类型 
$type=exif_imagetype($src_file); 
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF); 
if(!in_array($type, $support_type,true)) { 
echo "this type of image does not support! only support jpg , gif or png"; 
exit(); 
} 
//Load image 
switch($type) { 
case IMAGETYPE_JPEG : 
$src_img=imagecreatefromjpeg($src_file); 
break; 
case IMAGETYPE_PNG : 
$src_img=imagecreatefrompng($src_file); 
break; 
case IMAGETYPE_GIF : 
$src_img=imagecreatefromgif($src_file); 
break; 
default: 
echo "Load image error!"; 
exit(); 
} 
$w=imagesx($src_img); 
$h=imagesy($src_img); 
$ratio_w=1.0 * $new_width / $w; 
$ratio_h=1.0 * $new_height / $h; 
$ratio=1.0; 
// 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了) 
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) { 
if($ratio_w < $ratio_h) { 
$ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大 
}else { 
$ratio = $ratio_w ; 
} 
// 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求 
$inter_w=(int)($new_width / $ratio); 
$inter_h=(int) ($new_height / $ratio); 
$inter_img=imagecreatetruecolor($inter_w , $inter_h); 
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h); 
// 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像 
// 定义一个新的图像 
$new_img=imagecreatetruecolor($new_width,$new_height); 
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h); 
switch($type) { 
case IMAGETYPE_JPEG : 
imagejpeg($new_img, $dst_file,100); // 存储图像 
break; 
case IMAGETYPE_PNG : 
imagepng($new_img,$dst_file,100); 
break; 
case IMAGETYPE_GIF : 
imagegif($new_img,$dst_file,100); 
break; 
default: 
break; 
} 
} // end if 1 
// 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪 
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) ) 
else{ 
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值 
// 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大 
$inter_w=(int)($w * $ratio); 
$inter_h=(int) ($h * $ratio); 
$inter_img=imagecreatetruecolor($inter_w , $inter_h); 
//将原图缩放比例后裁剪 
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h); 
// 定义一个新的图像 
$new_img=imagecreatetruecolor($new_width,$new_height); 
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height); 
switch($type) { 
case IMAGETYPE_JPEG : 
imagejpeg($new_img, $dst_file,100); // 存储图像 
break; 
case IMAGETYPE_PNG : 
imagepng($new_img,$dst_file,100); 
break; 
case IMAGETYPE_GIF : 
imagegif($new_img,$dst_file,100); 
break; 
default: 
break; 
} 
}// if3 
}// end function 
?>
PHP 相关文章推荐
检测png图片是否完整的php代码
Sep 06 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
php微信公众号开发之快递查询
Oct 20 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 21 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 #PHP
PHP 危险函数全解析
Sep 09 #PHP
php 获取远程网页内容的函数
Sep 08 #PHP
php 遍历数据表数据并列表横向排列的代码
Sep 05 #PHP
不要轻信 PHP_SELF的安全问题
Sep 05 #PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 #PHP
php getsiteurl()函数
Sep 05 #PHP
You might like
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php 数组的一个悲剧?
2011/05/11 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
python 格式化输出百分号的方法
2019/01/20 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
python数据抓取3种方法总结
2021/02/07 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
Java程序员面试题
2013/07/15 面试题
民族团结先进个人材料
2014/02/05 职场文书
模范教师事迹材料
2014/02/10 职场文书
保证书格式范文
2014/04/28 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
起诉状范本
2015/05/20 职场文书
教师节获奖感言
2015/07/31 职场文书
员工规章制度范本
2015/08/07 职场文书