Работа с графическими функциями в Php
У меня такой вопрос хочу сделать скрипт который бы уменьшал загружаемые фотографии до нужного размера в байтах
вот например создаю изображение из файла
$org=ImageCreateFromJpeg($rfile);
$w_src = imagesx($org);
$h_src = imagesy($org);
далее создаю уменьшенную копию
$w_cop=$w_src-50; $h_cop=$h_src-50;
$cop=imagecreatetruecolor($w_cop,$h_cop);
уменьшаю изображение
imagecopyresampled($cop, $org, 0, 0, 0, 0, $w_cop, $h_cop,$w_src ,$h_src );
А вот вопрос как узнать размер копии $cop в байтах
Цитата:
Originally posted by supergis
А вот вопрос как узнать размер копии $cop в байтах
А вот вопрос как узнать размер копии $cop в байтах
Много. В памяти - это рисунок BMP. Зачем нужно знать его размер, если вывод будет всё-равно в jpg, gif или png?
И я так понимаю что придёться уменьшать записывать в файл смотреть размер если большой то всё по кругу ??
Цитата:
Originally posted by supergis
Просто у меня есть фотогаллерея, но я не хочу чтобы закачивали рисунки более 100Кб,
И я так понимаю что придёться уменьшать записывать в файл смотреть размер если большой то всё по кругу ??
Просто у меня есть фотогаллерея, но я не хочу чтобы закачивали рисунки более 100Кб,
И я так понимаю что придёться уменьшать записывать в файл смотреть размер если большой то всё по кругу ??
Стоп! А при чём тут графика? Размер закачиваемого файла узнаётся с помощью filesize()
Например мне в галлерею закачали фото размером 600Кб, а я хочу уменьшить фото чтобы оно занимало 100Кб и сохранить уменьшенный вариант.
Цитата:
Originally posted by supergis
Например мне в галлерею закачали фото размером 600Кб, а я хочу уменьшить фото чтобы оно занимало 100Кб и сохранить уменьшенный вариант.
Например мне в галлерею закачали фото размером 600Кб, а я хочу уменьшить фото чтобы оно занимало 100Кб и сохранить уменьшенный вариант.
Ну, тогда да: записывать, проверять размер, и если не подходит - сжимать ещё и вновь записывать и проверять.
Т.е., примерно такая конструкция:
Код:
$quality = 100;
while(filesize($filename)>102400){
imagejpeg($img, $filename, $quality--);
}
/*
Где $quality - качество сжатия JPEG, $filename - имя файла, куда всё это записывается, $img - дескриптор записываемого изображения.
*/
while(filesize($filename)>102400){
imagejpeg($img, $filename, $quality--);
}
/*
Где $quality - качество сжатия JPEG, $filename - имя файла, куда всё это записывается, $img - дескриптор записываемого изображения.
*/
2. Попробовал твой цикл у меня значение
filesize($filename)
почему то не изменяется.
3. Еще я пробовал так
Но размер значение
filesize($filename)
почему то то же не изменяется.
Код:
$s_umen=50;
$w_src = imagesx($img);
$h_src = imagesy($img);
$ppr=$h_src/$w_src;
while(filesize($filename)>102400){
$w_cop=$w_src-$s_umen; $h_cop=round($w_cop*$ppr);
$cop=imagecreatetruecolor($w_cop,$h_cop);
imagecopyresampled($cop, $img, 0, 0, 0, 0, $w_cop,$h_cop,$w_src ,$h_src );
imageJpeg($cop,$filename);
$s_umen=$s_umen+50;
}
$w_src = imagesx($img);
$h_src = imagesy($img);
$ppr=$h_src/$w_src;
while(filesize($filename)>102400){
$w_cop=$w_src-$s_umen; $h_cop=round($w_cop*$ppr);
$cop=imagecreatetruecolor($w_cop,$h_cop);
imagecopyresampled($cop, $img, 0, 0, 0, 0, $w_cop,$h_cop,$w_src ,$h_src );
imageJpeg($cop,$filename);
$s_umen=$s_umen+50;
}
Код:
ob_start();
imagejpeg($img, null, $quality);
$filesize = ob_get_length();
ob_end_clean();
imagejpeg($img, null, $quality);
$filesize = ob_get_length();
ob_end_clean();
Т.е., создаём буфер, в нём и будет сжатый в jpeg рисунок. проверяем размер буфера, не забыв его потом уничтожить. В конце-концов, если размерчик удовлетворяет - записываем в файл.
но если использовать
Код:
imagejpeg($img, null, 100);
то размер файла выдаёт больше оригинала , а если
Код:
imagejpeg($img, null);
то наоборот маленькое число ?
Цитата:
Originally posted by supergis
Вообщем кажется работает,
но если использовать
то размер файла выдаёт больше оригинала , а если
то наоборот маленькое число ?
Вообщем кажется работает,
но если использовать
Код:
imagejpeg($img, null, 100);
то размер файла выдаёт больше оригинала , а если
Код:
imagejpeg($img, null);
то наоборот маленькое число ?
Ну, ты инструкцию к imagejpeg читал? Опциональное число (в данном случае - 100) - это сжатие. Т.е., 100 - это практически без сжатия. Конечно будет больше оригинала. А если сжатие не указывать - дефолтом там 75.
Код:
imagejpeg($img, null, 75);
Всё работаем, качество нормальное.
СПАСИБО за помощь.