PHP圖片操做

1, PHP 中 圖片的處理 要 依靠於擴展庫, 能夠選擇gd2,或者imagemagick

第一步,首先要開啓gd2的擴展庫,在phpinfo() 中,要看到

clipboard.png

這個的存在
打開這個後,就可以去操做圖片了。

那麼操做圖片,是個什麼流程呢??圖片也是文件,是否跟文件操做的流程同樣呢。
答案是yes,php

  • 打開圖片。數組

  • 對圖片進行編輯,如拷貝,改變每個像素的模式,把其餘圖片疊加上來等等。session

  • 能夠選擇保存圖片。函數

貌似全部的文件操做都差很少同樣,打開,編輯,保存.字體

那麼在PHP中怎麼打開一個圖片呢?

這裏要注意的是,打開圖片的方式有多種,
好比打開一個已經存在的圖片,會根據圖片類型來,要使用不一樣的函數打開
具體函數有這麼多:spa

imagecreate -- 新建一個基於調色板的圖像
imagecreatefromgd2 -- 從 GD2 文件或 URL 新建一圖像
imagecreatefromgd2part -- 從給定的 GD2 文件或 URL 中的部分新建一圖像
imagecreatefromgd -- 從 GD 文件或 URL 新建一圖像
imagecreatefromgif -- 從 GIF 文件或 URL 新建一圖像
imagecreatefromjpeg -- 從 JPEG 文件或 URL 新建一圖像
imagecreatefrompng -- 從 PNG 文件或 URL 新建一圖像
imagecreatefromstring -- 從字符串中的圖像流新建一圖像
imagecreatefromwbmp -- 從 WBMP 文件或 URL 新建一圖像
imagecreatefromxbm -- 從 XBM 文件或 URL 新建一圖像
imagecreatefromxpm -- 從 XPM 文件或 URL 新建一圖像
imagecreatetruecolor -- 新建一個真彩色圖像

看見這麼多函數的時候,我當場就不樂意了,這麼多函數,到底用哪個,。?code

  • 難道有一個圖片文件過來,我還要先判斷它究竟是什麼格式的圖片,是jpg,png,或者說是gif??????圖片

  • 而後再用對應的函數打開這個圖片?ip

  • 若是用擴展名的方式去判斷圖片類型,萬一某位同窗,把png的擴展名稱改爲jpg,那我這裏不就出問題了?資源

  • 難道只能使用文件頭的方式去獲取文件類型了?

帶着這些問題,我再次花時間去看了一次php幫助手冊,終於發現,救命的稻草出現了。
如下是幫助手冊原文:
getimagesize
(PHP 3, PHP 4, PHP 5)
getimagesize -- 取得圖像大小
說明

array getimagesize ( string filename [, array &imageinfo] )
getimagesize()函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM或 WBMP圖像文件的大小並返回圖像的尺寸以及文件類型和一個能夠用於普通 HTML文件中 <IMG>標記中的 height/width 文本字符串。

此函數,功能就是取到文件寬,高,以及文件類型(png,jpg,gif),當場,我就測驗了一下,若是用png圖片,吧後綴名改爲jpg,看看這個函數可否正常的獲取文件類型,結果發現,是ok的,以下圖:

clipboard.png

數組中下標爲0=寬度,1=高度,2=類型, 類型怎麼是數字呢???我要怎麼對應呢?
帶着疑問,再次閱讀文檔:發現以下
clipboard.png

看見這裏,腦殼中就已經開始構思,作一個配置數組,來自動獲取打開文件的函數了,代碼以下:

clipboard.png

配置數組中 下標 爲3的,也png,不知道爲何,這函數會返回爲3. 不過問題已經獲得解決,已經不用再傷腦筋,到底用哪一個函數去打開圖片了。
那麼既然文件已經打開了,那麼就該思考如何製做縮略圖了。

縮略圖的概念:應該就是把大圖縮小,變成一個指定尺寸的小圖。

這個時候,問題又來了,把一張圖片,變成指定尺寸,提及來簡單,萬一要吧一個200 * 400的圖片,變成一個400 * 200的,你變給我看看。長寬比例徹底不對稱,強行變,拉伸,都不知道會失真成什麼樣子,如何變嘛!!!!!!!!
仔細思考了下,解決方案有2種:

  • 保持原圖長寬比,以圖片的長度,或者寬度中,最大的一個爲準,儘量的顯示整張圖,剩下的空白,用其餘純色填充。

  • 保持原圖長寬比,以圖片的長度,或者寬度中,最小的一個爲準,儘量填充整個縮略圖的畫框,只顯示原圖中的某一部分。

