ImageMagick+ PHP IMagick 图片压缩处理_水木米的博客-程序员秘密

技术标签: PHP  

当服务器遭遇高并发和大访问量时,对站点资源比如图片瘦身的需求会有所迫切。search了一下解决方案,希望可以抛砖。此blog在Amazon EC2 Instance部署测试成文。

一、简介
二、安装
三、使用
四、压缩
五、资源

======一、ImageMagick、IMagick简介======
ImageMagick是用C语言开发图片处理程序。可以对图片进行改变大小、旋转、锐化、减色或增加特效等操作。对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。
ImageMagick 的官网是:http://www.ImageMagick.org/script/index.php
ImageMagick为php语言提供的两个扩展IMagick和MagickWand for PHP的安装。IMagick已经被php最新的版本选为内部的扩展函数库,php的手册已经有了函数说明使用文档。这个扩展是可选安装的。
ImageMagick有两款接口,分别是MagickCore API和MagickWand API。MagickCore API是全面的底层的接口,而MagickWand API 是官方推荐的精选的重要的一些接口。IMagick和MagickWand for PHP就是分别为这两款接口而准备的。
IMagick:
一个可以供PHP调用ImageMagick功能的PHP扩展。使用这个扩展可以使PHP具备和ImageMagick相同的功能。

======二、安装======
》 安装make
   $ yum install make
》 安装gcc
   $ yum install gcc

1、安装ImageMagick
   $ cd /opt/
   $ tar zvxf ImageMagick-6.7.5-6.tar.gz
   $ cd ImageMagick-6.7.5-6
   $ ./configure 
   $ make
   $ make install
   
2、命令行缩放一张图片
   $ /usr/local/bin ./convert -resize 200x200 -colors 100 src.jpg tar.jpg
   PS:报错了。错误信息:no decode delegate for this image format.

   查看convert支持处理的格式
   $ convert -list format

   PS:
     》服务器如果没有安装Jpeg v6b、libPng、FreeType要在安装imagemagick之前先装好,否则imagemagick没法读取jpeg和png图片,字体文件也读不了。而安装libpng需要zlib的支持。所以先由安装zlib为开始。(抱歉,只能重新执行4-5-6-1了。)
     》libpng 使用 zlib 程序库作为压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎

3、安装IMagick
   $ tar zvxf imagick-3.0.1.tgz
   $ cd imagick-3.0.1
   $ phpize
   $ ./configure 
   $ make
   $ make install

   PS: make的时候报错咯...下了最新包的同学,请降低imagick安装版本。如:IMagick-2.3.0.tgz。

   错误信息
   imagick-3.0.1/imagick_class.c:9673: error: expected ';' before 'severity'
   imagick-3.0.1/imagick_class.c:9673: error: 'php_imagick_object' has no member named 'magick_wand'
   imagick-3.0.1/imagick_class.c:9673: error: 'severity' undeclared (first use in this function)
   imagick-3.0.1/imagick_class.c:9673: warning: assignment makes pointer from integer without a cast
   imagick-3.0.1/imagick_class.c:9673: warning: cast to pointer from integer of different size
   imagick-3.0.1/imagick_class.c:9673: warning: cast to pointer from integer of different size
   imagick-3.0.1/imagick_class.c:9673: error: 'php_imagick_object' has no member named 'magick_wand'
   make: *** [imagick_class.lo] Error 1

4、安装zlib
   $ tar -xzvf zlib-1.2.5.tar.gz 
   $ cd zlib-1.2.5
   $ ./configure
   $ make
   $ make install

5、编译安装libpng
   $ tar -xzvf libpng-1.2.12.tar.gz
   $ cd libpng-1.2.12
   $ cp scripts/makefile.std makefile
   $ make
   $ make install

