Как изменить размер файла изображения на дополнительные размеры

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

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

Может кто знает или имеет опыт решения подобной задачи?

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


person taras    schedule 23.09.2009    source источник


Ответы (2)


С библиотекой GD используйте 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%), и вы сможете настроить числа по мере необходимости.

Нет прямого способа изменить размер до определенного размера файла. Наконец, я добавлю, что изменение размера файла до определенного размера довольно необычно. Изменение размера до определенной высоты и/или ширины (с сохранением соотношения сторон) гораздо более распространено и ожидаемо (пользователями).

Обновление: как правильно указано, это дает неправильный размер файла. Соотношение должно быть квадратным корнем из соотношений размеров файлов, поскольку вы применяете его дважды (один раз по высоте, один раз по ширине).

person cletus    schedule 23.09.2009
comment
В итоге вы получите файлы вдвое меньшего размера, чем вы хотите, поскольку коэффициент изменения размера дробного компонента возводится в квадрат. Если у вас есть изображение размером 1 МБ и вам нужен файл (примерно) 512 КБ, вы хотите изменить его размер так, чтобы newheight = sqrt (2) * высота (аналогично для ширины) - person dcrosta; 23.09.2009
comment
Спасибо за ваши полезные комментарии - person taras; 23.09.2009

Используя библиотеку 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);

Этот фрагмент кода возьмет исходное изображение и изменит его размер до указанных размеров. Сначала он попытается изменить соотношение сторон изображения, а затем обрезать + централизовать изображение, чтобы оно соответствовало указанным размерам.

person mauris    schedule 23.09.2009
comment
я имел в виду изменить размер файла изображения, а не сам размер изображения, например, пользователь загружает изображение размером 1 МБ, и если пользователь выбирает 200 КБ для изменения размера, то мой скрипт должен сохранить его с размером 200 КБ. - person taras; 23.09.2009
comment
как и другой ответ, если нет однозначного ответа, какого размера файл будет после сохранения. - person mauris; 23.09.2009