整個縮略圖的製做方式大概分以下幾步:

  1. 新建一個圖片,圖片的寬高就是所須要的縮略圖的寬高。

  2. 把原圖中的某一部分copy到新建的圖片裏面來

  3. 把新建的圖片顯示出來,或者保存成文件。

涉及到的相關圖片操做函數以下:

Imagecreatetruecolor       建立黑色圖片
Getimagesize              獲取圖片相關信息
Imagecopyresampled       copy一個圖片中的一部分到另一個圖片
Imagejpeg                 輸出圖片

具體使用方法請查看相關手冊。

分別按照2種方式製做寫了以下代碼:

1, 以小爲準

clipboard.png

2,以大爲準

clipboard.png

clipboard.png

clipboard.png

而後準備了3張圖片

clipboard.png
clipboard.png
clipboard.png

最終獲得以下結果:

clipboard.png

clipboard.png

通過考慮,最終選擇以小爲基準,也就是儘可能鋪滿整個縮略圖.

擴展:水印如何製做,驗證碼如何製做?原理跟縮略圖差很少。附上效果

clipboard.png

clipboard.png

廢話少說,上源碼

以小爲準

header('Content-type: image/jpeg');
function get_thumb($filename,$width,$height,$outPath='',$type='1')
{
    $newimages = imagecreatetruecolor($width,$height);//資源型
    $config = array(
        IMG_GIF => 'imagecreatefromgif',
        IMG_JPG => 'imagecreatefromjpeg',
        IMG_PNG => 'imagecreatefrompng',
        IMG_JPEG =>'imagecreatefromjpeg'
    );
    $imgInfo = getimagesize($filename);
    $o_image = $config[$imgInfo[2]]($filename);
    $w = &$imgInfo[0];
    $h = &$imgInfo[1];
    if ($w > $h){
       $nheight = min($height,$h);
       $nwidth = $w / $h * $nheight;
       $x = -($nwidth -  $width)/2;
       $y = -($nheight -  $height)/2;
    }elseif ($w <= $h){
       $nwidth =  min($w,$width);
       $nheight = $h / $w * $nwidth;
       $y = -($nheight - $height)/2;
       $x = -($nwidth -  $width)/2;
    }
    imagecopyresampled($newimages,$o_image,$x,$y,0,0,$nwidth,$nheight,$imgInfo[0],$imgInfo[1]);
    imagejpeg($newimages,null,100);
}
get_thumb($_GET['img'] ? $_GET['img']:"1.png",290,230);

以大爲準

header('Content-type: image/jpeg');
function get_thumb($filename,$width,$height,$outPath='',$type='1')
{
    $newimages = imagecreatetruecolor($width,$height);//資源型
    //$white = imagecolorallocate($newimages,255,255,255);
    //imagefill($newimages,0,0,$white);
    $config = array(
        IMG_GIF => 'imagecreatefromgif',
        IMG_JPG => 'imagecreatefromjpeg',
        IMG_PNG => 'imagecreatefrompng',
        IMG_JPEG =>'imagecreatefromjpeg'
    );
    $imgInfo = getimagesize($filename);
    $o_image = $config[$imgInfo[2]]($filename);
    $w = &$imgInfo[0];
    $h = &$imgInfo[1];
    if ($w > $h){
       $nwidth = min($width,$w);
       $nheight = $h / $w * $nwidth;
       $x = ($width - $nwidth) / 2;
       $y = ($height - $nheight) / 2;
    }elseif ($w < $h){
       $nheight = min($height,$h);
       $nwidth = $w / $h * $nheight;
       $y = ($height - $nheight) / 2;
       $x = ($width - $nwidth) / 2;
    }
    imagecopyresampled($newimages,$o_image,$x,$y,0,0,$nwidth,$nheight,$imgInfo[0],$imgInfo[1]);
    imagejpeg($newimages,null,100);
}
get_thumb($_GET['img'] ? $_GET['img']:"1.png",400,400);

水印

