2009-09-23 137 views
0

我有圖像上傳表單,用戶附加aimage文件,並選擇圖像大小來調整上傳的圖像文件(200kb,500kb,1mb,5mb,原始大小)。然後我的腳本需要根據用戶的可選尺寸調整圖像文件的大小,但我不知道如何實現這個功能,例如,用戶上傳一個1mb大小的圖像,如果用戶選擇200KB調整大小,那麼我的腳本應該保存200kb的大小。如何將圖像文件大小調整爲可選大小

有誰知道或有類似任務的經驗嗎?

感謝你提前回復。

回答

5

隨着GD library,使用imagecopyresampled()

<?php 
// The file 
$filename = 'test.jpg'; 
$percent = 0.5; 

// Content type 
header('Content-type: image/jpeg'); 

// Get new dimensions 
list($width, $height) = getimagesize($filename); 
$new_width = $width * $percent; 
$new_height = $height * $percent; 

// Resample 
$image_p = imagecreatetruecolor($new_width, $new_height); 
$image = imagecreatefromjpeg($filename); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

// Output 
imagejpeg($image_p, null, 100); 
?> 

編輯:如果你想將圖像文件的大小調整爲指定大小,這是一個有點困難。所有主要的圖像格式都使用不同的壓縮率和壓縮率。壓縮清澈的藍天,你會得到比人們更好的壓縮比。

,你能做的就是盡力特定的尺寸最好是嘗試一個特定的大小和查看文件大小是什麼,如果有必要調整。

Resize ratio = desired file size/actual file size 
Resize multipler = square root (resize ratio) 
New height = resize multiplier * actual height 
New width = resize multiplier * actual width 

這基本上是預期壓縮比的近似值。我希望你會有一些寬容(如+/- 5%),你可以根據需要調整數字。

還有就是要調整到一個特定的文件大小沒有直接的方法。最後我會補充說,調整大小到一個特定的文件大小是非常不尋常的。調整到特定的高度和/或寬度(保持寬高比)比用戶更常見和預期(用戶)。

更新:正確指出,這會導致文件大小錯誤。該比率需要是文件大小比率的平方根,因爲您應用了兩次(一次爲高度,一次爲寬度)。

+0

最終你會用一半的文件你想要的大小,因爲小數部分「調整率」被平方。如果你有一個1MB的圖像,你想要一個(大約)512KB的文件,你需要調整它的大小,以便newheight = sqrt(2)* height(同樣適用於寬度) – dcrosta 2009-09-23 03:39:27

+0

謝謝你的有用評論 – taras 2009-09-23 03:39:50

+0

@dcrosta:很對。固定爲sqtiply(比例)。 – cletus 2009-09-23 03:44:44

2

使用在PHP提供的GD庫:

// $img is the image resource created by opening the original file 
// $w and $h is the final width and height respectively. 
$width = imagesx($img);$height = imagesy($img); 
$ratio = $width/$height; 

if($ratio > 1){ 
// width is greater than height 
$nh = $h; 
$nw = floor($width * ($nh/$height)); 
}else{ 
$nw = $w; 
$nh = floor($height * ($nw/$width)); 
} 

//centralize image 
$nx = floor(($nw- $w)/2.0); 
$ny = floor(($nh-$h)/2.0); 

$tmp2 = imagecreatetruecolor($nw,$nh); 
imagecopyresized($tmp2, $img,0,0,0,0,$nw,$nh,$width,$height); 

$tmp = imagecreatetruecolor($w,$h); 
imagecopyresized($tmp, $tmp2,0,0,$nx,$ny,$w,$h,$w,$h); 

imagedestroy($tmp2);imagedestroy($img); 

imagejpeg($tmp, $final_file); 

這段代碼將原始圖像時,調整到規定的尺寸。它會首先嚐試比例方面調整圖像大小,然後裁剪+集中圖像,使其很好地落入指定的尺寸。

+0

我的意思是調整圖像文件大小,而不是圖像大小本身,例如,用戶上傳一個1mb大小的圖像,如果用戶選擇200KB調整大小,那麼我的腳本應該保存200kb的大小。 – taras 2009-09-23 03:18:34

+0

像其他答案一樣,如果沒有確定的答案,它會保存多少文件大小。 – mauris 2009-09-23 03:54:05

相關問題