목차
对用户上传图片进行缩放 
백엔드 개발 PHP 튜토리얼 图片处理神器ImageMagick以及PHP的imagick扩展

图片处理神器ImageMagick以及PHP的imagick扩展

Jun 23, 2016 pm 01:52 PM
imagemagick imagick php 확장하다 인공물

为了提高页面的加载速度,以及减少流量,要针对网站的图片进行瘦身,研究了很多的解决方案,最后确定了使用ImageMagick,了解了这个软件之后,真是如获至宝,简直太好用,效果太明显了。

ImageMagick介绍:

ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据 web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。

ImageMagick 是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。

ImageMagick的命令概览

[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ]


convert:转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。 

identify:描述一个或较多图像文件的格式和特性。 

mogrify:按规定尺寸***一个图像,模糊,裁剪,抖动等。Mogrify改写最初的图像文件然后写到一个不同的图像文件。 

composite:根据一个图片或多个图片组合生成图片。 

montage:创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。 

compare:在算术上和视觉上评估不同的图片***其它的改造图片。 

display:如果你拥有一个X server的系统,它可以按次序的显示图片 

animate:利用X server显示动画图片 

import:在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。 

conjure:解释执行 MSL (Magick Scripting Language) 写的脚本。


安装:

sudo apt-get install imagemagick
로그인 후 복사
常见用例:

