Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка картинок и создание уменьшенной копии
 
 автор: Zilog   (03.10.2007 в 14:55)   письмо автору
 
 

Товарищи, подскажите чанику, как сделать уменьшенную копию хорошего качества?
Сейчас делаю так:


    $img_width = ImageSX($src);
    $img_height = ImageSY($src);
    $img_new_width = $width;
    $img_new_height = ($img_height/100)*($img_new_width/($img_width/100));
    $img_dest = ImageCreateTrueColor($img_new_width,$img_new_height);
    imagefill($img_dest, 0, 0, imagecolorallocate($img_dest, 255,255,255));
    ImageCopyResized($img_dest, $src, 0, 0, 0, 0, $img_new_width, $img_new_height, $img_width, $img_height);
    ImageJpeg($img_dest, $dest_file, 100); 
    ImageDestroy($src);
    ImageDestroy($img_dest); 


и уменьшенная копия сильно страдает в качестве, несмотря на то, что коэффицент качества при создании jpeg = 100.

Подсоветуйте что нибудь, пожалуйста.

   
 
 автор: Night_charter   (03.10.2007 в 16:51)   письмо автору
 
   для: Zilog   (03.10.2007 в 14:55)
 

Пользуюсь этим скриптом:

<? 
function resizeimg($filename$smallimage$w$h

// Имя файла с масштабируемым изображением 
$filename "userfotos/".$filename
// Имя файла с уменьшенной копией. 
$smallimage "userfotos/".$smallimage
// определим коэффициент сжатия изображения, которое будем генерить 
$ratio $w/$h
// получим размеры исходного изображения 
$size_img getimagesize($filename); 
// Если размеры меньше, то масштабирования не нужно 
if (($size_img[0]<$w) && ($size_img[1]<$h)) return true
// получим коэффициент сжатия исходного изображения 
$src_ratio=$size_img[0]/$size_img[1]; 

// Здесь вычисляем размеры уменьшенной копии, чтобы при масштабировании сохранились 
// пропорции исходного изображения 
if ($ratio<$src_ratio

$h $w/$src_ratio

else 

$w $h*$src_ratio

// создадим пустое изображение по заданным размерам 
$dest_img imagecreatetruecolor($w$h); 
$white imagecolorallocate($dest_img255255255); 
if (
$size_img[2]==2$src_img imagecreatefromjpeg($filename); 
else if (
$size_img[2]==1$src_img imagecreatefromgif($filename); 
else if (
$size_img[2]==3$src_img imagecreatefrompng($filename); 

// масштабируем изображение функцией imagecopyresampled() 
// $dest_img - уменьшенная копия 
// $src_img - исходной изображение 
// $w - ширина уменьшенной копии 
// $h - высота уменьшенной копии 
// $size_img[0] - ширина исходного изображения 
// $size_img[1] - высота исходного изображения 
imagecopyresampled($dest_img$src_img0000$w$h$size_img[0], $size_img[1]); 
// сохраняем уменьшенную копию в файл 
if ($size_img[2]==2imagejpeg($dest_img$smallimage); 
else if (
$size_img[2]==1imagegif($dest_img$smallimage); 
else if (
$size_img[2]==3imagepng($dest_img$smallimage); 
// чистим память от созданных изображений 
imagedestroy($dest_img); 
imagedestroy($src_img); 
return 
true

?> 

Вызываю так:

<?php
            
include "imgresize.php";
            
resizeimg($image$image2100100);
            
// $image - имя картинки которую нужно порессайзить
            // $image2 - имя маленькой поресайзенной картинки
?>

Пользуйся -)

   
 
 автор: Zilog   (03.10.2007 в 18:49)   письмо автору
 
   для: Night_charter   (03.10.2007 в 16:51)
 

спасибо - все отлично работает :))

поясни, пожалуйста, что обозначают последние два параметра, которые передаются в функцию??

   
 
 автор: Бамси   (03.10.2007 в 19:04)   письмо автору
 
   для: Zilog   (03.10.2007 в 18:49)
 

$w - width - ширина
$h - height - высота

   
 
 автор: Zilog   (03.10.2007 в 19:07)   письмо автору
 
   для: Бамси   (03.10.2007 в 19:04)
 

а если, скажем, я хочу указывать только ширину, а высоту он вычислял самостоятельно - сохраняя пропорции, это как?

просто не вижу смысла указывать 2 параметра, если можно один: непонимаю, кому может понадобиться грузить фото с нарушенными пропорциями...

   
 
 автор: Zilog   (03.10.2007 в 21:04)   письмо автору
 
   для: Zilog   (03.10.2007 в 18:49)
 

Народ!

Поясните, пожалуйста, что это за два последние параметра?

По умолчнию - генерится картинка 100х66, хотя параметры равно 100 и 200 соответственно.

   
 
 автор: Zilog   (03.10.2007 в 21:09)   письмо автору
 
   для: Zilog   (03.10.2007 в 21:04)
 

Можно сказать разобрался - первый параметр - ширина выходной картинки, второй - незнаю зачем. Высота выходной картинки считается автоматом, согласно пропорциям.
всё работает супер, ещё раз спасибо.

А второй параметр... а ну и хрен с ним пока.

   
 
 автор: Night_Charter   (04.10.2007 в 10:43)   письмо автору
 
   для: Zilog   (03.10.2007 в 21:09)
 

Эти параметры задаются для того, чтобы уменьшенная копия не привышала лимит заданный при вызове функции. Например, в высоту и ширину не более 100 пикселей.

   
 
 автор: Zilog   (07.10.2007 в 14:12)   письмо автору
 
   для: Night_Charter   (04.10.2007 в 10:43)
 

ГРАЖДАНЕ!!!
Глюк... :)


Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9856 bytes) 


При попытке загрузить jpeg размером боллее 1800 по ширине. По высоте не проверял пока.

Как починить ситуацию?

   
 
 автор: Shiva   (07.10.2007 в 14:28)   письмо автору
 
   для: Zilog   (07.10.2007 в 14:12)
 

Превышен объем выделенной скрипту оперативной памяти (В вашем случае - 2 Мб, это очень мало, вообще).
Попробуйте


ini_set("memory_limit", "8M");


Если настройки сервера не запрещают, это увеличит выделенный лимит.
Проверить, запрещают или нет, можно так:

<?php
echo     
        
"Было: ".ini_get("memory_limit").". <br>".
        
"Изменение ".((boolean) ini_set("memory_limit""8M") ? "разрешено" "запрещено").".<br>".
        
"Стало: ".ini_get("memory_limit");
?>

   
 
 автор: Zilog   (07.10.2007 в 14:33)   письмо автору
 
   для: Shiva   (07.10.2007 в 14:28)
 

Было: 16M.
Изменение запрещено.
Стало: 16M

вот что у меня показывает...

   
 
 автор: Valick   (07.10.2007 в 14:30)   письмо автору
 
   для: Zilog   (07.10.2007 в 14:12)
 

не загружать картинки размером больше 1800. Траффик и так в трубу летит, а вы ещё больше хотите узеров на бабки подставить.

   
 
 автор: Zilog   (07.10.2007 в 14:31)   письмо автору
 
   для: Zilog   (07.10.2007 в 14:12)
 

Спасибо, сейчас попробую.
И еще вопрос - гружу фотку шириной в 1000 например, хочу сделать ее шириной в 600, а на выходе ширина все равно получается - 302.

Меньше 302 фотку сделать можно, а вот скажем 1000 переделать в 600 - никак не получается. Где тут глюк?

ВСЕ. РАЗОБРАЛСЯ - надо было подприавить 2 пераметр

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования