php常用圖片處理類

来源:http://www.cnblogs.com/shouce/archive/2016/03/16/5282013.html
-Advertisement-
Play Games


<?php 
/*已知問題:1.在圖片縮放功能中,使用imagecreatetruecolor函數創建畫布,並使用透明處理演算法,但PNG格式的圖片無法透明。用imagecreate函數創建畫布可以解決這個問題,但是縮放出來的圖片色數太少了 
* 
* 
*type值: 
* (1):代表使用圖片縮放功能,此時,$value1代表縮放後圖片的寬度,$value2代表縮放後圖片的高度 
* (2):代表使用圖片裁剪功能,此時,$value1代表裁剪開始點的坐標,例:從原點開始即是“0,0”前面是x軸後面是y軸,中間用,分隔,$value2代表裁剪的寬度和高度,同樣也是“20,20”的形式使用 
* (3):代表使用加圖片水印功能,此時,$value1代表水印圖片的文件名,$value2代表水印在圖片中的位置,有10值個可以選,1代表左上,2代表左中,3代表左右,4代表中左,5代表中中,6代表中右,7代表下做,8代表下中,9代表下右,0代表隨機位置 
* 
*/ 
class image{ 
private $types; //使用的功能編號,1為圖片縮放功能 2為圖片裁剪功能 3,為圖片加圖片水印功能 
private $imgtype;//圖片的格式 
private $image; //圖片資源 
private $width;//圖片寬度 
private $height;//圖片高度 
private $value1;//根據所傳type值的不同,$value1分別代表不同的值 
private $value2;//根據所傳type值的不同,$value2分別代表不同的值 
private $endaddress;//輸出後的地址+文件名 
function __construct($imageaddress, $types, $value1="", $value2="", $endaddress){ 
$this->types=$types; 
$this->image=$this->imagesources($imageaddress); 
$this->width=$this->imagesizex(); 
$this->height=$this->imagesizey(); 
$this->value1=$value1; 
$this->value2=$value2; 
$this->endaddress=$endaddress; 
} 
function outimage(){ //根據傳入type值的不同,輸出不同的功能 
switch($this->types){ 
case 1: 
$this->scaling(); 
break; 
case 2: 
$this->clipping(); 
break; 
case 3: 
$this->imagewater(); 
break; 
default: 
return false; 
} 
} 
private function imagewater(){ //http://www.hzhuti.com 加圖片水印功能 
//用函數獲取水印文件的長和寬 
$imagearrs=$this->getimagearr($this->value1); 
//調用函數計算出水印載入的位置 
$positionarr=$this->position($this->value2, $imagearrs[0], $imagearrs[1]); 
//加水印 
imagecopy($this->image, $this->imagesources($this->value1), $positionarr[0], $positionarr[1], 0, 0, $imagearrs[0], $imagearrs[1]); 
//調用輸出方法保存 
$this->output($this->image); 
} 
private function clipping(){ //圖片裁剪功能 
//將傳進來的值分別賦給變數 
list($src_x, $src_y)=explode(",", $this->value1); 
list($dst_w, $dst_h)=explode(",", $this->value2); 
if($this->width < $src_x+$dst_w || $this->height < $src_y+$dst_h){ //這個判斷就是限制不能截取到圖片外面去 
return false; 
} 
//創建新的畫布資源 
$newimg=imagecreatetruecolor($dst_w, $dst_h); 
//進行裁剪 
imagecopyresampled($newimg, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $dst_w, $dst_h); 
//調用輸出方法保存 
$this->output($newimg); 
} 
private function scaling(){ //圖片縮放功能 
//獲取等比縮放的寬和高 
$this-> proimagesize(); 
//根據參數進行縮放,並調用輸出函數保存處理後的文件 
$this->output($this->imagescaling()); 
} 
private function imagesources($imgad){ //獲取圖片類型並打開圖像資源 
$imagearray=$this->getimagearr($imgad); 
switch($imagearray[2]){ 
case 1://gif 
$this->imgtype=1; 
$img=imagecreatefromgif($imgad); 
break; 
case 2://jpeg 
$this->imgtype=2; 
$img=imagecreatefromjpeg($imgad); 
break; 
case 3://png 
$this->imgtype=3; 
$img=imagecreatefrompng($imgad); 
break; 
default: 
return false; 
} 
return $img; 
} 
private function imagesizex(){ //獲得圖片寬度 
return imagesx($this->image); 
} 
private function imagesizey(){ //獲取圖片高度 
return imagesy($this->image); 
} 
private function proimagesize(){ //計算等比縮放的圖片的寬和高 
if($this->value1 && ($this->width < $this->height)) { //等比縮放演算法 
$this->value1=round(($this->value2/ $this->height)*$this->width); 
}else{ 
$this->value2=round(($this->value1/ $this->width) * $this->height); 
} 
} 
private function imagescaling(){//圖像縮放功能,返回處理後的圖像資源 
$newimg=imagecreatetruecolor($this->value1, $this->value2); 
$tran=imagecolortransparent($this->image);//處理透明演算法 
if($tran >= 0 && $tran < imagecolorstotal($this->image)){ 
$tranarr=imagecolorsforindex($this->image, $tran); 
$newcolor=imagecolorallocate($newimg, $tranarr['red'], $tranarr['green'], $tranarr['blue']); 
imagefill($newimg, 0, 0, $newcolor); 
imagecolortransparent($newimg, $newcolor); 
} 
imagecopyresampled($newimg, $this->image, 0, 0, 0, 0, $this->value1, $this->value2, $this->width, $this->height); 
return $newimg; 
} 
private function output($image){//輸出圖像 
switch($this->imgtype){ 
case 1: 
imagegif($image, $this->endaddress); 
break; 
case 2: 
imagejpeg($image, $this->endaddress); 
break; 
case 3: 
imagepng($image, $this->endaddress); 
break; 
default: 
return false; 
} 
} 
private function getimagearr($imagesou){//返回圖像屬性數組方法 
return getimagesize($imagesou); 
} 
private function position($num, $width, $height){//根據傳入的數字返回一個位置的坐標,$width和$height分別代表插入圖像的寬和高 
switch($num){ 
case 1: 
$positionarr[0]=0; 
$positionarr[1]=0; 
break; 
case 2: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=0; 
break; 
case 3: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=0; 
break; 
case 4: 
$positionarr[0]=0; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 5: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 6: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 7: 
$positionarr[0]=0; 
$positionarr[1]=$this->height-$height; 
break; 
case 8: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=$this->height-$height; 
break; 
case 9: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=$this->height-$height; 
break; 
case 0: 
$positionarr[0]=rand(0, $this->width-$width); 
$positionarr[1]=rand(0, $this->height-$height); 
break; 
} 
return $positionarr; 
} 
function __destruct(){ 
imagedestroy($this->image); 
} 
} 
?>

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • github實戰彙總:http://www.cnblogs.com/dunitian/p/5038719.html 創建一個用戶名.github.io的倉庫 選擇設置頁面風格 頁面基本信息 選擇一個你喜歡的風格 訪問用戶名.github.io 以後你直接添加文件到本地庫然後推送到遠程就可以了 ~eg
  • Please enter a commit message to explain why this merge is necessary. 請輸入提交消息來解釋為什麼這種合併是必要的 git 在pull或者合併分支的時候有時會遇到這個界面。可以不管(直接下麵3,4步),如果要輸入解釋的話就需要: 1
  • 恢復內容開始 一、ACTIVEX及其相關概念 使用 WindowsFormsHost 元素可將 Windows Forms控制項放置到 WPF 元素或頁面中。 若要在 Windows Forms控制項或窗體中承載 WPF 元素,使用 ElementHost控制項         System.Wind
  • String 字元串常量StringBuffer 字元串變數(線程安全)StringBuilder 字元串變數(非線程安全) 簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等
  • 設置frame的scrolling="yes",在右側頁面的body裡加入: style="overflow-x:hidden;"  如:<body style="overflow-x:hidden;">
  •   添加→ 方法參數中有一個有關添加視圖模型類型的形參,比如vm→ 根據vm的某個屬性,比如Name判斷在上下文中是否存在,如果不存在就拋EntityNotFoundException異常→ 判斷vm所依賴的外鍵那對應的那個實體是否存在,比如vm中有各PoductCategoryId外鍵,就判斷下上
  • 字元串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字元串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。 decode的作用是將其他編碼的字元串轉換成unicode編碼,如str1
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...