function get_thumb($filename,$width,$height,$outPath='',$type='1')
{
    $newimages = imagecreatetruecolor($width,$height);//資源型
    //$white = imagecolorallocate($newimages,255,255,255);
    //imagefill($newimages,0,0,$white);
    $config = array(
        IMG_GIF => 'imagecreatefromgif',
        IMG_JPG => 'imagecreatefromjpeg',
        3 => 'imagecreatefrompng',
        IMG_PNG => 'imagecreatefrompng',
        IMG_JPEG =>'imagecreatefromjpeg'
    );
    $imgInfo = getimagesize($filename);
    // $o_image_type = image_type_to_extension($imgInfo['2']);
    $o_image = $config[$imgInfo[2]]($filename);
    $w = &$imgInfo[0];
    $h = &$imgInfo[1];
    
    if ($w > $h){
       $nheight = min($height,$h);
       $nwidth = $w / $h * $nheight;
       $x = -($nwidth -  $width)/2;
       $y = -($nheight -  $height)/2;
    }elseif ($w <= $h){
       $nwidth =  min($w,$width);
       $nheight = $h / $w * $nwidth;
       $y = -($nheight - $height)/2;
       $x = -($nwidth -  $width)/2;
    }
    imagecopyresampled($newimages,$o_image,$x,$y,0,0,$nwidth,$nheight,$imgInfo[0],$imgInfo[1]);

    /*水印*/
    $filename = "sy.png";
    $imgInfo = getimagesize($filename);
    $o_image = $config[$imgInfo[2]]($filename);
    // var_dump($imgInfo);
    // imagecopyresampled($newimages,$o_image,0,0,0,0,$imgInfo[0],$imgInfo[1],$imgInfo[0],$imgInfo[1]);
    if ($width >= $height){
        $h = $height / 16;
        $w = $imgInfo[0] / $imgInfo[1] * $h;
    }else{
        $w = $width / 9;
        $h = $imgInfo[1] / $imgInfo[0] * $w;
    }
    $h = min($h,$imgInfo[1]);
    $w = min($w,$imgInfo[0]);
    $sy_x = $width - $w - 40;
    $sy_y = $height - $h -30;
    
    imagecopyresampled($newimages,$o_image,$sy_x ,$sy_y,0,0,$w,$h,$imgInfo[0],$imgInfo[1]);
    
    header('Content-type: image/jpeg');
    imagejpeg($newimages,null,100);
}

get_thumb($_GET['img'] ? $_GET['img']:"1.png",400,400);

驗證碼

error_reporting(7);
    session_start();
    header("Content-Type:image/png");
    vcode();
    function vcode($width=100,$height=40)
    {
        $_SESSION['vcode'] = "";        //初始化session
        $im = imagecreatetruecolor($width,$height); //新建一個300 * 300 的黑色圖像,資源型數據
        imagefill ($im, 0, 0, imagecolorallocate($im,0xCC,0xCC,0xCC));//填充灰色,其實就是吧背景改爲灰色
        $colors = array(
            //imagecolorallocate($im,255,255,255),
        );
        for($i=0;$i<10;++$i){//生成10個比較深的顏色
            $colors[] = imagecolorallocate($im,mt_rand(0,128),mt_rand(0,128),mt_rand(0,128));
        }
        $string = "噢靜安寺奇偶掛科率快點快點快遞發從摩擦摩擦在迪歐發順豐是大發明家路上打劫風口浪尖獨守空房激勵大師開發就確定是房間裏看電視費我我榮獲惟一讓退全額一千五要嗎新民婆嘔吐太無二套有";
        $len = strlen($string)/3;//計算中文的長度
        $font = "2.TTF";//設置字體
        for($i=0;$i<4;++$i){//取4個字,而後畫到圖片裏面,順便也放進session
            $_tmp = mt_rand(0,$len-1);
            $_tmp = $_tmp * 3;
            //$text .= mb_substr($string,$_tmp,1,'utf8');
            $text = $string[$_tmp].$string[$_tmp+1].$string[$_tmp+2];
            $_SESSION['vcode'] .= $text;
            imagettftext($im,mt_rand(16,26),mt_rand(-45,45),11+21*$i,25,$colors[array_rand($colors)],$font,$text);
        }
        $colors = array();
        for($i=0;$i<10;++$i){//再次隨機10個淺色
            $colors[] = imagecolorallocate($im,mt_rand(128,255),mt_rand(128,255),mt_rand(128,255));
        }
        for($i=0;$i<20;++$i){//用淺色劃線
            imageline ( $im, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $colors[array_rand($colors)]); //畫一根白線
        }
        //bool imagesetpixel ( resource image, int x, int y, int color )
        for($i=0;$i<200;++$i){//用淺色畫點
            imagesetpixel ($im, mt_rand(0,$width), mt_rand(0,$height), $colors[array_rand($colors)] );
        }
        imagepng($im);
    }
相關文章
相關標籤/搜索