热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php图片处理案例,使用GD、ImageGick与PHP框架的图片处理技术

社区导读:本文介绍的是缩略图的处理。图片剪切是网站中常见的处理。用户上传图片后,需要根据不同的设备,产品UI显示不同尺寸的缩略图。概述各位

0818b9ca8b590ca3270a3433284dd417.png

社区导读:本文介绍的是缩略图的处理。图片剪切是网站中常见的处理。用户上传图片后,需要根据不同的设备,产品UI显示不同尺寸的缩略图。

概述

各位好,缩略图是什么?缩略图就是大图缩小的图(废话),也不是那万恶的马塞克。用了它可以使你的网站应用达到以下目标:

1、下载速度更快,响应速度高。

2、节省用户流量。Web网站为了清晰度可以使用稍大的图片,APP中大图实际上是吃掉用户流量和电池的老虎

3、对于一些开发的不够好的APP,图片占用内存过大,容易crash。等等好处。

那么,缩略图使用在哪些场景?如下:

1、图片正好适合固定高度和宽度的容器中,不要留下空白(允许为兼容增大尺寸)

2、以合适的分辨率显示(不用CSS或HTML限制长宽高,或者放大图像)

3、图像不变形、失真,并保持图片显示之比例。

缩放&裁剪图片的工具&技术

在LNMP环境下,可以使用GD2来处理图片。GD2是内置在PHP中内置的库,不需要另行安装,在php.ini中打开其配置即可。

另外,PHP也可以使用imagegick这样一个外部工具来处理图像。imagegick是个功能强大的图像处理工具,利用它,我们甚至可以开发出Web下的photoshop。

本文介绍在Codeigniter框架中,它提供了较完整的图像处理库。

图片缩略配置

下面介绍的是一个完整上传场景,它会把一张图片,生成一个缩略图,宽高为50*50。在本例中使用gd2库处理。请看如下代码:

$config['image_library']= 'gd2';

$config['source_image']= './uploads/'.$imgName.".jpg";

$config['new_image']= './uploads/'.$imgName."_new.jpeg?s=#34;;

$config['create_thumb']= TRUE;

$config['maintain_ratio']= TRUE;

$config['width'] =50;

$config['height'] =50;

接下来需要引用image_libs库。代码如下:

$this->load->library('image_lib',$config);

接下来调用resize方法来缩放图片。如下:

// resize image

$this->image_lib->resize();

// handle if thereis any problem

if ( !$this->image_lib->resize()){

echo$this->image_lib->display_errors();

}

resize()方法会按我们指定的文件夹的图片进行缩放。可以使用$this->image_lib->display_errors()来跟踪错误,发现问题后再进行处理。如下代码:

function image_resize($img_name) {

$img_path =  realpath("img")."\\images\\uploaded\\".$img_name.".jpeg?s=#34;;

// 配置

$config['image_library'] = 'gd2';

$config['source_image'] ='./img/images/uploaded/'.$img_name.".jpeg?s=#34;;

$config['new_image'] ='./img/images/uploaded/'.$img_name."_new.jpeg?s=#34;;

$config['create_thumb'] = TRUE;

$config['maintain_ratio'] = TRUE;

$config['quality'] = "100%";  //图片精度

$config['width'] = 50;      //图片宽度

$config['height'] = 50;     //图片高度

$this->load->library('image_lib',$config);

// 图片缩放

$this->image_lib->resize();

// 处理错误信息

if ( !$this->image_lib->resize()){

echo$this->image_lib->display_errors();

}

}

图片处理实例

接下我们使用Codeigniter处理上传和生成缩略图片。如下完整方法:

function do_upload() {

$upload_config = array(

'upload_path'   => realpath('assets/'), //图片路径

'allowed_types' =>'gif|jpg|png',   //图片格式

'max_size'      => '30000',   //图片尺寸

);

$this->upload->initialize($upload_config );

//处理上传的文件数组

foreach($_FILES['userfile'] as$key=>$val) {

$i = 1;

foreach($val as $v)  {

$field_name ="file_".$i;

$_FILES[$field_name][$key] =$v;

$i++;

}

}

unset($_FILES['userfile']);

//两个数组,分别保存错误和上传成功的信息

$error = array();

$success = array();

// 处理上传

foreach($_FILES as $field_name =>$file){

if ( !$this->upload->do_upload($field_name)) {

//如果上传失败

$error['upload'][] =$this->upload->display_errors();

}else{

//取得上传成功的数据,可此数组放在数据库内

$upload_data =$this->upload->data();

// 图片缩放配置

$resize_config = array(

// 图片源路径,如 "/var/uploads /image.jpeg?s=#34;

'source_image'  => $upload_data['full_path'],

// 缩略图路径 "/var/uploads/thumb/"+ "thumb_" + "image.jpg

// 也可以使用'create_thumbs' => true 选项

'new_image'     =>$upload_data['file_path'].'thumb_'.$upload_data['file_name'],

'width'         => 200,

'height'        => 200

);

$this->image_lib->initialize($resize_config);

if ( ! $this->image_lib->resize()){

// 处理错误

$error['resize'][] =$this->image_lib->display_errors();

} else {

//把上传后的数据放在数组中

$success[] = $upload_data;

}

}

}

//检查错误

if(count($error > 0)) {

$data['error'] = $error;

} else{

$data['success'] = $upload_data;

}

$this->load->view('upload',$data);

}

}

以上我们使用GD2处理和缩放图片,以及生成缩略图。以下使用imageGick来处理图片。

使用ImageGick

使用ImageGick,也可不使用任何框架。我们可以使用如下原生PHP代码,如下:

$thumbnail= new Imagick($pix);

$wid = 128;

$thumbnail->thumbnailImage( $wid, 0 );

$thumbnail->enhanceImage();

$thumbnail->sharpenimage(1,1,Imagick::CHANNEL_ALL); //$radius,$sigma, $channel);

//锐化图片,$radius为锐化角度,半径,越小越薄$sigma 为锐化标准差,越大墨越深 $channel 模糊处理,使用的图片频道

$thumb_url = $thumbnail->writeImage('thumbs/'.$thb ); //图片保存之路径

...

?>

在CodeIgniter中使用imagegick,请看如下之代码片断:

$this->load->library('image_lib');

$config['image_library']= 'ImageMagick';

$config['library_path']    = $path;

代码以下省略,与gd2的配置基本相同,各位可参考上下文。imageGick功能强大,感兴趣的同学可以再继续了解,后续我们也会持续介绍 。

小结

框架的好处是能够很方便,很容易的解决问题。本文主要介绍了CodeIgniter,如果使用Laravel或YII、ThinkPHP等框架等亦同样道理。

本文应社区同学特约刊登,欢迎后台发送建议,特别欢迎各位技术专家投稿和联系21CTO社区。

做对人,做对事,找对人,做好事,每天都是圣诞节。祝社区各位小伙伴节日快乐!~



推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • PHP WEB项目文件夹上传下载解决方案
    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploadsonoff是否允许通过http方式上传文件2.max_execution_time3 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • http:oj.leetcode.comproblemsminimum-depth-of-binary-tree贡献了一次runtimeerror,因为如果输入为{}即空的时候,出 ... [详细]
author-avatar
为佐殿回来而读书的天使
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有