6、编译安装 jpeg-6b
   $ ./configure --enable-shared --enable-static 
   $ make
   $ make install
   。。。
   Ps:又出错了!!!cannot create regular file `/usr/local/man/man1/cjpeg.1': No such file or directory,按照提示做吧!
7、别忘记在php.ini把扩展配置上去
  ImageMagick+ PHP IMagick 图片压缩处理 - VIEWSOFT - Rainbow Tech Blog

======三、ImageMagick使用======
这里只是介绍图片压缩这一点领域,其余的图片处理请research其它资源。
》 压缩jpg图像体积
  $ cd /usr/local/ImageMagick/bin/
  $ ./convert -quality 20 /tmp/test/jpg_src.jpg /tmp/test/jpg20.jpg
  压缩前:(约230k)
  压所后:(约70k)
  在图片质量尚可的情况下,体积减小了将近3/4!这对于大访问量和高并发情况下图片加载速度以及服务器流量的意义非常重大。
  
》 压缩png图片体积
  $ ./convert -map netscape: +profile "*" /tmp/test/png_src.png /tmp/test/c_png_src.png
  压缩前:(约89k)
  压所后:(约47k)
  在图片质量尚可的情况下,体积减小了将近1/2!但是对png图片透明背景的处理不尽如人意。

======三、php_IMagick使用======
》压缩jpg图片
  /******************code******************/
    $imgObject = new Imagick("src.jpg");
    // 去除图片信息
    $imgObject->stripImage();
    // 设置压缩比率
    $imgObject->setImageCompressionQuality($q);
    $imgObject->writeImage("compress.png");
    $imgObject->destroy();
  /******************code******************/

》压缩png图片
  /******************code******************/
    $imgObject = new Imagick("src.png");
    // 去除图片信息
    $imgObject->stripImage();
    $flag = $imgObject->getImageAlphaChannel();
    // 如果png背景非透明,则进行压缩
    if(imagick::ALPHACHANNEL_UNDEFINED == $flag||imagick::ALPHACHANNEL_DEACTIVATE == $flag) {
     $imgObject->setImageType(imagick::IMGTYPE_PALETTE);
     $imgObject->writeImage("compress.png);      
    }
    $imgObject->destroy();
  /******************code******************/

======五、资源-帮助文档======
》ImageMagick官网
  http://www.ImageMagick.org/script/index.php
》英文文档:
  http://www.php.net/manual/en/class.IMagick.php
》中文文档:
  http://cn.php.net/manual/zh/class.IMagick.php

=======五、资源-lib src======
》ImageMagick(ImageMagick-6.7.5-6.tar.gz) download
  ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.7.5-6.tar.gz
  可以在 ftp://ftp.kddlabs.co.jp/graphics/ImageMagick找到合适的版本。
》IMagick lib download
  http://pecl.php.net/get/IMagick-2.3.0.tgz
》jpeg lib download
  http://www.ijg.org/files/jpegsrc.v6b.tar.gz
》png lib
  http://sourceforge.net/projects/libpng/files/libpng12/1.2.47/libpng-1.2.47.tar.gz/download
》zlib download
  http://sourceforge.net/projects/libpng/files/zlib/1.2.3/zlib-1.2.3.tar.gz/download
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dong_007_007/article/details/8167825

智能推荐

2018美团题3_weixin_33744854的博客-程序员秘密

定义lowbit(x) =x&(-x),即2^(p-1) (其中p为x的二进制表示中,从右向左数第一个1的位置),例如lowbit(10)=2,lowbit(3)=1。定义函数f(l, r)为(其中0 <= l, r <= n):输入n,求f(l, r)的最大值。输入描述:n以二进制形式给出,一行一个二进制01串n,表示l,r的上界。1 <= 字符串n...

深度学习错误汇总:Tensorboard运行错误 No module named 'html5lib.sanitizer'_柚有所思的博客-程序员秘密

1. 错误描述在调用tensorboard时,出现如下错误:# 执行tensorboard命令tensorboard --logdir=.logs/# 出现错误................ImportError: No module named html5lib.sanitizer2. 问题解决这是由于html5lib库版本问题导致,只需要在Pycharm设置...

Android项目集成Lottie动画组件教程_android lottie集成_swsbty的博客-程序员秘密

步骤教程给AE添加Bodymovin插件Github下载Bodymovin使用ZXP Installer安装Bodymovin插件使用Bodymovin导出AE动画Android项目引入LottieAndroid项目使用Lottie给AE添加Bodymovin插件AE是Adobe After Effects,一款动画设计软件。Bodymovin是AE的一款插件,可以将AE的动画导出为json文件。Github下载Bodymovin下载地址:https://github.com/bigxixi/bo

Spark配置redis的jar包_spark-redis jar包下载_Bonyin的博客-程序员秘密

在Maven 工程下面,spark-redis的jar包在maven的仓库里面没有,所以需要我们自己去下载第三方的jar包,来添加到自己的maven工程里面去。1、下载spark-redis.jar 的链接:https://spark-packages.org/package/RedisLabs/spark-redis2、在pom文件里面首先配置spark-redis.接下在在命令行执行:mvn ...

python自动写作ai_ai自动写作python python编程100例_缪建明的博客-程序员秘密

人工智能和python是什么关系?人工智能是一个大概念。人工智能项目的具体实施将联系机器学习和深度学习框架。这些框架大多是基于python开发的。因此,为了深入开发人工智能项目,学习python语言也是必要的代码一定要人去写吗,能不能用Python弄个人工智能来写C ?请为我写一个软件。电脑:我能写一百万种软件。你想要哪一个?人:我想写一个聊天工具。电脑:我已经找回了现成的软件微信,可以吗?人民...

一文掌握Flutter for Windows桌面端稳定版新特性_CrazyCodeBoy的博客-程序员秘密

自从Flutter 创建以来,Flutter就致力于打造一个能够构建精美的、可高度定制的、并且可以编译为机器码的跨平台应用解决方案,以充分发挥设备底层硬件的全部图形渲染能力。今天,Flutter 对 Windows 生产版本的正式支持是对这一愿景实现的重要标志。它使 Windows 开发者也能享受到移动开发的相同生产力和功能。

随便推点

CocoaAsyncSocket使用详解_Leon_Yin的博客-程序员秘密

CocoaAsyncSocket网络通信使用之tcp连接(一)简述:在互联网世界中,网络访问是必不可少的一部分,而对于程序员来说,网络编程却是一个比较复杂的存在,特别是socket处理方面。在android平台中,java类库丰富,封装良好,比如:mina,netty等等。而在ios平台中,也有出名的socket库,CocoaAsyncSocket。

【Java编程】创建人类Person_创建一个person类_MC徐三岁的博客-程序员秘密

目录题目内容:创建人类Person,要求如下:包含2个成员变量:name,age构造方法1:带2个参数,分别为name和age赋值构造方法2:带1个参数。只为name赋值方法:void speak()输出:大家好,我叫XXX,今年XX岁。```javapublic class Person { private String name; public int age; public Person(String name) {// 构造一个参数的方法 this.name

HDU1003-Max Sum_algzjh的博客-程序员秘密

Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 244466 Accepted Submission(s): 57714Problem Description Given a sequence a[1],a[2],a

编程之美2.3 寻找发帖“水王”_wxwxy919的博客-程序员秘密

//题目1:找到数组中出现次数超过一半的元素//解法:使用另外不到1/2的元素与所求元素进行抵消//整个数组抵消不同的两个数,则超过1/2的元素还是原来的元素public class Main { public static void main(String[] args) throws Exception { System.out.println(find

Intel处理器对虚拟化技术的支持情况_iteye_18932的博客-程序员秘密

以下双核系列部分支持All Intel Core2 Duo processors feature:Intel dual-core technologyEnhanced Intel SpeedStep TechnologyIntel 64 architecture±Execute Disable Bit°<!--[/generic-body]-...

程序员内卷,应届生如何自救?_逛逛GitHub的博客-程序员秘密

大家都知道,我硕士毕业后就去了腾讯,发现大家对优质的 GitHub 项目有需求,但是不知道怎么找,于是开了这个公众号。最近发现公司里,计算机相关专业的硕士越来越多。在领英搜索“高级软件工程...

推荐文章

热门文章

相关标签