摘要:保持原圖長寬比,以圖片的長度,或者寬度中,最小的一個為準,盡可能填充整個縮略圖的畫框,只顯示原圖中的某一部分。涉及到的相關圖片操作函數如下創建黑色圖片獲取圖片相關信息一個圖片中的一部分到另外一個圖片輸出圖片具體使用方法請查看相關手冊。
1, PHP 中 圖片的處理 要 依靠于擴展庫, 可以選擇gd2,或者imagemagick
第一步,首先要開啟gd2的擴展庫,在phpinfo() 中,要看到
這個的存在 打開這個后,就能夠去操作圖片了。
那么操作圖片,是個什么流程呢??圖片也是文件,是否跟文件操作的流程一樣呢。
答案是yes,
打開圖片。
對圖片進行編輯,如拷貝,改變每一個像素的模式,把其他圖片疊加上來等等。
可以選擇保存圖片。
貌似所有的文件操作都差不多一樣,打開,編輯,保存.
那么在PHP中怎么打開一個圖片呢?這里要注意的是,打開圖片的方式有多種,
比如打開一個已經存在的圖片,會根據圖片類型來,要使用不同的函數打開
具體函數有這么多:
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 -- 新建一個真彩色圖像
看見這么多函數的時候,我當場就不樂意了,這么多函數,到底用哪一個,。?
難道有一個圖片文件過來,我還要先判斷它到底是什么格式的圖片,是jpg,png,或者說是gif??????
然后再用對應的函數打開這個圖片?
如果用擴展名的方式去判斷圖片類型,萬一某位同學,把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文件中 標記中的 height/width 文本字符串。
此函數,功能就是取到文件寬,高,以及文件類型(png,jpg,gif),當場,我就測驗了一下,如果用png圖片,吧后綴名改成jpg,看看這個函數能否正常的獲取文件類型,結果發現,是ok的,如下圖:
數組中下標為0=寬度,1=高度,2=類型, 類型怎么是數字呢???我要怎么對應呢?
帶著疑問,再次閱讀文檔:發現如下
看見這里,腦袋中就已經開始構思,做一個配置數組,來自動獲取打開文件的函數了,代碼如下:
配置數組中 下標 為3的,也png,不知道為什么,這函數會返回為3. 不過問題已經得到解決,已經不用再傷腦筋,到底用哪個函數去打開圖片了。
那么既然文件已經打開了,那么就該思考如何制作縮略圖了。
這個時候,問題又來了,把一張圖片,變成指定尺寸,說起來簡單,萬一要吧一個200 * 400的圖片,變成一個400 * 200的,你變給我看看。長寬比例完全不對稱,強行變,拉伸,都不知道會失真成什么樣子,如何變嘛!!!!!!!!
仔細思考了下,解決方案有2種:
保持原圖長寬比,以圖片的長度,或者寬度中,最大的一個為準,盡可能的顯示整張圖,剩下的空白,用其他純色填充。
保持原圖長寬比,以圖片的長度,或者寬度中,最小的一個為準,盡可能填充整個縮略圖的畫框,只顯示原圖中的某一部分。
整個縮略圖的制作方式大概分如下幾步:
新建一個圖片,圖片的寬高就是所需要的縮略圖的寬高。
把原圖中的某一部分copy到新建的圖片里面來
把新建的圖片顯示出來,或者保存成文件。
涉及到的相關圖片操作函數如下:
Imagecreatetruecolor 創建黑色圖片 Getimagesize 獲取圖片相關信息 Imagecopyresampled copy一個圖片中的一部分到另外一個圖片 Imagejpeg 輸出圖片
具體使用方法請查看相關手冊。
分別按照2種方式制作寫了如下代碼:
1, 以小為準 2,以大為準然后準備了3張圖片
經過考慮,最終選擇以小為基準,也就是盡量鋪滿整個縮略圖.
擴展:水印如何制作,驗證碼如何制作?原理跟縮略圖差不多。附上效果 廢話少說,上源碼以小為準
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); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21501.html
摘要:安裝環境說明操作系統安裝路徑開始編譯開始編譯配置支持擴展修改以下內容增加擴展到重新啟動開始編譯配置支持擴展修改以下內容增加擴展到重新啟動測試勞動結果查看模塊是 安裝環境說明: 操作系統:Centos 6.5 -64bit 安裝路徑:/usr/local/redis 開始編譯 ImageMagick tar -zxvf ImageMagick-6.8.9-10.tar.gz cd Ima...
摘要:安裝環境說明操作系統安裝路徑開始編譯開始編譯配置支持擴展修改以下內容增加擴展到重新啟動開始編譯配置支持擴展修改以下內容增加擴展到重新啟動測試勞動結果查看模塊是 安裝環境說明: 操作系統:Centos 6.5 -64bit 安裝路徑:/usr/local/redis 開始編譯 ImageMagick tar -zxvf ImageMagick-6.8.9-10.tar.gz cd Ima...
摘要:中圖片的處理都是使用了庫,這個庫提供了很多方法讓可以更方便地對圖片進行操作,支持的圖片格式如下回到一開始的問題,那個小伙伴需要處理高分辨的圖片,圖片大小必然很大,所以就會出現內存不夠的情況,解決方法還是有很多的。 今天小伙伴在群里問了這么一個問題: showImg(https://segmentfault.com/img/remote/1460000018494753); showIm...
摘要:個人博客本文原地址最近的項目中,需要用到畫圖和圖片拼接效果,這里是一些開發過程里用到的一些點還有就是一些踩過的坑。通過生成圖片格式,為前端所使用。需要注意的是前端得到的額數據里包含有回車字符,需要特殊處理才可以正確顯示圖片。 個人博客 https://duanruilong.github.io/blog/本文原地址https://duanruilong.github.io/blog/2...
閱讀 2061·2023-04-25 21:11
閱讀 2963·2021-09-30 09:47
閱讀 2271·2021-09-24 09:48
閱讀 4427·2021-08-23 09:43
閱讀 895·2019-08-30 15:54
閱讀 559·2019-08-28 18:01
閱讀 1397·2019-08-27 10:55
閱讀 588·2019-08-27 10:55