PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)

简介:

1、调用TinyPng网站提供的API

1.1、须知

(1)tinypng的官网:https://tinypng.com/

  不知道国内访问会不会很慢,在Singapore打开这个网站很流畅;

(2)API key申请地址:https://tinypng.com/developers

  调用这个网站提供的API需要申请一个API key,输入邮箱,它会把包含API key的网址发到你邮箱,打开其中的链接就可以看到属于你的API key了;

(3)调用这个网站的API进行图片压缩的话,每个月前500张是免费的,之后要收费;

(4)虽然域名是tinypng,但是既可以压缩jpg图片,也可以压缩png图片;

1.2、举个栗子,代码来啦~

 (1) class TinyImg 是我自己写的一个类,包含下面三个方法:

  《1》压缩文件夹下全部图片

     public function compressImgsFolder($key,$inputFolder,$outputFolder) 是用来压缩文件夹 $inputFolder(目录路径)中的图片,保存到文件夹 $outputFolder (目录路径)中,其中 $key 就是上边申请的API key;

  《2》压缩单张图片

     public function compressImg($key$input$output) 将输入的图片 $input (图片路径)进行压缩并保存到图片 $output (图片路径);

    这个函数中的代码是从官网调用示例中提取出来的,初始的时候,line40是被注释掉的,直接使用会出错,我们需要

    <1> 去掉注释;

    <2> 到http://curl.haxx.se/ca/cacert.pem把这个网页(文本)保存(Ctrl+S)到class TinyImg 类文件的同一目录下;

  《3》获取文件夹下全部图片的名字

     public function getFiles($filedir) 获取$filedir下的全部图片的名字列表;

复制代码
 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: Zhang He
 5  * Date: 2015/6/8
 6  * Time: 10:14
 7  */
 8 
 9 class TinyImg {
10     /*Compress all images in folder $inputFolder and save final images in folder $outputFolder*/
11     public function compressImgsFolder($key,$inputFolder,$outputFolder){
12         $images = $this->getFiles($inputFolder);
13         if(empty($images)){
14            return false;
15         }
16         foreach($images as $image){
17             $input = $inputFolder."\\".$image;
18             $output = $outputFolder."\\".$image;
19             print($input."<br>");
20             print($output."<br>");
21             $this->compressImg($key,$input,$output);
22         }
23         return true;
24     }
25     /*Compress one image $input and save as $output*/
26     public function compressImg($key, $input, $output){
27         $url = "https://api.tinify.com/shrink";
28         $options = array(
29             "http" => array(
30                 "method" => "POST",
31                 "header" => array(
32                     "Content-type: image/png",
33                     "Authorization: Basic " . base64_encode("api:$key")
34                 ),
35                 "content" => file_get_contents($input)
36             ),
37             "ssl" => array(
38                 /* Uncomment below if you have trouble validating our SSL certificate.
39                    Download cacert.pem from: http://curl.haxx.se/ca/cacert.pem */
40                 "cafile" => __DIR__ . "/cacert.pem",
41                 "verify_peer" => true
42             )
43         );
44 
45         $result = fopen($url, "r", false, stream_context_create($options));
46         if ($result) {
47             /* Compression was successful, retrieve output from Location header. */
48             foreach ($http_response_header as $header) {
49                 if (strtolower(substr($header, 0, 10)) === "location: ") {
50                     file_put_contents($output, fopen(substr($header, 10), "rb", false));
51                 }
52             }
53         } else {
54             /* Something went wrong! */
55             print("Compression failed<br>");
56         }
57     }
58     //get all files' fullname in $filedir
59     public function getFiles($filedir){
60         $files = [];
61         $dir = @dir($filedir);
62         while(($file = $dir->read())!= false){
63             if($file != "." and $file != ".."){
64                 $files[] = $file;
65             }
66         }
67         $dir->close();
68         return $files;
69     }
70 }
复制代码

 (2) 测试代码

复制代码
 1 <?php
 2 include("TinyImg.php");
 3 /**  4  * Created by PhpStorm.  5  * User: Zhang He  6  * Date: 2015/6/8  7  * Time: 11:45  8 */  9 $tinyImg = new TinyImg(); 10 $key = "****HDtB9xgcry4tdcgbqkhLHs0****";//这里是你申请的API key 11 $input = "D:\\wamp\\www\\zh\\testTinyPng\\ibg_large_test"; //这个文件夹下的文件会被压缩 12 $output = "D:\\wamp\\www\\zh\\testTinyPng\\ibg_small_test";//压缩的结果会被保存到这个文件夹中 13 $tinyImg->compressImgsFolder($key,$input,$output);
复制代码

 2、使用PHP的Imagick扩展

2.1、PHP图像处理扩展包GD、Imagick、Gmagick对比

  GD属于老古董级别的,丢掉吧,效率很低,而且压缩的图片体积很大。

  Imagick是个不错的选择,在PHP的图片处理扩展中表现的很显眼。不管是对jpg或png的静态图片,还是对gif的动态图片,压缩和缩小放大尺寸都非常给力。

  Gmagic没怎么试过,而GraphicsMagick据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。

  安装流程参考链接:http://blog.csdn.net/lyd518/article/details/6753476

