支持png透明圖片的php生成縮略圖類分享
注:此功能依賴GD2圖形庫
最近要用php生成縮略圖,在網(wǎng)上找了一下,發(fā)現(xiàn)了這篇文章:PHP生成圖片縮略圖
試用了一下后,發(fā)現(xiàn)有這樣幾個(gè)問題:
1、png圖片生成的縮略圖是jpg格式的
2、png圖片生成的縮略圖沒有了透明(半透明)效果(填充了黑色背景)
3、代碼語法比較老
因此,在這個(gè)版本的基礎(chǔ)上簡(jiǎn)單修改優(yōu)化了一下。
PHP生成縮略圖類
<?php /* * desc: Resize Image(png, jpg, gif) * author: 十年后的盧哥哥 * date: 2014.11.13 */ class ResizeImage { //圖片類型 private $type; //實(shí)際寬度 private $width; //實(shí)際高度 private $height; //改變后的寬度 private $resize_width; //改變后的高度 private $resize_height; //是否裁圖 private $cut; //源圖象 private $srcimg; //目標(biāo)圖象地址 private $dstimg; //臨時(shí)創(chuàng)建的圖象 private $im; function __construct($imgPath, $width, $height, $isCut, $savePath) { $this->srcimg = $imgPath; $this->resize_width = $width; $this->resize_height = $height; $this->cut = $isCut; //圖片的類型 $this->type = strtolower(substr(strrchr($this->srcimg,"."),1)); //初始化圖象 $this->initi_img(); //目標(biāo)圖象地址 $this -> dst_img($savePath); //-- $this->width = imagesx($this->im); $this->height = imagesy($this->im); //生成圖象 $this->newimg(); ImageDestroy ($this->im); } private function newimg() { //改變后的圖象的比例 $resize_ratio = ($this->resize_width)/($this->resize_height); //實(shí)際圖象的比例 $ratio = ($this->width)/($this->height); if($this->cut) { //裁圖 $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height); if($this->type=="png") { imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127)); } if($ratio>=$resize_ratio) { //高度優(yōu)先 imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this->height); } else { //寬度優(yōu)先 imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width)/$resize_ratio)); } } else { //不裁圖 if($ratio>=$resize_ratio) { $newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio); if($this->type=="png") { imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127)); } imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->height); } else { $newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height); if($this->type=="png") { imagefill($newimg, 0, 0, imagecolorallocatealpha($newimg, 0, 0, 0, 127)); } imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this->height); } } if($this->type=="png") { imagesavealpha($newimg, true); imagepng ($newimg,$this->dstimg); } else { imagejpeg ($newimg,$this->dstimg); } } //初始化圖象 private function initi_img() { if($this->type=="jpg") { $this->im = imagecreatefromjpeg($this->srcimg); } if($this->type=="gif") { $this->im = imagecreatefromgif($this->srcimg); } if($this->type=="png") { $this->im = imagecreatefrompng($this->srcimg); } } //圖象目標(biāo)地址 private function dst_img($dstpath) { $full_length = strlen($this->srcimg); $type_length = strlen($this->type); $name_length = $full_length-$type_length; $name = substr($this->srcimg,0,$name_length-1); $this->dstimg = $dstpath; } } ?>
使用
使用時(shí),直接調(diào)用類的構(gòu)造函數(shù)即可,構(gòu)造函數(shù)如下:
$resizeimage = new resizeimage($imgPath, $width, $height, $isCut, $savePath);
參數(shù)
$imgPath:原圖片地址
$width:縮略圖寬
$height:縮略圖高
$isCut:是否裁剪,bool值
$savePath:縮略圖地址(可以跟原圖片地址相同)
示例
<?php include "ResizeImage.php"; //jpg $jpgResize = new ResizeImage("img/test_1920_1200.jpg", 320, 240, false, "img/test_320_240.jpg"); //png $pngResize = new ResizeImage("img/test_1024_746.png", 320, 240, false, "img/test_320_240.png"); ?>
效果
- PHP簡(jiǎn)單實(shí)現(xiàn)圖片格式轉(zhuǎn)換(jpg轉(zhuǎn)png,gif轉(zhuǎn)png等)
- PHP中使用Imagick讀取pdf并生成png縮略圖實(shí)例
- PHP使用imagick讀取PDF生成png縮略圖的兩種方法
- PHP輸出圖像imagegif、imagejpeg與imagepng函數(shù)用法分析
- php縮放gif和png圖透明背景變成黑色的解決方法
- PHP實(shí)現(xiàn)生成透明背景的PNG縮略圖函數(shù)分享
- PHP基于GD庫的縮略圖生成代碼(支持jpg,gif,png格式)
- php 處理png圖片白色背景色改為透明色的實(shí)例代碼
- PHP實(shí)現(xiàn)對(duì)png圖像進(jìn)行縮放的方法(支持透明背景)
- PHP添加PNG圖片背景透明水印操作類定義與用法示例
- php 實(shí)現(xiàn)svg轉(zhuǎn)化png格式的方法分析
相關(guān)文章
詳解如何用PHP?實(shí)現(xiàn)多進(jìn)程
這篇文章主要為大家介紹了如何用PHP?實(shí)現(xiàn)多進(jìn)程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09詳解WordPress中用于更新和獲取用戶選項(xiàng)數(shù)據(jù)的PHP函數(shù)
這篇文章主要介紹了WordPress中用于更新和獲取用戶選項(xiàng)數(shù)據(jù)的PHP函數(shù),分別為對(duì)update_user_option()函數(shù)和get_user_option()函數(shù)用法的講解,需要的朋友可以參考下2016-03-03php 獲取當(dāng)前訪問的url文件名的方法小結(jié)
php下獲取當(dāng)前訪問的文件名的代碼小結(jié),大家可以根據(jù)需要選擇。2010-02-02PHP實(shí)現(xiàn)十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制轉(zhuǎn)換相關(guān)函數(shù)用法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制轉(zhuǎn)換相關(guān)函數(shù)用法,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了php各種常見的進(jìn)制轉(zhuǎn)換函數(shù)功能、參數(shù)、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04PHP命名空間與自動(dòng)加載機(jī)制的基礎(chǔ)介紹
這篇文章主要給大家介紹了關(guān)于PHP命名空間與自動(dòng)加載機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08phplock(php進(jìn)程鎖) v1.0 beta1
PHP在多進(jìn)程模式下(并發(fā)的web訪問)由于沒有內(nèi)置的鎖支持,在處理一些資源的之后,很容易出現(xiàn)并發(fā)性問題。2009-11-11PHP獲取redis里不存在的6位隨機(jī)數(shù)應(yīng)用示例【設(shè)置24小時(shí)過時(shí)】
這篇文章主要介紹了PHP獲取redis里不存在的6位隨機(jī)數(shù)的方法,可設(shè)置24小時(shí)過時(shí)限制,涉及php字符串及數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2017-06-06