当前位置:首页 > linux教程 > 列表

linux中tinypng图片压缩的例子

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-21 11:26:17 浏览: 评论:0 

TinyPNG一个压缩PNG工具了,TinyPNG为了达到更小的文件大小进行了有损压缩,尽管在质量上有轻微的下降,但裸眼看不出来,下面我们就来看看linux中tinypng图片压缩的例子.

多的一般是图片,图片的压缩比越大,访问页面速度会越快,wordpress下有相关的如WP Smush.it可以用于图片压缩,不过对于压缩比例和保真层度来看,不如tinypng,其对wordpress也提供了相应的插件,不过免费版每个邮箱用户每月只提供五百个请求的压缩,这里结合其官方API,做了一个shell版本的小工具,另外根据之前的php上传及tinypng的php API也写了一个web版的工具.

一、shell 版本

通过CURL请求,直接执行请求API URL时:

[root@361way tmp]# curl -i --user api:aSiDFS1VD1UfX7pIPdoDFSvoaYTaAvN --data-binary @delrepo2.png https://api.tinypng.com/shrink

执行结果 HTTP/1.1 100 Continue

  1. HTTP/1.1 201 Created 
  2. Cache-Control: no-cache 
  3. Compression-Count: 2 
  4. Content-Type: application/json; charset=utf-8 
  5. Date: Wed, 04 Mar 2015 03:13:34 GMT 
  6. Location: https://api.tinypng.com/output/3molv9psquoqou8u.png 
  7. Server: Apache/2 
  8. Strict-Transport-Security: max-age=31536000 
  9. X-Powered-By: Voormedia (voormedia.com/jobs) 
  10. Content-Length: 158 
  11. Connection: keep-alive 
  12. {"input":{"size":10628,"type":"image/png"},"output":{"size":7865,"type":"image/png","ratio":0.74,"url":"https://api.tinypng.com/output/3molv9psquoqou8u.png"}} 

其中Location地址为执行后返回压缩后的图片在服务器上存放的地址,最后可以通过wget或curl 将该地址从远程取回来.

