2009-05-20

[PHP] 裁切圖片並縮小至指定大小


<?php
/*
功能:裁切圖片並縮小至指定大小

參數:
$_GET['f'] 圖檔名稱:0001.jpg

$_GET['x'] 圖片裁切水平方向的起始位址(px):10
$_GET['y'] 圖片裁切垂直方向的起始位址(px):20

$_GET['w'] 圖片裁切選取的寬度(px):300
$_GET['h'] 圖片裁切選取的高度(px):200
*/

// 縮小圖片的指定大小(px)
$decreaseSize=160;


// 設定 header 中的圖片類型
header("Content-type:image/jpg");

// 檢查是否有給予圖片名稱,否則結束裁切
if (!isset($_GET['f']) || $_GET['f']==''){ exit; }

// 設定 header 中的圖片名稱
header("Content-Disposition:filename=".$_GET['f']);

// 開啟暫存目錄中的圖片
$source = @imageCreateFromJpeg("/tmp/".$_GET['f']);

if (!$source){
// 圖片開啟錯誤...
exit;
}


// 取得圖片原始寬度與高度
$sourceWidth = imagesX($source);
$sourceHeight = imagesY($source);


/* 裁切圖片 */
// 圖片選取的寬度與高度
$cropWidth = intval($_GET['w']);
$cropHeight = intval($_GET['h']);

// 檢查裁切寬度是否在範圍裡
if (!$cropWidth || $cropWidth > $sourceWidth){ // 寬度為零或超過最大寬度
$cropWidth = $sourceWidth;
}elseif ($cropWidth < $decreaseSize){ // 低於最小寬度
$cropWidth=$decreaseSize;
}

// 檢查裁切高度是否在範圍裡
if (!$cropHeight || $cropHeight > $sourceHeight){ // 高度為零或超過最大高度
$cropHeight = $sourceHeight;
}elseif ($cropHeight < $decreaseSize){ // 低於最小高度
$cropHeight = $decreaseSize;
}


// 圖片選取的起始位址
$cropX = intval($_GET['x']);
$cropY = intval($_GET['y']);

// 檢查起始位址
if ($cropX > ($sourceWidth-$cropWidth)){
$cropX = $sourceWidth-$cropWidth;
}
if ($cropY > ($sourceHeight-$cropHeight)){
$cropY = $sourceHeight-$cropHeight;
}


// 建立裁切所需要的圖片空間
$crop = imageCreateTrueColor($cropWidth, $cropHeight);

// 複製選定的圖片範圍(剪裁圖片)
imageCopy(
$crop,
$source,
0,
0,
$cropX,
$cropY,
$cropWidth,
$cropHeight
);


/*縮小圖片 */
// 計算縮圖尺寸
if ($cropWidth<$cropHeight) {
$decreaseWidth = $decreaseSize;
$decreaseHeight = intval($cropHeight*$decreaseSize/$cropWidth);
} else {
$decreaseHeight=$decreaseSize;
$decreaseWidth = intval($cropWidth*$decreaseSize/$cropHeight);
}

// 建立縮圖所需要的圖片空間
$decrease = imageCreateTrueColor($decreaseWidth, $decreaseHeight);

// 複製並縮小圖片
imageCopyResampled(
$decrease,
$crop,
0,
0,
0,
0,
$decreaseWidth,
$decreaseHeight,
$cropWidth,
$cropHeight
);


// 顯示圖片
imageJpeg($decrease);


// 關閉圖片
imageDestroy($source);
imageDestroy($crop);
imageDestroy($decrease);


相關文章:
php 圖檔上傳檢查
在固定大小的排版中做圖片選取
MooCrop 正方形選取( Square )

4 回應:

偉明 提到...

您好~我想請問個問題~
小弟想寫個PHP圖片上傳時可以同時將圖片縮小至指定的寬高(假設是照片長邊是640px),並且縮小以正方形裁切圖片中心位置(假設寬高都為100px)
是否由上面的程式碼也可以寫出來?

胡忠晞 Jax 提到...

是的!
而且你還可以在過程中製作多種尺寸的縮圖

匿名 提到...

您好 ~
我想請問您 ~
我要先縮圖再切圖可以嗎??

胡忠晞 Jax 提到...

可以的!
基本上都是對圖片類型的變數在做處理!
你可以去找尋一下 GD 相關的函數!
還有很多其她的功能可以用!