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读取excel文件示例分享(更新修改excel)
Feb 27 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
php时间计算相关问题小结
May 09 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
php格式文件打开的四种方法
Feb 24 PHP
laravel 创建命令行命令的图文教程
Oct 23 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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&amp;MYSQL服务器配置说明
2006/10/09 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
python 文件与目录操作
2008/12/24 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
python3中确保枚举值代码分析
2020/12/02 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
工作表现自我评价
2014/02/08 职场文书
安全责任书范文
2014/03/12 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python