以下是写的shell 版,如下:

  1. #!/bin/bash 
  2. Help() 
  3.    cat << EOF 
  4.    ==================================================================== 
  5.    Usage:  tinpny.sh  input.png output.png 
  6.    ==================================================================== 
  7. EOF 
  8. if [ $# != 2 ];then 
  9.     Help 
  10. else 
  11.     httpcont=`date +%s` 
  12.     url=`curl --silent -i --user api:aSiDFS1VD1UfX7pIPdoDFSvoaY_TaAvN --data-binary @$1 https://api.tinypng.com/shrink |grep Location|awk '{print $2}'| tr -d '\r'` 
  13.     echo $url 
  14.     wget $url -O $2 
  15. fi 

二、php版

可以先参看PHP图片上传程序(完整版),这里使用的是PHP with curl API版,代码如下:

  1. <?php 
  2. /****************************************************************************** 
  3. 参数说明: 
  4. $max_file_size  : 上传文件大小限制, 单位BYTE 
  5. $destination_folder : 上传文件路径 
  6. $watermark   : 是否附加水印(1为加水印,其他为不加水印); 
  7. 使用说明: 
  8. 1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库; 
  9. 2. 将extension_dir =改为你的php_gd2.dll所在目录; 
  10. ******************************************************************************/ 
  11. //上传文件类型列表 
  12. $uptypes=array
  13.     'image/jpg'
  14.     'image/jpeg'
  15.     'image/png'
  16.     'image/pjpeg'
  17.     'image/gif'
  18.     'image/bmp'
  19.     'image/x-png' 
  20. ); 
  21. $max_file_size=2000000;     //上传文件大小限制, 单位BYTE 
  22. $destination_folder="uploadimg/"//上传文件路径 
  23. $watermark=2;      //是否附加水印(1为加水印,其他为不加水印); 
  24. $watertype=1;      //水印类型(1为文字,2为图片) 
  25. $waterposition=1;     //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中); 
  26. $waterstring="http://www.361way.com/";  //水印字符串 
  27. $waterimg="361way.gif";    //水印图片 
  28. $imgpreview=1;      //是否生成预览图(1为生成,其他为不生成); 
  29. $imgpreviewsize=1/2;    //缩略图比例 
  30. ?> 
  31. <?php 
  32. function Compressimg($input,$output
  33.     $key = "aSiDFS1VD1UfX7pIPdoDFSvoaY_TaAvN"
  34.     $request = curl_init(); 
  35.     curl_setopt_array($requestarray
  36.       CURLOPT_URL => "https://api.tinypng.com/shrink"
  37.       CURLOPT_USERPWD => "api:" . $key
  38.       CURLOPT_POSTFIELDS => file_get_contents($input), 
  39.       CURLOPT_BINARYTRANSFER => true, 
  40.       CURLOPT_RETURNTRANSFER => true, 
  41.       CURLOPT_HEADER => true, 
  42.       /* Uncomment below if you have trouble validating our SSL certificate. 
  43.          Download cacert.pem from: http://curl.haxx.se/ca/cacert.pem */ 
  44.       // CURLOPT_CAINFO => __DIR__ . "/cacert.pem", 
  45.       CURLOPT_SSL_VERIFYPEER => true 
  46.     )); 
  47.     $response = curl_exec($request); 
  48.     if (curl_getinfo($request, CURLINFO_HTTP_CODE) === 201) { 
  49.       /* Compression was successful, retrieve output from Location header. */ 
  50.       $headers = substr($response, 0, curl_getinfo($request, CURLINFO_HEADER_SIZE)); 
  51.       foreach (explode("\r\n"$headersas $header) { 
  52.         if (substr($header, 0, 10) === "Location: ") { 
  53.           $request = curl_init(); 
  54.           curl_setopt_array($requestarray
  55.             CURLOPT_URL => substr($header, 10), 
  56.             CURLOPT_RETURNTRANSFER => true, 
  57.             /* Uncomment below if you have trouble validating our SSL certificate. */ 
  58.             // CURLOPT_CAINFO => __DIR__ . "/cacert.pem", 
  59.             CURLOPT_SSL_VERIFYPEER => true 
  60.           )); 
  61.           file_put_contents($output, curl_exec($request)); 
  62.         } 
  63.       } 
  64.     } else { 
  65.         print(curl_error($request)); 
  66.       /* Something went wrong! */ 
  67.       print("Compression failed"); 
  68.     } 
  69. ?> 
  70. <html> 
  71. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  72. <head> 
  73. <title>361way图片上传程序</title> 
  74. <style type="text/css"
  75. <!-- 
  76. body 
  77.      font-size: 9pt; 
  78. input 
  79.      background-color: #66CCFF; 
  80.      border: 1px inset #CCCCCC; 
  81. --> 
  82. </style> 
  83. </head> 
  84. <body> 
  85. <form enctype="multipart/form-data" method="post" name="upform"
  86.   上传文件: 
  87.   <input name="upfile" type="file"
  88.   <input type="submit" value="上传"><br> 
  89.   允许上传的文件类型为:<?php echo implode(',',$uptypes)?> 
  90. </form> 
  91. <?php 
  92. if ($_SERVER['REQUEST_METHOD'] == 'POST'
  93.     if (!is_uploaded_file($_FILES["upfile"][tmp_name])) 
  94.     //是否存在文件 
  95.     { 
  96.          echo "图片不存在!"
  97.          exit
  98.     } 
  99.     $file = $_FILES["upfile"]; 
  100.     if($max_file_size < $file["size"]) 
  101.     //检查文件大小 
  102.     { 
  103.         echo "文件太大!"
  104.         exit
  105.     } 
  106.     if(!in_array($file["type"], $uptypes)) 
  107.     //检查文件类型 
  108.     { 
  109.         echo "文件类型不符!".$file["type"]; 
  110.         exit
  111.     } 
  112. #    if(file_exists($_FILES["upfile"][name])) 
  113. #    { 
  114. #        echo "文件名已存在"
  115. #    } 
  116.     if(!file_exists($destination_folder)) 
  117.     { 
  118.         mkdir($destination_folder); 
  119.     } 
  120.     $filename=$file["tmp_name"]; 
  121.     $upfile_name=$file["name"]; 
  122.     $image_size = getimagesize($filename); 
  123.     $pinfo=pathinfo($file["name"]); 
  124.     $ftype=$pinfo['extension']; 
  125.     $destination = $destination_folder.time().".".$ftype
  126.     if (file_exists($destination) && $overwrite != true) 
  127.     { 
  128.         echo "同名文件已经存在了"
  129.         exit
  130.     } 
  131.     if(!move_uploaded_file ($filename$destination)) 
  132.     { 
  133.         echo "移动文件出错"
  134.         exit
  135.     } 
  136.     $pinfo=pathinfo($destination); 
  137.     $fname=$pinfo[basename]; 
  138.     echo " <font color=red>已经成功上传</font><br>文件名:  <font color=blue>".$destination_folder.$fname."</font><br>"
  139.     echo " 宽度:".$image_size[0]; 
  140.     echo " 长度:".$image_size[1]; 
  141.     echo "<br> 大小:".$file["size"]." bytes"
  142.     if($watermark==1) 
  143.     { 
  144.         $iinfo=getimagesize($destination,$iinfo); 
  145.         $nimage=imagecreatetruecolor($image_size[0],$image_size[1]); 
  146.         $white=imagecolorallocate($nimage,255,255,255); 
  147.         $black=imagecolorallocate($nimage,0,0,0); 
  148.         $red=imagecolorallocate($nimage,255,0,0); 
  149.         imagefill($nimage,0,0,$white); 
  150.         switch ($iinfo[2]) 
  151.         { 
  152.             case 1: 
  153.             $simage =imagecreatefromgif($destination); 
  154.             break
  155.             case 2: 
  156.             $simage =imagecreatefromjpeg($destination); 
  157.             break
  158.             case 3: 
  159.             $simage =imagecreatefrompng($destination); 
  160.             break
  161.             case 6: 
  162.             $simage =imagecreatefromwbmp($destination); 
  163.             break
  164.             default
  165.             die("不支持的文件类型"); 
  166.             exit
  167.         } 
  168.         imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]); 
  169.         imagefilledrectangle($nimage,1,$image_size[1]-15,80,$image_size[1],$white); 
  170.         switch($watertype
  171.         { 
  172.             case 1:   //加水印字符串 
  173.             imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black); 
  174.             break
  175.             case 2:   //加水印图片 
  176.             $simage1 =imagecreatefromgif("361way.gif"); 
  177.             imagecopy($nimage,$simage1,0,0,0,0,85,15); 
  178.             imagedestroy($simage1); 
  179.             break
  180.         } 
  181.         switch ($iinfo[2]) 
  182.         { 
  183.             case 1: 
  184.             //imagegif($nimage, $destination); 
  185.             imagejpeg($nimage$destination); 
  186.             break
  187.             case 2: 
  188.             imagejpeg($nimage$destination); 
  189.             break
  190.             case 3: 
  191.             imagepng($nimage$destination); 
  192.             break
  193.             case 6: 
  194.             imagewbmp($nimage$destination); 
  195.             //imagejpeg($nimage, $destination); 
  196.             break
  197.         } 
  198.         //覆盖原上传文件 
  199.         imagedestroy($nimage); 
  200.         imagedestroy($simage); 
  201.     }  //phpfensi.com 
  202.     $output=$destination_folder.$upfile_name
  203.     Compressimg($destination,$output); 
  204.     unlink($destination); 
  205.     if($imgpreview==1) 
  206.     { 
  207.     echo "<br>图片预览:<br>"
  208.     echo "<img src=\"".$output."" width=".($image_size[0]*$imgpreviewsize)." height=".($image_size[1]*$imgpreviewsize); 
  209.     echo " alt=\"图片预览:\r文件名:".$output."\r上传时间:\">"
  210.     } 
  211. ?> 
  212. </body> 
  213. </html> 

最后:官方还提供了Java、ruby、node.js、python版的API,本来想使用下python版,不过本地的使用python版本是2.7版本的,而官方提供的是python3.x版本的.

Tags: linux图片压缩 tinypng图片压缩

分享到: