2009-09-23 2 views
0

У меня есть форма для загрузки изображений, пользователь прикрепляет файл прицеливания и выбирает размер изображения для изменения размера загруженного файла изображения (200kb, 500kb, 1mb, 5mb, Original). Затем мой сценарий должен изменить размер файла изображения на основе дополнительного размера пользователя, но я не уверен, как реализовать эту функцию,Как изменить размер файла изображения на дополнительные размеры

Например, пользователь загружает изображение с размером 1 МБ, и если пользователь выбирает размер 200 КБ для изменения размера, скрипт должен сохранить его с размером 200 КБ.

Кто-нибудь знает или имеет опыт работы по аналогичной задаче?

Спасибо за ответ.

ответ

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); 
?> 

Edit: Если вы хотите изменить размер файла изображения до определенного размера, это немного сложнее. Все основные форматы изображений используют коэффициент сжатия и сжатия, который зависит от характера сжатия. Сжатие чистого голубого неба, и вы получите лучший коэффициент сжатия, чем у вас будет море людей.

Лучшее, что вы можете сделать, это попробовать определенный размер, попробовать определенный размер и посмотреть, какой размер файла, при необходимости отрегулировать.

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

+0

Благодарим вас за полезные комментарии. – taras

+0

@ dcrosta: совершенно правильно. Исправлено в mltiply по sqrt (ratio). – cletus

2

Использование библиотеки GD, представленную в PHP:

// $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

Я хотел изменить размер файла изображения, а не сам размер изображения, например, пользователь загружает изображение с размером 1 МБ, и если пользователь выбирает размер 200 КБ для изменения размера, тогда мой скрипт должен сохранить его с размером 200 КБ. – taras

+0

, как и другой ответ, если нет определенного ответа о том, какой размер файла он будет после сохранения. – mauris

Смежные вопросы