【PHP縮圖類】手機照片不能生成縮圖問題以及解決方案
一、出現的問題
這幾天做了手機上傳照片並裁出縮圖的介面的測試,發現不管怎麼,生成的縮圖都是一片漆黑。:-(
然後就把這個縮圖類單拿出來進行測試,發現只要是手機拍出來的照片都不能進行縮圖的處理。。。。
二、問題分析以及解決方案
經過群裡的請教,發現問題可能是出現在檔案的型別的判斷上,因為png圖片自帶一個透明的圖層,導致不能直接轉換成jpg的檔案,而手機排出的照片副檔名是jpg.
所以,得出的結論是手機拍出的是jpg副檔名的png圖片。
由於副檔名是可以隨意修改的,不是很能保證檔案的資訊的準確性,所以我們採用了
getimagesize 函式進行檔案型別的獲取。
getimagesize 函式進行檔案型別的獲取。
//獲取真實的圖片型別 list($width, $height, $type, $attr) = getimagesize($this->sur_file); switch($type) { case 1 : $img_type = `gif`; break; case 2 : $img_type = `jpeg`; break; case 3 : $img_type = `png`; break; case 15 : $img_type = `wbmp`; break; default : return false; }
三、生成縮圖類
下面把修改後的生成縮圖的類貼出來,供大家指正~
/** * php生成縮圖類 * 修改者 點點細雨 * 文章出處 : http://blog.csdn.net/diandianxiyu_geek * 2014-07-23 解決了圖片型別不能正常識別的問題 */ class thumb { public $sur_file; //讀取的原圖片 public $des_file; //生成目標圖片 public $tem_file; //臨時圖片 public $tag; //縮略標籤 0,預設,按固定的高寬生成 1,按比列或固定最大長度生成 -1,按某個寬度或某個高度縮小 public $resize_width; //$tag為0時,目標檔案寬 public $resize_height; //$tag為0時,目標檔案高 public $sca_max; //$tag為1時,<0$sca_max<1時為縮小比例;$sca_max>1時為最大長度(高或寬之中的最大值) public $type; //圖片型別 public $width; //原圖片寬 public $height; //原圖片高 public $size; //原圖大小 //建構函式 public function __construct($surpic, $reswid, $reshei, $despic, $mark, $scamax) { $this->sur_file = $surpic; $this->resize_width = $reswid; $this->resize_height = $reshei; $this->tag = $mark; $this->sca_max = $scamax; list($width, $height, $type, $attr) = getimagesize($this->sur_file); switch ($type) { case 1 : $img_type = `gif`; break; case 2 : $img_type = `jpeg`; break; case 3 : $img_type = `png`; break; case 15 : $img_type = `wbmp`; break; default : return false; } $this->type = $img_type; //獲取圖片型別 $this->init_img(); //初始化圖片 $this->des_file = $despic; //目標圖片地址 $this->width = $width; $this->height = $height; $this->size = filesize($surpic); $this->new_img(); imagedestroy($this->tem_file); } //圖片初始化函式 private function init_img() { if ($this->type == `jpeg`) { $this->tem_file = imagecreatefromjpeg($this->sur_file); } elseif ($this->type == `jpg`) { $this->tem_file = imagecreatefromjpeg($this->sur_file); } elseif ($this->type == `gif`) { $this->tem_file = imagecreatefromgif($this->sur_file); } elseif ($this->type == `png`) { $this->tem_file = imagecreatefrompng($this->sur_file); } elseif ($this->type == `bmp`) { $this->tem_file = imagecreatefrombmp($this->sur_file); //bmp.php中包含 } } //圖片生成函式 private function new_img() { $ratio = ($this->width) / ($this->height); //原圖比例 $resize_ratio = ($this->resize_width) / ($this->resize_height); //縮略後比例 $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height); //生成新圖片 imagealphablending($newimg, false); //這裡很重要,意思是不合並顏色,直接用$img影像顏色替換,包括透明色; imagesavealpha($newimg, true); if ($this->tag == 0) { //按固定高寬擷取縮圖 $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height); //生成新圖片 if ($ratio >= $resize_ratio) {//即等比例下,縮圖的高比原圖長,因此高不變 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, $this->resize_width, $this->resize_height, (($this->height) * $resize_ratio), $this->height); } elseif ($ratio < $resize_ratio) {//即等比例下,縮圖的寬比原圖長,因此寬不變 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width) / $resize_ratio)); } } elseif ($this->tag == 1) { //按固定比例或最大長度縮小 if ($this->sca_max < 1) { //按比例縮小 $newimg = imagecreatetruecolor((($this->width) * ($this->sca_max)), (($this->height) * ($this->sca_max))); //生成新圖片 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, (($this->width) * ($this->sca_max)), (($this->height) * ($this->sca_max)), $this->width, $this->height); } elseif ($this->sca_max > 1) { //按某個最大長度縮小 if ($ratio >= 1) { //寬比高長 $newimg = imagecreatetruecolor($this->sca_max, ($this->sca_max / $ratio)); //生成新圖片 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, $this->sca_max, ($this->sca_max / $ratio), $this->width, $this->height); } else { $newimg = imagecreatetruecolor(($this->sca_max * $ratio), $this->sca_max); //生成新圖片 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, ($this->sca_max * $ratio), $this->sca_max, $this->width, $this->height); } } } elseif ($this->tag == -1) { //按某個寬度或某個高度縮小 if ($resize_ratio >= 1) {//新高小於新寬,則圖片按新寬度縮小 $newimg = imagecreatetruecolor($this->resize_width, ($this->resize_width / $ratio)); //生成新圖片 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, $this->resize_width, ($this->resize_width / $ratio), $this->width, $this->height); } elseif ($resize_ratio < 1) {//新寬小於新高,則圖片按新高度縮小 $newimg = imagecreatetruecolor(($this->resize_height * $ratio), $this->resize_height); //生成新圖片 imagecopyresampled($newimg, $this->tem_file, 0, 0, 0, 0, ($this->resize_height * $ratio), $this->resize_height, $this->width, $this->height); } } //輸出新圖片 if ($this->type == `jpeg` || $this->type == `jpg`) { imagejpeg($newimg, $this->des_file); } elseif ($this->type == `gif`) { imagegif($newimg, $this->des_file); } elseif ($this->type == `png`) { imagepng($newimg, $this->des_file); } elseif ($this->type == `bmp`) { imagebmp($newimg, $this->des_file); //bmp.php中包含 } } #function new_img() end }
相關文章
- nginx 生成 縮圖 and 生成縮圖到硬碟Nginx硬碟
- 手機端上傳照片實現 壓縮、拖放、縮放、裁剪、合成拼圖等功能
- PbootCMS上傳縮圖擷取尺寸縮小變模糊解決方案boot
- PbootCMS 上傳縮圖擷取尺寸縮小變模糊解決方案boot
- C# 生成縮圖C#
- 前端圖片壓縮方案前端
- asp.net上傳圖片生成縮圖ASP.NET
- php圖片水印新增,壓縮,剪下的封裝類PHP封裝
- mysql壓縮解決方案MySql
- [文件教程]解決sae下文件縮圖上傳問題及外掛上傳問題
- iOS開發中壓縮圖片的質量以及縮小圖片尺寸iOS
- 【前端】壓縮圖片以及圖片相關概念前端
- python使用pillow和opencv生成圖片縮圖PythonOpenCV
- 圖片載入失敗解決方案 以及canvas即時生成提示圖片Canvas
- Android微信分享圖片按質量壓縮的解決方案Android
- 移動端圖片上傳旋轉、壓縮的解決方案
- ASP.NET C# 按原圖片大小等比例縮放生成縮圖ASP.NETC#
- 手機直播原始碼,前端圖片壓縮上傳需顧及清晰度問題原始碼前端
- android使用.9圖作為背景,內容不能居中的問題解決方案Android
- 17-檔案上傳+生成縮圖薦
- 圖片操作系列 —(1)手勢縮放圖片功能
- 40 橫豎屏切換略縮圖不能定位
- vue-element-admin 解決壓縮打包之後背景圖片不顯示問題Vue
- PbootCMS上傳圖片被壓縮怎麼解決boot
- MySQL 5.7 Window安裝手冊以及問題方案解決大全MySql
- asp.net上傳圖片並同時生成縮圖 (轉)ASP.NET
- 關於azkaban上傳job壓縮包報錯問題的解決方案
- url-loader不能處理html中引入的圖片問題的解決方案HTML
- Windows設定圖片縮圖Windows
- 圖論-有向圖縮點圖論
- 禁止web頁面縮放解決方案Web
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- 解決手機連上WIFI但不能上網的問題WiFi
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- Android 高清載入巨圖方案 拒絕壓縮圖片Android
- ios手機豎屏拍照圖片旋轉90°問題解決方法iOS
- IOS下圖片不能顯示問題的解決辦法iOS
- 前端圖片壓縮 - H5&Uni-App圖片壓縮前端H5APP