成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP圖片操作

yacheng / 2092人閱讀

摘要:保持原圖長(zhǎng)寬比,以圖片的長(zhǎng)度,或者寬度中,最小的一個(gè)為準(zhǔn),盡可能填充整個(gè)縮略圖的畫框,只顯示原圖中的某一部分。涉及到的相關(guān)圖片操作函數(shù)如下創(chuàng)建黑色圖片獲取圖片相關(guān)信息一個(gè)圖片中的一部分到另外一個(gè)圖片輸出圖片具體使用方法請(qǐng)查看相關(guān)手冊(cè)。

1, PHP 中 圖片的處理 要 依靠于擴(kuò)展庫(kù), 可以選擇gd2,或者imagemagick
第一步,首先要開啟gd2的擴(kuò)展庫(kù),在phpinfo() 中,要看到

這個(gè)的存在
打開這個(gè)后,就能夠去操作圖片了。

那么操作圖片,是個(gè)什么流程呢??圖片也是文件,是否跟文件操作的流程一樣呢。
答案是yes,

打開圖片。

對(duì)圖片進(jìn)行編輯,如拷貝,改變每一個(gè)像素的模式,把其他圖片疊加上來等等。

可以選擇保存圖片。

貌似所有的文件操作都差不多一樣,打開,編輯,保存.

那么在PHP中怎么打開一個(gè)圖片呢?

這里要注意的是,打開圖片的方式有多種,
比如打開一個(gè)已經(jīng)存在的圖片,會(huì)根據(jù)圖片類型來,要使用不同的函數(shù)打開
具體函數(shù)有這么多:

imagecreate -- 新建一個(gè)基于調(diào)色板的圖像
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 -- 新建一個(gè)真彩色圖像

看見這么多函數(shù)的時(shí)候,我當(dāng)場(chǎng)就不樂意了,這么多函數(shù),到底用哪一個(gè),。?

難道有一個(gè)圖片文件過來,我還要先判斷它到底是什么格式的圖片,是jpg,png,或者說是gif??????

然后再用對(duì)應(yīng)的函數(shù)打開這個(gè)圖片?

如果用擴(kuò)展名的方式去判斷圖片類型,萬一某位同學(xué),把png的擴(kuò)展名稱改成jpg,那我這里不就出問題了?

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

帶著這些問題,我再次花時(shí)間去看了一次php幫助手冊(cè),終于發(fā)現(xiàn),救命的稻草出現(xiàn)了。
以下是幫助手冊(cè)原文:
getimagesize
(PHP 3, PHP 4, PHP 5)
getimagesize -- 取得圖像大小
說明

array getimagesize ( string filename [, array &imageinfo] )
getimagesize()函數(shù)將測(cè)定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM或 WBMP圖像文件的大小并返回圖像的尺寸以及文件類型和一個(gè)可以用于普通 HTML文件中 標(biāo)記中的 height/width 文本字符串。

此函數(shù),功能就是取到文件寬,高,以及文件類型(png,jpg,gif),當(dāng)場(chǎng),我就測(cè)驗(yàn)了一下,如果用png圖片,吧后綴名改成jpg,看看這個(gè)函數(shù)能否正常的獲取文件類型,結(jié)果發(fā)現(xiàn),是ok的,如下圖:

數(shù)組中下標(biāo)為0=寬度,1=高度,2=類型, 類型怎么是數(shù)字呢???我要怎么對(duì)應(yīng)呢?
帶著疑問,再次閱讀文檔:發(fā)現(xiàn)如下

看見這里,腦袋中就已經(jīng)開始構(gòu)思,做一個(gè)配置數(shù)組,來自動(dòng)獲取打開文件的函數(shù)了,代碼如下:

配置數(shù)組中 下標(biāo) 為3的,也png,不知道為什么,這函數(shù)會(huì)返回為3. 不過問題已經(jīng)得到解決,已經(jīng)不用再傷腦筋,到底用哪個(gè)函數(shù)去打開圖片了。
那么既然文件已經(jīng)打開了,那么就該思考如何制作縮略圖了。

縮略圖的概念:應(yīng)該就是把大圖縮小,變成一個(gè)指定尺寸的小圖。

這個(gè)時(shí)候,問題又來了,把一張圖片,變成指定尺寸,說起來簡(jiǎn)單,萬一要吧一個(gè)200 * 400的圖片,變成一個(gè)400 * 200的,你變給我看看。長(zhǎng)寬比例完全不對(duì)稱,強(qiáng)行變,拉伸,都不知道會(huì)失真成什么樣子,如何變嘛?。。。。。。?!
仔細(xì)思考了下,解決方案有2種:

保持原圖長(zhǎng)寬比,以圖片的長(zhǎng)度,或者寬度中,最大的一個(gè)為準(zhǔn),盡可能的顯示整張圖,剩下的空白,用其他純色填充。

保持原圖長(zhǎng)寬比,以圖片的長(zhǎng)度,或者寬度中,最小的一個(gè)為準(zhǔn),盡可能填充整個(gè)縮略圖的畫框,只顯示原圖中的某一部分。

整個(gè)縮略圖的制作方式大概分如下幾步:

新建一個(gè)圖片,圖片的寬高就是所需要的縮略圖的寬高。

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

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

