1. project: blog
  2. target: use-imagick-to-composite-images-thumbnail.md
  3. date: 2016-02-19
  4. status: publish
  5. tags:
  6. - php
  7. - imagick
  8. - thumbnail
  9. categories:
  10. - php

这里说的imagickImageMagick 在PHP下的扩展。使用pecl安装起来那叫一个轻松简单 —— 一条命令就搞定:

  1. sudo pecl install imagick

(扩展装好后还是要在php.ini中加上extension=imagick.so,然后记得重启apachephp-fpm服务。)

最近有个需求是要把多张图片组合起来生成缩略图,刚好用用这个强大的imagick扩展。
这个需求是要这样生成缩略图:

  1. 如果有1张图片,就直接生成这张图片的缩略图;
  2. 如果有2张图片,则一张在左边一张在右边,各一半;
  3. 如果有3张图片,则两张左边平均分配,一张独占右边;
  4. 如果有4张图片,则像田字格一样平均分配空间;
  5. 更多张图片,则只取前4张,按田字格方式生成缩略图。

这规则还真不少,不过还不算太过复杂,很快搞出来了:

  1. namespace \clarence\thumbnail;
  2. class Thumbnail extends \Imagick
  3. {
  4. /**
  5. * @param array $images
  6. * @param int $width
  7. * @param int $height
  8. * @return static
  9. * @throws ThumbnailException
  10. */
  11. public static function createFromImages($images, $width, $height){
  12. if (empty($images)){
  13. throw new ThumbnailException("No images!");
  14. }
  15. $thumbnail = new static();
  16. $thumbnail->newImage($width, $height, 'white', 'jpg');
  17. $thumbnail->compositeImages($images);
  18. return $thumbnail;
  19. }
  20. public function compositeImages($images){
  21. $imagesKeys = array_keys($images);
  22. $compositeConfig = $this->calcCompositeImagesPosAndSize($images);
  23. foreach ($compositeConfig as $index => $cfg){
  24. $imgKey = $imagesKeys[$index];
  25. $img = new \Imagick($images[$imgKey]);
  26. $img = $this->makeCompositeThumbnail($img, $cfg);
  27. $this->compositeImage($img, self::COMPOSITE_OVER, $cfg['to']['x'], $cfg['to']['y']);
  28. }
  29. }
  30. protected function makeCompositeThumbnail(\Imagick $img, $cfg){
  31. $img->cropThumbnailImage($cfg['size']['width'], $cfg['size']['height']);
  32. return $img;
  33. }
  34. protected function calcCompositeImagesPosAndSize($images){
  35. $width = $this->getImageWidth();
  36. $height = $this->getImageHeight();
  37. switch(count($images)){
  38. case 0:
  39. throw new ThumbnailException("No images!");
  40. case 1:
  41. // | 0 |
  42. return [
  43. 0 => [
  44. 'to' => [ 'x' => 0, 'y' => 0 ],
  45. 'size' => [
  46. 'width' => $width,
  47. 'height' => $height,
  48. ]
  49. ]
  50. ];
  51. case 2:
  52. // | 0 | 1 |
  53. return [
  54. 0 => [
  55. 'to' => [ 'x' => 0, 'y' => 0 ],
  56. 'size' => [
  57. 'width' => $width / 2,
  58. 'height' => $height,
  59. ]
  60. ],
  61. 1 => [
  62. 'to' => [ 'x' => $width / 2, 'y' => 0],
  63. 'size' => [
  64. 'width' => $width / 2,
  65. 'height' => $height,
  66. ]
  67. ]
  68. ];
  69. case 3:
  70. // | 0 | 1 |
  71. // | 2 | |
  72. return [
  73. 0 => [
  74. 'to' => [ 'x' => 0, 'y' => 0 ],
  75. 'size' => [
  76. 'width' => $width / 2,
  77. 'height' => $height / 2,
  78. ]
  79. ],
  80. 1 => [
  81. 'to' => [ 'x' => $width / 2, 'y' => 0],
  82. 'size' => [
  83. 'width' => $width / 2,
  84. 'height' => $height,
  85. ]
  86. ],
  87. 2 => [
  88. 'to' => [ 'x' => 0, 'y' => $height / 2 ],
  89. 'size' => [
  90. 'width' => $width / 2,
  91. 'height' => $height / 2,
  92. ]
  93. ],
  94. ];
  95. default:
  96. // >= 4:
  97. // | 0 | 1 |
  98. // | 2 | 3 |
  99. return [
  100. 0 => [
  101. 'to' => [ 'x' => 0, 'y' => 0 ],
  102. 'size' => [
  103. 'width' => $width / 2,
  104. 'height' => $height / 2,
  105. ]
  106. ],
  107. 1 => [
  108. 'to' => [ 'x' => $width / 2, 'y' => 0],
  109. 'size' => [
  110. 'width' => $width / 2,
  111. 'height' => $height / 2,
  112. ]
  113. ],
  114. 2 => [
  115. 'to' => [ 'x' => 0, 'y' => $height / 2 ],
  116. 'size' => [
  117. 'width' => $width / 2,
  118. 'height' => $height / 2,
  119. ]
  120. ],
  121. 3 => [
  122. 'to' => [ 'x' => $width / 2, 'y' => $height / 2],
  123. 'size' => [
  124. 'width' => $width / 2,
  125. 'height' => $height / 2,
  126. ]
  127. ],
  128. ];
  129. }
  130. }
  131. }