复制代码
 1 wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.5.2-7.tar.gz
 2 tar -zxvf ImageMagick-6.5.2-7.tar.gz
 3 cd ImageMagick-6.5.2-7/
 4 ./configure
 5 make
 6 make install
 7 #译PHP原生库Imagick
 8 wget http://pecl.php.net/get/imagick-2.2.2.tgz
 9 tar zxvf imagick-2.2.2.tgz
10 cd imagick-2.2.2/
11 /usr/local/webserver/php/bin/phpize
12 ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
13 make
14 make install
15 #最后,修改php.ini,加上(去除下面#号)
16 #extension = "imagick.so"
复制代码

测试用例

复制代码
1 //读取pdf页面的第一页
2 $im = new Imagick('test.pdf');
3 //设置输出图片的格式
4 $im->setImageFormat('png');
5 //输出图片
6 header('Content-Type:image/png');
7 echo $im; 
复制代码

 

2.2、优化前代码

  这个代码中的压缩功能,主要依靠

    line18的 $imagick->cropThumbnailImage($width$height);

    和line20的 $imagick->resizeImage($width$height, Imagick::FILTER_LANCZOS, 1, true); 

    实现的压缩。

复制代码
 1 /**
 2  * 缩小图片尺寸.
 3  *
 4  * @param $image 待处理的二进制图片
 5  * @param $width 处理后图片尺寸的宽度(px)
 6  * @param $height 处理后图片尺寸的高度(px)
 7  * @param $crop 是否裁剪图片
 8  *
 9  * @return 处理好的二进制图片
10  */
11 function resize($image, $width, $height, $crop) {
12     $imagick = new \Imagick();
13     $imagick->readImageBlob($image);
14     $w = $imagick->getImageWidth();
15     $h = $imagick->getImageHeight();
16     if ($w > $width || $h > $height) {
17         if ($crop) {
18             $imagick->cropThumbnailImage($width, $height);
19         } else {
20             $imagick->resizeImage($width, $height, \Imagick::FILTER_LANCZOS, 1, true);
21         }
22     }
23     $processed_image = $imagick->getImageBlob();
24     return $processed_image;
25 }
复制代码

 2.3 优化后代码

复制代码
 1     /*
 2      * User:Zhang He
 3      * Time:20150610
 4      * Function:Resize $src image and store as $dst
 5      * */
 6     public static function resize($src, $dst, $width=320, $height=320, $crop=false) {
 7 
 8         $imagick = new \Imagick($src);
 9 
10         $w = $imagick->getImageWidth();
11         $h = $imagick->getImageHeight();
12 
13         if ($w > $width || $h > $height) {
14 
15             if ($crop) {
16                 $imagick->cropThumbnailImage($width, $height);
17             } else {
18                 $imagick->resizeImage($width, $height, \Imagick::FILTER_CATROM, 1, true);
19             }
20         }
21 
22         $imagick->setImageFormat('JPEG');
23         $imagick->setImageCompression(\Imagick::COMPRESSION_JPEG);
24         $a = $imagick->getImageCompressionQuality() * 0.75;
25 
26         if ($a == 0) {
27             $a = 75;
28         }
29 
30         $imagick->setImageCompressionQuality($a);
31         $imagick->stripImage();
32 
33         $imagick->writeImage($dst);
34         $imagick->clear();
35         $imagick->destroy();
36     }
复制代码

(1)参考文章

优化代码集中在line22-line31,至于为什么这样优化以及优化达到的效果,可以看原文链接(代码没有格式化):http://www.6a8a.com/2011/PHP_0402/939.html

(2)函数的作用

每个函数的含义可以到 http://php.net/manual/zh/class.imagick.php 查看,下面我列出最主要的几个函数及其解释。

bool Imagick::setImageFormat ( string $format )

  为图片设置指定格式

支持的格式以及对应的库,可以查看 http://www.imagemagick.org/script/formats.php 

bool Imagick::setImageCompression ( int $compression )

  设置图片压缩的类型

Imagick中定义的常量,可以查看 http://php.net/manual/en/imagick.constants.php 。

bool Imagick::setImageCompressionQuality ( int $quality )

  设置图片压缩质量

bool Imagick::stripImage ( void )

  去掉图片的所有配置和设置,如Exif

bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )

  通过过滤器将图片缩放到期望的尺寸。

  过滤器也在Imagick定义的常量页面可以找到:http://php.net/manual/zh/imagick.constants.php#imagick.constants.filters

  Note: 参数 bestfit 的特性在 Imagick 3.0.0 中已改变。在此版本以前,当目标尺寸设为 400x400 时,原尺寸为 200x150 的图像将不会被改变。自 Imagick 3.0.0 起,源图像将会被放大到 400x300 因为这将更好的适合目标尺寸。当使用参数 bestfit 时,必须同时给出宽度和高度。  