涉及到的相關(guān)圖片操作函數(shù)如下:

Imagecreatetruecolor       創(chuàng)建黑色圖片
Getimagesize              獲取圖片相關(guān)信息
Imagecopyresampled       copy一個(gè)圖片中的一部分到另外一個(gè)圖片
Imagejpeg                 輸出圖片

具體使用方法請(qǐng)查看相關(guān)手冊(cè)。

分別按照2種方式制作寫了如下代碼:

1, 以小為準(zhǔn)

2,以大為準(zhǔn)

然后準(zhǔn)備了3張圖片



最終得到如下結(jié)果:

經(jīng)過考慮,最終選擇以小為基準(zhǔn),也就是盡量鋪滿整個(gè)縮略圖.

擴(kuò)展:水印如何制作,驗(yàn)證碼如何制作?原理跟縮略圖差不多。附上效果

廢話少說,上源碼

以小為準(zhǔn)

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);

以大為準(zhǔn)

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);

驗(yàn)證碼

error_reporting(7);
    session_start();
    header("Content-Type:image/png");
    vcode();
    function vcode($width=100,$height=40)
    {
        $_SESSION["vcode"] = "";        //初始化session
        $im = imagecreatetruecolor($width,$height); //新建一個(gè)300 * 300 的黑色圖像,資源型數(shù)據(jù)
        imagefill ($im, 0, 0, imagecolorallocate($im,0xCC,0xCC,0xCC));//填充灰色,其實(shí)就是吧背景改成灰色
        $colors = array(
            //imagecolorallocate($im,255,255,255),
        );
        for($i=0;$i<10;++$i){//生成10個(gè)比較深的顏色
            $colors[] = imagecolorallocate($im,mt_rand(0,128),mt_rand(0,128),mt_rand(0,128));
        }
        $string = "噢靜安寺奇偶掛科率快點(diǎn)快點(diǎn)快遞發(fā)從摩擦摩擦在迪歐發(fā)順豐是大發(fā)明家路上打劫風(fēng)口浪尖獨(dú)守空房激勵(lì)大師開發(fā)就肯定是房間里看電視費(fèi)我我榮獲唯一讓退全額一千五要嗎新民婆嘔吐太無二套有";
        $len = strlen($string)/3;//計(jì)算中文的長(zhǎng)度
        $font = "2.TTF";//設(shè)置字體
        for($i=0;$i<4;++$i){//取4個(gè)字,然后畫到圖片里面,順便也放進(jìn)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){//再次隨機(jī)10個(gè)淺色
            $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){//用淺色畫點(diǎn)
            imagesetpixel ($im, mt_rand(0,$width), mt_rand(0,$height), $colors[array_rand($colors)] );
        }
        imagepng($im);
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21501.html

相關(guān)文章

  • Centos 下編譯PHP圖片擴(kuò)展庫(kù) ImageMagick、MagickWandForPHP、im

    摘要:安裝環(huán)境說明操作系統(tǒng)安裝路徑開始編譯開始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)開始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)測(cè)試勞動(dòng)結(jié)果查看模塊是 安裝環(huán)境說明: 操作系統(tǒng):Centos 6.5 -64bit 安裝路徑:/usr/local/redis 開始編譯 ImageMagick tar -zxvf ImageMagick-6.8.9-10.tar.gz cd Ima...

    netmou 評(píng)論0 收藏0
  • Centos 下編譯PHP圖片擴(kuò)展庫(kù) ImageMagick、MagickWandForPHP、im

    摘要:安裝環(huán)境說明操作系統(tǒng)安裝路徑開始編譯開始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)開始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)測(cè)試勞動(dòng)結(jié)果查看模塊是 安裝環(huán)境說明: 操作系統(tǒng):Centos 6.5 -64bit 安裝路徑:/usr/local/redis 開始編譯 ImageMagick tar -zxvf ImageMagick-6.8.9-10.tar.gz cd Ima...

    Labradors 評(píng)論0 收藏0
  • PHP處理高分辨率圖片的問題

    摘要:中圖片的處理都是使用了庫(kù),這個(gè)庫(kù)提供了很多方法讓可以更方便地對(duì)圖片進(jìn)行操作,支持的圖片格式如下回到一開始的問題,那個(gè)小伙伴需要處理高分辨的圖片,圖片大小必然很大,所以就會(huì)出現(xiàn)內(nèi)存不夠的情況,解決方法還是有很多的。 今天小伙伴在群里問了這么一個(gè)問題: showImg(https://segmentfault.com/img/remote/1460000018494753); showIm...

    thursday 評(píng)論0 收藏0
  • PHP里使用ImageMagick生成base64圖片

    摘要:個(gè)人博客本文原地址最近的項(xiàng)目中,需要用到畫圖和圖片拼接效果,這里是一些開發(fā)過程里用到的一些點(diǎn)還有就是一些踩過的坑。通過生成圖片格式,為前端所使用。需要注意的是前端得到的額數(shù)據(jù)里包含有回車字符,需要特殊處理才可以正確顯示圖片。 個(gè)人博客 https://duanruilong.github.io/blog/本文原地址https://duanruilong.github.io/blog/2...

    avwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<