用个试试:

  1. $thumbnail = \clarence\thumbnail\Thumbnail::createFromImages($srcImages, 240, 320);
  2. $thumbnail->writeImage($outputDir."/example.jpg");

效果立马出来了:

赞一个~

(详细代码见 http://github.com/clarence-pan/thumbnail)

PHP下使用强大的imagick轻松生成组合缩略图的更多相关文章

  1. windows7下安装php的imagick和imagemagick扩展教程

    这篇文章主要介绍了windows7下安装php的imagick和imagemagick扩展教程,同样也适应XP操作系统,Win8下就没测试过了,需要的朋友可以参考下 最近的PHP项目中,需要用到切图和 ...

  2. linux下安装php的imagick扩展模块(附php升级脚本)

    imagick是一个PHP的扩展,是一套软件系列,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的A ...

  3. 善用GIMP(Linux下的Photoshop),图像处理轻松又自由

    善用GIMP(Linux下的Photoshop),图像处理轻松又自由 作者: 善用佳软 日期: 2013-02-16 分类: 2 图像影音 标签: GIMP, image 1. GIMP是什么? GI ...

  4. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成

    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...

  5. PHP一般情况下生成的缩略图都比较不理想

    PHP用GD库生成高质量的缩略图片,PHP一般情况下生成的缩略图都比较不理想.今天试用PHP,GD库来生成缩略图.虽然并不100%完美.可是也应该可以满足缩略图的要求了.<?php $FILEN ...

  6. 9.1.2 asp.net core 自动生成组合查询

    在做系统的时候,经常遇到前台录入一大堆的查询条件,然后点击查询提交后台,在Controller里面生成对应的查询SQL或者表达式,数据库执行再将结果返回客户端. 例如如下页面,输入三个条件,日志类型. ...

  7. ASP.NET根据URL生成网页缩略图示例程序(C#语言)

    工作中可能马上要用到根据URL生成网页缩略图功能,提前做好准备. 在网上找了份源码,但是有错误:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a ...

  8. 利用FFmpeg生成视频缩略图 2.3.1

    1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...

  9. 利用FFmpeg生成视频缩略图 2.1.8

    1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...

随机推荐

  1. [ubuntu]用ubuntu开发的日子----win7 ubuntu双系统

    小子终于忍不了win7某些蛋疼的设定,看群里好多大牛推荐mac,但资金紧张,只好推而求其次使用ubuntu,但是由于公司工作环境是windows,所以还必须保留windows系统,一次决定双系统. 下 ...

  2. python——创建django项目全攻略(野生程序员到家养程序员的完美进化)

    新建工程 我用pycharm写代码,所以一般就用pycharm创建django工程.右上角File-New Project.选择路径,修改项目名称,确定.就可以创建一个新的django工程.     ...

  3. HTTP历程

    原文http://www.ruanyifeng.com/blog/2016/08/http.html 1.HTTP/0.9 HTTP是基于TCP/IP协议的应用层协议.它不涉及数据包传输,主要规定了客 ...

  4. Yii读取TXT文件数据插入到数据库

    个人平时会用到的方法,记录一下并分享给需要的朋友,Yii批量添加还需要clone一下model才可以,不然只会插入一条数据. 也可以把文件通过参数的方式调入到方法中. // 读取CVS文件 funct ...

  5. sicily 1934. 移动小球

    Description 你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2).其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y ...

  6. 制作简单的2D物理引擎(零)

    最近发现了Github上的开源物理引擎项目Matter.js,对它很感兴趣,发现源码并不算长,算上注释大约1万行左右,值得剖析一番.Matter.js实现一个最小化的2D物理引擎,性能不错,故打算用C ...

  7. PHP xml 转换为 array

    retrun json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), tru ...

  8. javascript在IE/FF/Chrome的一些兼容问题

    1.获取滚动条高度 var top=document.body.scrollTop||document.documentElement.scrollTop; 2.事件监听 var addEvent = ...

  9. 如何更方便地调试javascript代码

    开发者工具 现在一般的浏览器都内置了开发者工具,快捷键F12可以打开,如Chrome浏览器下,Sources面板下找到对应的js文件 这是首选方法,但是对于SPA程序(比如easyui),可能找不到内 ...

  10. 大话设计模式之<一>计算器的深思

    一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听 ...