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据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。

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 优化后代码

优化代码集中在line22-line31,至于为什么这样优化以及优化达到的效果,可以看原文链接(代码没有格式化):

http://www.6a8a.com/2011/PHP_0402/939.html

 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     }
时间: 2024-10-07 01:56:43

PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)的相关文章

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

为了提高页面的加载速度,以及减少流量,要针对网站的图片进行瘦身,研究了很多的解决方案,最后确定了使用ImageMagick,了解了这个软件之后,真是如获至宝,简直太好用,效果太明显了. ImageMagick介绍: ImageMagick是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过89种基本格式的图片文件,包括流行的TIFF.JPEG.GIF. PNG.PDF以及PhotoCD等格式.利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个

图片压缩的在线好工具

上周日参加了前端圈的一个走进名企腾讯专场的活动,在会议上有分享嘉宾谈到一个图片的压缩网址,当时也并未太放在心上,没想到本周就接了一个新项目,里面用到的图片都是那种大图,PNG居多,而领导又再三强调一定要保证网页的加载速度,当时就想到那次活动上分享的一个在线压缩工具,于是百度一搜图片压缩工具,发现一个在线图片压缩软件https://tinypng.com/,抱着试试的心态,上传了一张图片开始进行压缩,竟然图片小了一半多,而且图片质量损耗也不明显,果断把用到的图片都往上压了一次,同时发现这个工具对于

图片文件如何进行在线压缩,在线压缩的方法

图片怎么进行压缩,而且还是在线的压缩,很多的时候我们会遇到各种各样的图片文件,随着时间一长,图片增加,我们的电脑手机就有卡顿的情况,图片不可以删除的话可以进行在线压缩,下面教给大家一种在线压缩软件的操作方法. 1:首先在浏览器搜索图片压缩,找到一个图片压缩网站,进入到网站的首页. 2:进入到首页后,在首页导航栏的位置找到文档处理,在文档处理的底部位置可以看到图片压缩. 3:点击图片压缩进入到压缩的页面,进入压缩页面后,点击选择文件,选择需要进行压缩的图片文件. 4:选择文件后,在选择文件下面可以

单张图片在线预览+图片压缩

该方法未测试浏览器兼容性,仅在谷歌上进行过测试. 图片在线预览:一般思路是通过获取file上的绝对路径并将路径赋值给src实现在线预览功能,但现实中的浏览器,尤其是高版本浏览器由于用户安全性考虑,不会让开发者通过file获取到绝对路径,因此使用H5中的画板功能,将图片进行重绘后,得到base64编码的dataURL,再将这个地址赋值给src实现在线预览功能. 图片压缩原理:将大图根据预定尺寸进行尺寸修改. <!DOCTYPE html> <html lang="en"

迅捷在线压缩将JPG图片压缩的方法

将我们的图片在线压缩的方法有很多种,图片的格式也分为很多种,我们需要将jpg格式的图片进行压缩,那么我们是怎么进行在线压缩的呢?下面就让小编简单的给大家介绍一下.步骤一:等准备好之后就可以直接进入到迅捷在线压缩的网站中: 步骤二:找到在线图片压缩,进入进行压缩设置,将图片的压缩质量和压缩类型进行设置: 步骤三:设置完成之后就可以进行文件的上传,将文件直接拖拽进行上传或是进行直接打开,上传完成之后就可以进行文件的压缩,点击开始压缩即可: 步骤四:压缩是需要一定的时间的,我们需要耐心的等待一段时间等

在线图片压缩方法介绍

我们需要做的是将这些大的图片进行在线压缩,将图片在线压缩的小一点,那么我们是怎么进行在线压缩的呢?下面小编就给大家简单介绍一下. 步骤一:我们在浏览器上搜索迅捷在线压缩进入到在线图片压缩中,我们需要将压缩的图片准备好放在桌面上:步骤二:找到在线图片压缩,然后我们可以点击进入立即使用,就可以进行图片的压缩:步骤三:图片选择之前我们可以设置一下压缩设置的质量和类型等:步骤四:将图片文件选择到界面中,拖动或者点击选择都可以:步骤五:图片的压缩是需要一定时间的,我们可以耐心的等待一段时间,等文件压缩完成

基于H5+ API手机相册图片压缩上传

// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径 * @param {Object} obj * obj 对象 有 width, height, quality(0-1) * @param {Object} callback * 回调函数有一个参数,base64的字符串数据 */ App.prototype.dealImage

图片、代码在线工具

图片压缩:https://tinypng.com/ css工具:http://tool.lu/css/ js工具:http://tool.lu/js/ json工具:http://tool.lu/json/ 图标网站:http://iconfont.cn/

移动前端—图片压缩上传实践

目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的 实现.根据查看caniuse,本demo里使用到的FileReader.Blob.Formdata对象均已在大部分移动设备浏览器中得到了实现 (safari6.0+.android 3.0+),所以直接在前端压缩图片,已经成了很多移动端图片上传的必备功能了. 在移动端压缩图片并且上传主要用到filereader.canvas 以及 formdata 这三个h5的api.逻辑并不难.整个过程就是: (1)用户使用input