ImageMagicK给图片瘦身

最近对图片的处理兴趣越来越浓,php扩展中也有GD 、imagemagick、gmagick图片处理方法,偶也曾经通过gmagick-php扩展封装Gmagick类来处理图片,处理图片性能的高低暂不作讨论,但是使用过程中都不是很尽兴,以至于后来养成了一个思维习惯:’php能不用对应php图片处理扩展,就不用扩展,最好使用exec,system等函数调用imagemagick或gmagick应用程序命令处理图片’.下面是在centos服务器上使用imagemagick处理图片的方法总结

  1. ImageMagicK给图片瘦身

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

          #测试用图:原图source.jpg
           ls -lh source.jpg
          # 629KB source.jpg
          ----------------------------------------------
          #原图去掉图片描述信息,生成图片一
           convert +profile "*" -strip source.jpg src-profile.jpg
           ls -lh src-profile.jpg
          # 539KB  src-profile.jpg
          ----------------------------------------------
          #原图品质降到85,生成图片二
           convert -quality 85 source.jpg src-quality85.jpg
           ls -lh src-quality85.jpg
          # 202KB  src-quality85.jpg
          ----------------------------------------------
          #对原图去掉描述信息并降低品质到85,生成图片三
           convert -quality 85 -strip source.jpg src-p-q85.jpg
           ls -lh src-p-q85.jpg
          # 153KB  src-p-q85.jpg
          ----------------------------------------------
          #对比测试src-p-q85.jpg
          #对去掉描述信息的图片一品质降低到85查看大小,生成图片四
           convert -quality 85 src-profile.jpg src-p-quality85.jpg
           ls -lh src-p-quality85.jpg
          # 153KB  src-p-quality85.jpg
          
    2. 上述图片中第一张原始图片为629KB,
      图片一去掉原图图片描述信息,图片大小变成了539KB,减少15%
      图片二设置图片品质为85,图片大小变成了202KB ,减少68%
      图片三同时使用去掉profile和设置品质为85,图片大小变成了153KB,减少76%
    3. 注意:
      经过一个简单的命令处理,就可以把原始图片体积减小到原来的的三分之一.
      一般来说jpg格式的图片有比较大的操作空间,而png、gif有时候处理了反而变大.所以具体问题需要具体分析.

      
      
  2. ImageMagick之图片裁剪

    1. imagemagick的convert命令通过crop参数,可以把一幅大图片分成若干块大小一样的图片,同时也可以在大图上截取一块图片来.命令格式为

          convert 原始图片 -crop widthxheight+x+y 目标图片
          

      其中widthxheight是目标图片的尺寸,图片新坐标原点是通过图片旧的坐标原点+x+y迁移后的坐标位置,这两组值至少要出现一组,也可以同时存在.
      另外该命令也可使用gravity来重新定义坐标系统,但是需要注意的是gravity重新定义后的坐标原点相当于原始图片坐标原点,图片如果存在+x+y属性的话,图片新的坐标原点会通过gravity重新定义后的坐标原点+x+y迁移确立新的坐标位置
      关于更多gravity的信息,请参考:下文ImageMagicK之gravity参数详解.下面介绍几种常用的命令

    2. 把原始图片分割成多张小图

          convert src.jpg -crop 100x100 dest.jpg
          #假设src.jpg的大小是300x200,执行命令后将得到名为dest-0.jpg、dest-1.jpg...dest-5.jpg
          的6张大小为100x100的小图片.注意如果尺寸不是目标图片的整数倍,那么右边缘和下边缘的一部分图片就用实际尺寸
          
    3. 在原始图片上剪裁一张指定尺寸的小图

          convert src.jpg -crop 100x80+50+30 dest.jpg
          #在原始图片的上距离上部30像素左部50为起点的位置,分别向左向下截取一块大小为100x80的图片.如果x相对于坐标,宽度不够100,那就取实际值.
          -------------------------------------
          convert src.jpg -gravity center -crop 100x80+0+0 dest.jpg
          #在原始图上截取中心部分一块100x80的图片
          -------------------------------------
          convert src.jpg -gravity southeast -crop 100x80+10+5 dest.jpg
          #在原始图上截取右下角距离下边缘10个像素,右边缘5个像素一块100x80的图片
          
  3. ImageMagicK之gravity参数详解

    1. 使用gravity重新定义坐标后,可以很容易让子元素与父元素的对齐方式达到想要的效果,让一切变得非常简单.比如把一张小图片叠加到背景图片的正中位置,按照默认的坐标系统,那必须要先知道背景图片和小图片的宽度以及高度,然后才能计算出起始点的坐标,再通过-geometry来设置坐标点.如果使用gravity,把其设置center,即把中心作为坐标的原点,那么根本不需要计算起始坐标点,ImageMagicK会自动把小图片放置在背景的正中央位置,-geometry默认是+0+0.gravity不仅影响父元素的坐标系统,而且子元素的重心点(或者叫参照点)也随之改变.举例来说,当gravity值为southeast,父元素的坐标原点变为右下角了,x轴方向是从右到左,y轴方向从下到上;子元素重心点也是右下角,所以geometry设置的坐标点就是子元素的右下角相对父元素右下角的位置.gravity会影响通过geometry、annotate、region等来定义坐标点.
      gravity可用值有九个,分别是:Center,East,West,South,North,NorthEast,NorthWest,SouthEast,SouthWest
    2. 由于下面的例子中图片显示增加了’-draw 文本’显示,为了防止出现’-font 字体’缺失的情况,自定义字体目录:

          #复制window上的C:\Windows\Fonts下的仿宋字体到centos的/usr/share/fonts/下
           cd /usr/share/fonts/;ll;
           #-rwxr-xr-x. 1 root root 10576012 Dec 31 10:48 simfang.ttf
           chmod 755 *.ttf
          
    3. 注意:下图涉及到’-gravity’和’-geometry’同时存在的情况我们按照三步理解:
      1.通过’-gravity *’ 确定父元素坐标原点
      2.通过’-geometry *’确定相对于父元素坐标原点偏移后的位置即子元素坐标点
      3.通过上个’-gravity *’ 确定子元素坐标原点相对整个子元素的位置点,从而拼出整个图形
    4.     #Center:正中间位置为坐标原点,x轴从左到右,y轴从上到下.
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity Center -geometry +50+25 -composite -size 100x50 xc:yellow -gravity Center -geometry -50-25 -composite -fill red -pointsize 24 -gravity Center -font /usr/share/fonts/simfang.ttf -draw "text 0,0 '你好 chenai'" Center.png
          

      说明:创建一个灰色的400×120的背景,分别把两个100×50的小图片放置在背景上的(50,25)和(50,25)的位置,同时通过draw在图片输入一段文本,小图片和文字的参照点是正中间的位置,效果如下图.

    5.     #East:右边缘的中间位置为坐标原点,x轴从右到左,y轴从上到下.
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity East -geometry +10+25 -composite -size 100x50 xc:yellow -gravity East -geometry +110-25 -composite -fill red -pointsize 24 -gravity East -font /usr/share/fonts/simfang.ttf -draw "text 10,0 '你好 chenai'" East.png
          

      说明:小图片和文字的参照点是右边缘中间的位置,效果如下图

    6.     #West:左边缘中间位置为坐标原点,x轴从左到右,y轴从上到下
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity West -geometry +10+10 -composite -size 100x50 xc:yellow -gravity West -geometry +110-40 -composite -fill red -pointsize 24 -gravity West -font /usr/share/fonts/simfang.ttf  -draw "text 0,0 '你好 chenai'" West.png
          

      说明:小图片和文字的参照点是左边缘的中间位置,效果如下图.

    7.     #South:下边缘的中间为坐标原点,x轴从左到右,y轴从下到上.
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity South -geometry +10+10 -composite -size 100x50 xc:yellow -gravity South -geometry +110+60 -composite -fill red -pointsize 24 -gravity South -font /usr/share/fonts/simfang.ttf -draw "text 0,0 '你好 chenai'" South.png
          

      说明:小图片和文字的参照点是下边缘的中间,效果如下图.

    8.     #North:上部中间位置为坐标原点,x轴从左到右,y轴从上到下
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity north -geometry +10+10 -composite -size 100x50 xc:yellow -gravity north -geometry +110+60 -composite -fill red -pointsize 24 -gravity north -font /usr/share/fonts/simfang.ttf  -draw "text 0,60 '你好 chenai'" North.png
          

      说明:小图片和文字的参照点是上部中间位置,效果如下图

    9.     #NorthEast:右上角位置为坐标原点,x轴从右到左,y轴从上到下
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity NorthEast -geometry +10+10 -composite -size 100x50 xc:yellow -gravity NorthEast -geometry +110+60 -composite -fill red -pointsize 24 -gravity NorthEast -font /usr/share/fonts/simfang.ttf -draw "text 10,60 '你好 chenai'" NorthEast.png
          

      说明:小图片和文字的参照点是右上角位置,效果如下图

    10.     #NorthWest:左上角为坐标原点,x轴从左到右,y轴从上到下,也是默认值.
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity northwest -geometry +10+10 -composite -size 100x50 xc:yellow -gravity northwest -geometry +110+60 -composite -gravity northwest -fill red -pointsize 24 -font /usr/share/fonts/simfang.ttf -draw "text 110,60 '你好 chenai'" NorthWest.png
          

      小图片和文本的参照点是左上角,效果如下图

    11.     #SouthEast:右下角坐标原点,x轴从右到左,y轴从下到上
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity SouthEast -geometry +10+10 -composite -size 100x50 xc:yellow -gravity SouthEast -geometry +110+60 -composite -fill red -pointsize 24 -gravity SouthEast -font /usr/share/fonts/simfang.ttf -draw "text 0,0 '你好 chenai'" SouthEast.png
          

      说明:小图片和文字的参照点右下角,效果如下图

    12.     #SouthWest:左下角为坐标原点,x轴从左到右,y轴从下到上.
          convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity SouthWest -geometry +10+10 -composite -size 100x50 xc:yellow -gravity SouthWest -geometry +110+60 -composite -fill red -pointsize 24 -gravity SouthWest -font /usr/share/fonts/simfang.ttf -draw "text 10,10 '你好 chenai'" SouthWest.png
          

      说明:小图片和文字的参照点是左下角的位置,效果如下图

    13. http://www.netingcn.com/imagemagick-gravity.html

相关文章
  1. gearman应用-分布式图库系统设计
  2. 获取图片坐标点范围内的颜色值
  3. php_imagick
本站版权
1、本站所有主题由该文章作者发表,该文章作者与尘埃享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和尘埃的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:
二维码
Posted in image, ImageMagick, linux技术, php, 编程语言
Comments are closed.