bool Imagick::cropThumbnailImage ( int $width , int $height )

  生成一个指定大小的缩略图,首先放大或缩小图片,然后裁剪出一个指定的区域从图片中间。

示例代码:

复制代码
1 <?php
2 /* Read the image */
3 $im = new imagick( "test.png" );
4 /* create the thumbnail */
5 $im->cropThumbnailImage( 80, 80 );
6 /* Write to a file */
7 $im->writeImage( "th_80x80_test.png" );
8 ?>
复制代码

(3)选择哪个过滤器?

 将一个5906*5906的图片压缩至1181*1181所需时间对比:

复制代码
 1 FILTER_POINT took: 0.334532976151 seconds
 2 FILTER_BOX took: 0.777871131897 seconds
 3 FILTER_TRIANGLE took: 1.3695909977 seconds
 4 FILTER_HERMITE took: 1.35866093636 seconds
 5 FILTER_HANNING took: 4.88722896576 seconds
 6 FILTER_HAMMING took: 4.88665103912 seconds
 7 FILTER_BLACKMAN took: 4.89026689529 seconds
 8 FILTER_GAUSSIAN took: 1.93553304672 seconds
 9 FILTER_QUADRATIC took: 1.93322920799 seconds
10 FILTER_CUBIC took: 2.58396601677 seconds
11 FILTER_CATROM took: 2.58508896828 seconds
12 FILTER_MITCHELL took: 2.58368492126 seconds
13 FILTER_LANCZOS took: 3.74232912064 seconds
14 FILTER_BESSEL took: 4.03305602074 seconds
15 FILTER_SINC took: 4.90098690987 seconds 
复制代码

因此,CATROM在保证压缩效果接近LANCZOS的同时,耗时也比较短。

(4)最简洁代码示例

我找到最简洁的例子是这个:

复制代码
 1 /*
 2 Imagick::setImageCompression
 3 Imagick::setImageCompressionQuality
 4 Imagick::stripImage
 5 Imagick::thumbnailImage
 6 Imagick::writeImage
 7 */
 8 
 9 <?php
10     $image = 'image.jpg';
11     $directory = '/path/to/image';
12     $image_location = $directory . "/" . $image;
13     $thumb_destination = $directory . "/t" . $image;
14     $compression_type = Imagick::COMPRESSION_JPEG;
15   
16     $im = new Imagick($image_location);
17     $thumbnail = $im->clone;
18 
19     $thumbnail->setImageCompression($compression_type);
20     $thumbnail->setImageCompressionQuality(40);
21     $thumbnail->stripImage();
22     $thumbnail->thumbnailImage(100,null);
23     $thumbnail->writeImage($thumb_destination);
24 ?> 
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/4566068.html,如需转载请自行联系原作者

相关文章
|
11天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
|
2月前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
45 3
|
3月前
|
JSON Java API
如何设计可扩展的RESTful API?
如何设计可扩展的RESTful API?
|
9天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
2月前
|
安全 前端开发 PHP
PHP与现代Web开发:构建高效和可扩展的应用程序
【8月更文挑战第29天】在这篇文章中,我们将深入探讨PHP如何适应现代Web开发的需求。我们将通过实际案例分析,揭示PHP的核心优势,并展示如何利用这些优势来构建高性能、可扩展的Web应用。文章不仅提供理论知识,还包括具体的代码示例,旨在帮助开发者更好地理解和运用PHP解决实际问题。
|
2月前
|
SQL 关系型数据库 MySQL
PHP与数据库交互的艺术:深入探讨PDO扩展
【8月更文挑战第28天】在数字信息时代的海洋里,PHP作为一艘灵活的帆船,承载着无数网站和应用的梦想。而PDO扩展,则是这艘帆船上不可或缺的导航仪,指引着数据安全与效率的航向。本文将带你领略PHP与数据库交互的艺术,深入浅出地探索PDO的世界,从连接数据库到执行复杂的查询,每一步都清晰可见。我们将一起航行在这段奇妙的旅程上,解锁数据的奥秘,体验编程的乐趣。
15 1
|
2月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
2月前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
74 0
|
2月前
|
缓存 监控 测试技术
探索后端开发之巅:构建高效、可扩展的API服务
【8月更文挑战第29天】在数字化时代的浪潮中,后端开发如同搭建一座桥梁,连接用户与数据的无限可能。本文将引导你理解后端开发的精髓,从基础架构到高级优化技巧,一步步揭示如何构建一个既高效又可扩展的API服务。通过深入浅出的方式,我们将一起探索后端世界的奥秘,让你的开发之路更加顺畅。
|
2月前
|
存储 缓存 运维
平稳扩展:可支持RevenueCat每日12亿次API请求的缓存
平稳扩展:可支持RevenueCat每日12亿次API请求的缓存
35 1
下一篇
无影云桌面