最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP圖像裁剪縮略裁切類源碼及使用方法

 更新時間:2016年01月07日 17:13:41   作者:點點點細雨  
這篇文章主要介紹了PHP圖像裁剪縮略裁切類源碼及使用方法的相關(guān)資料,需要的朋友可以參考下

最近在做網(wǎng)頁拖拽驗證碼的開源項目,需要在服務(wù)端生成圖片對應(yīng)的可移動的色塊,但是網(wǎng)上的資源都是做縮略圖,對整個圖片進行縮放的,所以自己動手,完成了對圖片進行裁剪小塊的工具

<?php
namespace App\Libs;
/**
* 2016-01-07 15:54:58
* Lixiaoyu
* 
* mode 1 : 強制裁剪,生成圖片嚴(yán)格按照需要,不足放大,超過裁剪,圖片始終鋪滿
* mode 2 : 和1類似,但不足的時候 不放大 會產(chǎn)生補白,可以用png消除。
* mode 3 : 只縮放,不裁剪,保留全部圖片信息,會產(chǎn)生補白,
* mode 4 : 只縮放,不裁剪,保留全部圖片信息,生成圖片大小為最終縮放后的圖片有效信息的實際大小,不產(chǎn)生補白
* 默認(rèn)補白為白色,如果要使補白成透明像素,請使用SaveAlpha()方法代替SaveImage()方法
*/
class ImageCrop{
var $sImage;
var $dImage;
var $src_file;
var $dst_file;
var $src_width;
var $src_height;
var $src_ext;
var $src_type;
function __construct($src_file,$dst_file=''){
$this->src_file=$src_file;
$this->dst_file=$dst_file;
$this->LoadImage();
}
function SetSrcFile($src_file){
$this->src_file=$src_file;
}
function SetDstFile($dst_file){
$this->dst_file=$dst_file;
}
function LoadImage(){
list($this->src_width, $this->src_height, $this->src_type) = getimagesize($this->src_file);
switch($this->src_type) {
case IMAGETYPE_JPEG :
$this->sImage=imagecreatefromjpeg($this->src_file);
$this->ext='jpg';
break;
case IMAGETYPE_PNG :
$this->sImage=imagecreatefrompng($this->src_file);
$this->ext='png';
break;
case IMAGETYPE_GIF :
$this->sImage=imagecreatefromgif($this->src_file);
$this->ext='gif';
break;
default:
exit();
}
}
function SaveImage($fileName=''){
$this->dst_file=$fileName ? $fileName : $this->dst_file;
switch($this->src_type) {
case IMAGETYPE_JPEG :
imagejpeg($this->dImage,$this->dst_file,100);
break;
case IMAGETYPE_PNG :
imagepng($this->dImage,$this->dst_file);
break;
case IMAGETYPE_GIF :
imagegif($this->dImage,$this->dst_file);
break;
default:
break;
}
}
function OutImage(){
switch($this->src_type) {
case IMAGETYPE_JPEG :
header('Content-type: image/jpeg');
imagejpeg($this->dImage);
break;
case IMAGETYPE_PNG :
header('Content-type: image/png');
imagepng($this->dImage);
break;
case IMAGETYPE_GIF :
header('Content-type: image/gif');
imagegif($this->dImage);
break;
default:
break;
}
}
function SaveAlpha($fileName=''){
$this->dst_file=$fileName ? $fileName . '.png' : $this->dst_file .'.png';
imagesavealpha($this->dImage, true);
imagepng($this->dImage,$this->dst_file);
}
function OutAlpha(){
imagesavealpha($this->dImage, true);
header('Content-type: image/png');
imagepng($this->dImage);
}
function destory(){
imagedestroy($this->sImage);
imagedestroy($this->dImage);
}
function Crop($dst_width,$dst_height,$mode=1,$dst_file=''){
if($dst_file) $this->dst_file=$dst_file;
$this->dImage = imagecreatetruecolor($dst_width,$dst_height);
$bg = imagecolorallocatealpha($this->dImage,255,255,255,127);
imagefill($this->dImage, 0, 0, $bg);
imagecolortransparent($this->dImage,$bg);
$ratio_w=1.0 * $dst_width / $this->src_width;
$ratio_h=1.0 * $dst_height / $this->src_height;
$ratio=1.0;
switch($mode){
case 1: // always crop
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)){
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
$src_x = (int) (($this->src_width-$tmp_w)/2) ;
$src_y = (int) (($this->src_height-$tmp_h)/2) ;
imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}else{
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
$src_x = (int)($tmp_w - $dst_width) / 2 ;
$src_y = (int)($tmp_h - $dst_height) / 2 ;
imagecopy($this->dImage, $tmp_img, 0,0,$src_x,$src_y,$dst_width,$dst_height);
imagedestroy($tmp_img);
}
break;
case 2: // only small
if($ratio_w < 1 && $ratio_h < 1){
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
$src_x = (int) ($this->src_width-$tmp_w)/2 ;
$src_y = (int) ($this->src_height-$tmp_h)/2 ;
imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}elseif($ratio_w > 1 && $ratio_h > 1){
$dst_x = (int) abs($dst_width - $this->src_width) / 2 ;
$dst_y = (int) abs($dst_height -$this->src_height) / 2;
imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
}else{
$src_x=0;$dst_x=0;$src_y=0;$dst_y=0;
if(($dst_width - $this->src_width) < 0){
$src_x = (int) ($this->src_width - $dst_width)/2;
$dst_x =0;
}else{
$src_x =0;
$dst_x = (int) ($dst_width - $this->src_width)/2;
}
if( ($dst_height -$this->src_height) < 0){
$src_y = (int) ($this->src_height - $dst_height)/2;
$dst_y = 0;
}else{
$src_y = 0;
$dst_y = (int) ($dst_height - $this->src_height)/2;
}
imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,$src_x,$src_y,$this->src_width,$this->src_height);
}
break;
case 3: // keep all image size and create need size
if($ratio_w > 1 && $ratio_h > 1){
$dst_x = (int)(abs($dst_width - $this->src_width )/2) ;
$dst_y = (int)(abs($dst_height- $this->src_height)/2) ;
imagecopy($this->dImage, $this->sImage, $dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
}else{
$ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
$dst_x = (int)(abs($tmp_w -$dst_width )/2) ;
$dst_y = (int)(abs($tmp_h -$dst_height)/2) ;
imagecopy($this->dImage, $tmp_img, $dst_x,$dst_y,0,0,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}
break;
case 4: // keep all image but create actually size
if($ratio_w > 1 && $ratio_h > 1){
$this->dImage = imagecreatetruecolor($this->src_width,$this->src_height);
imagecopy($this->dImage, $this->sImage,0,0,0,0,$this->src_width,$this->src_height);
}else{
$ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$this->dImage = imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($this->dImage,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
}
break;
}
}// end Crop
/**
*
* 裁切方法
* 2016-01-07 15:05:44
* Lixiaoyu
*
* @param $dst_width 目標(biāo)長
* @param $dst_height 目標(biāo)高
* @param $dst_x 裁剪部分和原圖左側(cè)的距離
* @param $dst_y 裁剪部分和原圖右側(cè)的距離
* @param int $mode 模式
* @param string $dst_file 目標(biāo)文件路徑
*/
function Cut($dst_width,$dst_height,$dst_x,$dst_y,$dst_file='')
{
if ($dst_file) $this->dst_file = $dst_file; //設(shè)置目標(biāo)文件位置
$this->dImage = imagecreatetruecolor($dst_width, $dst_height); //創(chuàng)建了目標(biāo)文件的大小的畫布
$bg = imagecolorallocatealpha($this->dImage, 255, 255, 255, 127); //給畫布分配顏色
imagefill($this->dImage, 0, 0, $bg); //給圖像用顏色進行填充
imagecolortransparent($this->dImage, $bg); //背景定義成透明色
$ratio_w = 1.0 * $dst_width / $this->src_width; //橫向縮放的比例
$ratio_h = 1.0 * $dst_height / $this->src_height; //縱向縮放的比例
//var_dump($this);
//不進行縮放,直接對圖像進行裁剪
$ratio = 1.0;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img = imagecreatetruecolor($dst_width, $dst_height); //創(chuàng)建暫時保存的畫布
imagecopy($tmp_img, $this->sImage, 0,0,$dst_x,$dst_y,$dst_width,$dst_height); //拷貝出圖像的一部分,進行裁切
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h); //把暫時緩存的圖片,放到目標(biāo)文件里面
imagedestroy($tmp_img);
}
}
?>