影响图片大小(占用空间)主要取决于图片的profile和quality。

  • quality:图片的品质,品质越高,占用的空间越大。适当降低品质能很大程度的减少图片的尺寸。一般来说,从品质100降到85,基本上肉眼很难区别其差别,但尺寸上减少很大。imagemagick通过通过-quality 来设置。
  • profile:记录图片一些描述信息。例如相机信息(光圈,相机型号)、photoshop元数据,颜色表等信息。它占用的空间可以从几KB到几百KB,甚至可能更大。ImageMagicK可以通过两种方式来去掉这些信息。+profile “*”  或 -strip

  • Exif信息是数码相机在拍摄过程中采集的一系列信息,这些信息放置在我们熟知的jpg文件的头部,也就是说Exif信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过Exif信息所记录的资讯更为详尽和完备。不过,具有Exif信息的JPEG图像文件要比普通的JPEG文件略大一点。还有就是像PS这种软件处理过的图片会有“program comments”。如果不是专业的摄影类网站,这些信息是没有用的,可以去掉:

    convert +profile “*” -strip src.jpg src-profile.jpg
    로그인 후 복사

    降低图片的quality品质来压缩图片:

    convert -quality 85 src.jpg src-quality85.jpg
    로그인 후 복사


    上面两个命令结合到一起使用:

    find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;
    로그인 후 복사


    经过这两个命令的处理,你的图片绝对可以缩小很多。 PS:根据我的经验,把png图片转换为jps图片会减小很多,然后再用以上两个命令处理一下,那就完美了。

    PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。 
    对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。

    convert -format jpg input.png  input.jpg  
    로그인 후 복사

    对用户上传图片进行缩放 

        对于用户自己上传的图片不能简单的 用css限制大小,因为这样每次加载图片时候还是会加载整幅大图。占用多余的宽带,并且影响页面加载速度。应该根据实际显示需要进行缩放。比如我想要用户相册里的图片大小不能超过500x300: 

    convert -resize "500x300>" input.jpg  output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。 
    로그인 후 복사

    下面说一下安装php的imgick扩展,来处理图片:

    安装:

    1.安装imgick扩展

    1) sudo apt-get install libmagick-dev2) sudo apt-get install php-pear php5-dev3) sudo pecl install imagick
    로그인 후 복사
    2.编辑php.ini文件,使其加载

    打开php.ini文件,在其中加入extension=imagick.so

    /etc/php5/apache2/php.ini
    로그인 후 복사
    重启apache服务使其失效

    /etc/init.d/apache2 restart
    로그인 후 복사

    附上一个简单的例子,用来转换图片格式的:

    $thumb = new Imagick();$thumb->readImage('test.gif');$thumb->writeImage('test.jpg');$thumb->clear();$thumb->destroy();
    로그인 후 복사

    用法太多了,我就不一一列举了,提供一下资料供大家学习:

    Imgick Class API:http://php.net/manual/en/class.imagick.php

    图片压缩心得:http://blog.lizhigang.net/archives/228

    ImageMagick官网:http://www.imagemagick.org/script/index.php

    http://elf8848.iteye.com/blog/382528

    使用实例:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed

    最后,附上我自己编写的PHP用Imgick处理图片的类:

    /* * 图片压缩类  重新封装了Imagick *  * @version 2014-07-30 * @author andy1219111@163.com */class Imgick_tool{		//Imagick对象实例	public $obj = null;		public function __construct()	{		//判断是否加载了该扩展		if(!extension_loaded('Imagick'))		{			return false;		}		$this->obj = new Imagick();	}	/*	 * png2jpg转换图片格式	 * 	 * @param string src_img 源图片路径	 * @param string dest_img 要生成的图片的路径	 * @return boolean 转换成共返回true  否则false	 */	public function png2jpg($src_img,$dest_img)	{		if(!is_object($this->obj))		{			return false;		}		try		{			$this->obj->readImage($src_img);			if($this->obj->writeImage($dest_img))			{				$this->destory();				return $dest_img;			}			return false;		}		catch (ImagickException $e)		{			return false;		}	}		/*	 * 去掉图片的profile信息	 * 	 * @param string src_img 源图片路径	 * @return string src_img 图片名称 否则返回false	 */	public function strip_profile($src_img,$dest_img = '')	{		if(!is_object($this->obj))		{			return false;		}		try		{			$dest_img = empty($dest_img) ? $src_img : $dest_img;			$this->obj->readImage($src_img);			$this->obj->stripImage ();			if($this->obj->writeImage ($dest_img))			{				$this->destory();				return $src_img;			}			return false;		}		catch (ImagickException $e)		{			return false;		}	}		/*	 * 设置jpg图片质量	 * 	 * @param string src_img 源图片路径	 * @param string dest_img 要生成的图片的路径	 * @return boolean 转换成共返回true  否则false	 */	public function set_quality($src_img,$quality = 70,$dest_img = '')	{		if(!is_object($this->obj))		{			return false;		}		try		{			$dest_img = empty($dest_img) ? $src_img : $dest_img;			$this->obj->readImage($src_img);			$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);			$this->obj->setImageCompressionQuality($quality);			if($this->obj->writeImage($dest_img))			{				$this->destory();				return $dest_img;			}			return false;		}		catch (ImagickException $e)		{			return false;		}	}		/*	 * 图片瘦身	 * 	 * @param string src_img 源图片路径	 * @param int quality 设置图片压缩质量	 * @param string dest_img 要生成的图片的路径	 * @return boolean 转换成共返回true  否则false	 */	public function slimming($src_img,$quality = 60,$dest_img = '',)	{		if(!is_object($this->obj))		{			return false;		}		try		{			$dest_img = empty($dest_img) ? $src_img : $dest_img;			$this->obj->readImage($src_img);			$this->obj->setImageFormat('jpeg');			$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);			//将图片的质量降低到原来的60%			$quality = $this->obj->getImageCompressionQuality() * $quality / 100;			$this->obj->setImageCompressionQuality($quality);			$this->obj->stripImage();			 			if($this->obj->writeImage($dest_img))			{				$this->destory();				return $dest_img;			}			return false;		}		catch (ImagickException $e)		{			return false;		}	}		/*	 * 生成缩略图	 * 	 * @param string src_img 源图片路径	 * @param int quality 设置图片压缩质量	 * @param string dest_img 要生成的图片的路径	 * @return boolean 转换成共返回true  否则false	 */	public function thump($src_img,$width = 250,$height = '')	{		if(!is_object($this->obj))		{			return false;		}		try		{						$file_info = pathinfo($src_img);			//生成缩略图名称			$file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.'));			$dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension'];			$this->obj->readImage($src_img);			//计算要获得缩略图的高度			$img_width = $this->obj->>getImageWidth();			$img_height = $this->obj->>getImageHeight();			$dest_height = $img_height * ($width / $img_width);			$this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false);			//生成图片			if($this->obj->writeImage($dest_img))			{				$this->destory();				return $dest_img;			}			return false;		}		catch (ImagickException $e)		{			return false;		}	}		/*	 * 释放资源	 * 	 */	function destory()	{		if(is_object($this->obj))		{			$this->obj->clear();			$this->obj->destroy();		}	}	}
    로그인 후 복사



    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

    PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

    CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

    cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

    CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

    CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

    CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

    파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

    CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

    컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

    CakePHP 로깅 CakePHP 로깅 Sep 10, 2024 pm 05:26 PM

    CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

    PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

    VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

    CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

    CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

    See all articles