天天看點

imagemagick圖檔裁剪

為了減少圖檔帶來的網絡帶寬的開銷,決定裁剪圖檔。imagemagick這個庫很好用。

ImageMagick是用C語言開發圖檔處理程式。可以對圖檔進行改變大小、旋轉、銳化、減色或增加特效等操作。對圖檔的操作,即可以通過指令行進行,也可以用C/C++、Perl、Java、PHP、Python或Ruby程式設計來完成。 ImageMagick 的官網是:http://www.ImageMagick.org/script/index.php ImageMagick為php語言提供的兩個擴充IMagick和MagickWand for PHP的安裝。IMagick已經被php最新的版本選為内部的擴充函數庫,php的手冊已經有了函數說明使用文檔。這個擴充是可選安裝的。 ImageMagick有兩款接口,分别是MagickCore API和MagickWand API。MagickCore API是全面的底層的接口,而MagickWand API 是官方推薦的精選的重要的一些接口。IMagick和MagickWand for PHP就是分别為這兩款接口而準備的。 IMagick: 一個可以供PHP調用ImageMagick功能的PHP擴充。使用這個擴充可以使PHP具備和ImageMagick相同的功能。

利用ImageMagicK的convert指令,能很友善的實作圖檔的放大縮小,可以進行等比例縮放,也能縮放到指定的固定大小。縮放的參數resize,由它來指定縮放後圖檔的寬高,比如“200×100”。

  • 等比縮放 例如把圖檔a.jpg縮放到200×100的尺寸,可以用指令:

convert -resize 200×100 src.jpg dest.jpg

注意:雖然明确指定了圖檔大小為200×100,但dest.jpg的不一定就是200×100,因為是等比縮放的,dest.jpg大小取決原始圖檔比例。假設src.jpg的大小是500×200,那麼縮放後dest.jpg的真實大小為200×80,再比如src.jpg的大小是300×200,縮放後的尺寸為150×100。原則是縮放後的尺寸最少有一個是符合寬或高,且另外一個不能大于指定的參數中對應的寬或高。另外可以通過隻指定寬或高的方式來進行縮放。例如:

convert -resize 200 src.jpg dest.jpg
得到圖檔寬為200,高根據原始圖檔比例計算而來

convert -resize x100 src.jpg dest.jpg
得到的圖檔高位100,寬根據原始圖檔比例計算而來
      
  • 固定寬高縮放。即不考慮原是圖寬高的比例,把圖檔縮放到指定大小。例如指令:
convert -resize 200x100! src.jpg dest.jpg
      

說明:差別是寬高後面多了一個歎号,此時不管原圖檔比例如何,縮放後的圖檔大小都是200×100,這樣就可能導緻圖檔變形。注意:在linux環境對參數需要用單引号引起來,而windows下又不能使用單引号。

  • 有條件縮放。可以通過>或<符号來控制原始圖檔是否進行縮放,例如在處理一批尺寸大小各異的圖檔,隻想把尺寸大于給定的值圖檔才進行縮小,如果沒有指定條件,可能會把那些小的圖檔進行了放大處理。
convert -resize "200x100>" src.jpg dest.jpg
注解:隻有當src.jpg的寬大于200或高大于100時候,才進行縮小處理,
否則生成的dest.jpg和src.jpg具有一樣的尺寸。
注意在linux下要用單引号替換成雙引号,即'200x100>'。

convert -resize "200x100<" src.jpg dest.jpg
注解:隻有當src.jpg的寬小于200或高小于100時候,才進行放大處理,
否則生成的dest.jpg和src.jpg具有一樣的尺寸。
注意在linux下要用單引号替換成雙引号,即'200x100<'
      

上述兩種有條件縮放是按原始圖等比例縮放的,也就是對符合條件的圖檔進行等比縮放。同時有條件縮放也可以與固定大小縮放聯合起來用。例如如下指令。

convert -resize "800x100>!" src.jpg dest.jpg
注解:假設src.jpg尺寸是300x200。很顯然src.jpg的高(200)是大于指定值高(100),
符合縮小的條件,由于執行的不是等比縮放,
是以dest.jpg的尺寸理論上是800x100,由于執行是縮小操作
顯然800是超過原始圖檔寬的,故dest.jpg的寬隻能是300

convert -resize "10x1000<!" src.jpg dest.jpg
注解:假設src.jpg尺寸是300x200,src.jpg的高(200)小于指定值高(1000),
是以該指令将執行放大圖檔操作,dest.jpg的高将放到到1000,
由于目标圖檔寬比原始圖檔還小,但是執行的是放大操作,是以隻能用原始圖檔的寬,
是以得到的dest.jpg的尺寸是300x1000。
      

裁剪所有采集圖檔:

function myscandir($pathname){

    foreach( glob($pathname) as $filename ){

        if(is_dir($filename)){

            myscandir($filename.'/*');

        }else{

            $arr = explode(".",$filename);

            $new_filename=$arr[0]."_m.".$arr[1];

            $min_filename = $arr[0]."_s.".$arr[1];

            if(!file_exists($new_filename)){

                exec("convert -resize '240x340>' -strip  -quality 70% {$filename} {$new_filename}");

            }

            if(!file_exists($min_filename)){

                exec("convert -resize '125x170>' -strip  -quality 60% {$filename} {$min_filename}");

            }

        }

    }

}

myscandir("/data_disk/webdata/movie/wwwroot/upload/cut_images/01/*");

繼續閱讀