Use

裁剪圖像

$ic=new ImageCrop($pathToFile,'./pic/afterCrop'.time().'.jpg');
$ic->Cut(40,30,120,130);
$ic->SaveImage();
//$ic->SaveAlpha();將補白變成透明像素保存
$ic->destory();

實現(xiàn)效果

原圖

原圖

裁剪之后的圖

裁剪之后的圖

縮放圖像

原圖

原圖

縮略圖

縮略圖

本文重點在于使用圖像處理函數(shù) imagecopy 和 imagecopyresampled

bool imagecopy ( resource dstim,resourcesrc_im , int dstx,intdst_y , int srcx,intsrc_y , int srcw,intsrc_h )
將 src_im 圖像中坐標(biāo)從 src_x,src_y 開始,寬度為 src_w,高度為 src_h 的一部分拷貝到 dst_im 圖像中坐標(biāo)為 dst_x 和 dst_y 的位置上。

相關(guān)文章

  • php隨機輸出名人名言的代碼

    php隨機輸出名人名言的代碼

    正如你看到的“小談博客”標(biāo)題后面的名人名言一樣,每刷新一次就會隨機出現(xiàn)一條語句,把你喜歡的話放到一起,經(jīng)常出現(xiàn)在你眼前,給你溫暖的力量
    2012-10-10
  • thinkphp配置連接數(shù)據(jù)庫技巧

    thinkphp配置連接數(shù)據(jù)庫技巧

    這篇文章主要介紹了thinkphp配置連接數(shù)據(jù)庫技巧,實例講述了ThinkPHP入口同目錄下配置數(shù)據(jù)庫及控制器另外連接數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2014-12-12
  • ThinkPHP文件緩存類代碼分享

    ThinkPHP文件緩存類代碼分享

    本文給大家分享的是取自ThinkPHP中的關(guān)于文件緩存類的代碼,非常的實用,效率也非常不錯,這里推薦給大家,有需要的小伙伴參考下。
    2015-04-04
  • PHP微信開發(fā)之查詢城市天氣

    PHP微信開發(fā)之查詢城市天氣

    這篇文章主要為大家詳細介紹了PHP微信開發(fā)之簡單實現(xiàn)查詢城市天氣的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • php 偽造ip以及url來路信息方法匯總

    php 偽造ip以及url來路信息方法匯總

    本文匯總了一些關(guān)于php來路偽造,頁面抓取等相關(guān)技術(shù)的資料,非常的全面,非常的詳盡,有需要的小伙伴自己從中選取吧。
    2014-11-11
  • PHP模板引擎Smarty內(nèi)建函數(shù)詳解

    PHP模板引擎Smarty內(nèi)建函數(shù)詳解

    這篇文章主要介紹了PHP模板引擎Smarty內(nèi)建函數(shù)用法,結(jié)合實例形式分析了smarty中常見的內(nèi)建函數(shù)功能,定義與使用方法,需要的朋友可以參考下
    2016-04-04
  • 解決在Laravel 中處理OPTIONS請求的問題

    解決在Laravel 中處理OPTIONS請求的問題

    今天小編就為大家分享一篇解決在Laravel 中處理OPTIONS請求的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • thinkPHP5框架中widget的功能與用法詳解

    thinkPHP5框架中widget的功能與用法詳解

    這篇文章主要介紹了thinkPHP5框架中widget的功能與用法,結(jié)合實例形式分析了thinkPHP5中Widget相關(guān)概念、使用方法及操作注意事項,需要的朋友可以參考下
    2018-06-06
  • php 文件上傳實例代碼

    php 文件上傳實例代碼

    php 文件上傳實例代碼,php中上傳文件就比asp的容易多了,代碼量比較少
    2012-04-04
  • Yii Framework框架使用PHPExcel組件的方法示例

    Yii Framework框架使用PHPExcel組件的方法示例

    這篇文章主要介紹了Yii Framework框架使用PHPExcel組件的方法,結(jié)合實例形式分析了Yii Framework框架中PHPExcel組件的下載、導(dǎo)入、調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07

最新評論

四子王旗| 米脂县| 广州市| 浦北县| 陆河县| 米脂县| 都兰县| 珠海市| 沁源县| 白沙| 馆陶县| 宜都市| 京山县| 正阳县| 新郑市| 南昌县| 云梦县| 涿鹿县| 西吉县| 河间市| 大英县| 上栗县| 林芝县| 沭阳县| 黄大仙区| 绥江县| 镇巴县| 汤原县| 金沙县| 南宫市| 沁阳市| 荣昌县| 铁岭市| 布拖县| 枣强县| 旌德县| 农安县| 泌阳县| 辽阳县| 青田县| 当涂县|