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 相关文章推荐
php file_get_contents函数轻松采集html数据
Apr 22 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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
基于文本的访客签到簿
2006/10/09 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
毕业生就业自荐书
2013/12/15 职场文书
初中生操行评语大全
2014/04/24 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
成绩报告单家长评语
2014/12/30 职场文书
五一劳动节慰问信
2015/02/14 职场文书
高中团支书竞选稿
2015/11/21 职场文书
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript