|
|
|
| у softtime на сайт есть хор фотогаллерея в которой с помощью util.php создаются уменьшеные комии изображения. те говоришь resizeimg($image, $smallimage, 160, 240) и он создается изображение с h и w близкими к 160 и 240 близкими потомучто сохраняются пропорции исходного снимка.
if ($ratio<$src_ratio)
{
$h = $w/$src_ratio;
}
else
{
$w = $h*$src_ratio;
}
|
, а если пропорции НЕ сохранять то уменьшная копия получается или вытянута или растянута.
как сделать чтобы уменьшеное изображение не было растянутым, но w и h было таким каким я его задаю, (160, 240) к примеру. | |
|
|
|
|
|
|
|
для: vrazbros
(25.11.2007 в 21:52)
| |
<?
$h = $_GET['height'];
$w = $_GET['width'];
?>
|
или то же самое, только POST -ом, всё зависит от того, что вам больше нравиться
и плюс ещё не помешает в таком случае проверка эти переменных на правильность значений, например, чтобы избежать ошибок при введении текста вместо цифр | |
|
|
|
|
|
|
|
для: retsoul
(25.11.2007 в 22:07)
| | я про другое. как написать функцию которая будет уменьшать изображения до заданных параметров ?
теоритические можно использовать функцию resizeimg() из прикрепленного файла, но она сохраняет пропорции оригинального изображ и результате размеры уменьшенной копии зависят от оригинала.
А я хочу например уменьшить картинку 1024x768 и получить 160x240, или 1500x700 и получить 160x240 ) ктонить сталкивался с такой проблемой ? | |
|
|
|
|
|
|
|
для: vrazbros
(25.11.2007 в 22:41)
| | всё просто:
берёшь 2 переменные, с теми значениями, которые тебе нужны и вставляешь их в том месте, где идёт определение пропорции, то есть, вместо пропорциональных значений применяешь свои
при таком подходе есть один недостаток - придётся проверять ширину и высоту исходного рисунка, чтобы не получить вместо вытянутого рисунка - сплющенный | |
|
|
|
|
|
|
|
для: retsoul
(25.11.2007 в 22:47)
| | так я так и делаю и уменьшенное изображение получается сплющенным. | |
|
|
|
|
|
|
|
для: vrazbros
(25.11.2007 в 22:55)
| | тогда вставьте проверку и взавизимости от пропорций исходного изображения меняйте значения h и w | |
|
|
|
|
|
|
|
для: retsoul
(25.11.2007 в 23:01)
| | это 1 проблема, такой вариант я тоже пробовал, проверку использовал (см 1 пост) исходное изображение выглядит нормально, но в этом случаи его размеры зависят от оригинала, а мне нужно чтобы не зависели. | |
|
|
|
|
|
|
|
для: vrazbros
(25.11.2007 в 23:30)
| | да, но я предлагал использовать при этом свои размеры, а соответственно - проверка должна возвращать ваши $w и $h, а не вычислять их из размеров исходного изображения, просто при проверке определяете, куда ставить 190px, а куда 240px
Допустим:
$a - ширина исходного изображения
$b - высота исходного изображения
$h =190;
$w = 240;
тогда:
если ($a > $b) {
$h =190;
$w = 240;
}
иначе {
$h = 240;
$w =190;
}
|
| |
|
|
|
|
|
|
|
для: vrazbros
(25.11.2007 в 21:52)
| | Я сейчас тоже как раз над этим голову ломаю.
В своё время я где-то видел неработающую функцию, где описывался примерный алгоритм переразмеривания изображений.
В обобщении того, что помню и до чего сам додумался имеем:
1. Изображения бывают 3-х типов: а) вытянутые вертикально, б) вытянутые горизонтально, в) квадратные - частный случай.
2. Основная часть большинства изображений приходится на их центр. Однако в большинстве фотографий центр смещён выше абсолютного центра.
Отсюда имеем, что для создания горизонтально вытянутых пресьюшек...
а) в большинстве вертикальных изображений допустимо отрезать до 10% слева и справа, до 10% сверху, до 40% снизу.
б) с горизонтальными изображениями проще: примерно 15% слева и справа. около 5 % всерху, и до 15 % снизу.
в) в квадратных изображениях некий гибрид: по 5% слева и справа, 5% сверху, до 20 % снизу.
... это примерно от фонаря взято путём мозгового штурма проблемы и анализа имеющихся фоток.
Собственно, функция почти готова:
function create_preview ($original_file, $preview_file, $pre_width, $pre_height)
{
// функция, создающая превью-файл
// $original_file - полный путь к оригинальному (входящему) файлу
// $preview_file - полный путь на создаваемый (выходящий) файл
// $pre_width - ширина создаваемого файла
// $pre_height - высота создаваемого файла
// определяем размер (коэффициент соотношения сторон) будущего изображения
$ratio = $pre_width / $pre_height;
// извлекаем массив, содержащий параметры оригинального (входного) изображения
// где элементы [0] - ширина, [1] - высота этого изображения
$size_img = getimagesize($original_file);
// определяем размер (коэффициент соотношения сторон) оригинального изображения
$orig_ratio = $size_img[0] / $size_img[1];
// создаём пустое изображение по заданным параметрам будущего изображения
$pre_img = imagecreatetruecolor($pre_width, $pre_height);
// создаём jpeg-изображение из файла оригинала
$orig_img = imagecreatefromjpeg($original_file);
/************************************************************************
** А ЗДЕСЬ НАДО ПРИДУМАТЬ МАТЕМАТИКУ
**
** то есть придумать, СКОЛЬКО НАДО ОТКУДА ОТРЕЗАТЬ
**
************************************************************************/
// cut_left - отрезать слева от оригинала (в пикселях)
// cut_right - отрезать справа от оригинала (в пикселях)
// cut_top - отрезать сверху от оригинала (в пикселях)
// cut_bottom - отрезать снизу от оригинала (в пикселях)
imagecopyresampled($pre_img, $orig_img, 0, 0, $cut_left, $cut_top, $pre_width, $pre_height, ($size_img[0] - $cut_right), ($size_img[1] - $cut_bottom));
// сохраняем уменьшенную копию ориг. файа в файл-превью
imagejpeg($pre_img, $preview_file);
// очищаем память от временных (созданных нами) изображений
imagedestroy($pre_img);
imagedestroy($orig_img);
// конец функции
}
// инициализируем функцию (мои превьюшки размером 150х90)
create_preview ($original_file, $preview_file, 150, 90);
|
Добавлю, что математика должна быть построена так, чтобы ОТРЕЗАННОЕ оригинальное изображение стало пропорционально будущему превью-изображению.
Причём: по идее, надо разработать какой-то коэффициент отрезания, чтобы (если не понравится превьюшка) можно было его просто увеличить или уменьшить и пересоздать превью
У меня наступило отупение, потому математику придумать уже не в состоянии. Придумайте кто-нть, пожалуйста :)
P.S.: Функцию создавал на основе той, что представлена здесь: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=41788 | |
|
|
|