Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Изменение размеров изображения

 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP
 
Автор Сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Фев 02, 2007 6:02 am    Заголовок сообщения: Изменение размеров изображения
Ответить с цитатой

Как таковой, функции изменения размеров изображения в библиотеке GD нет. Есть две функции копирования части одного изображения в другое с изменением размеров копируемой части. Это функции imagecopyresized() и imagecopyresampled().

Функция imagecopyresampled() появилась в библиотеке GD с версии 2.0.1 и отличается от imagecopyresampled() тем, что при изменении размеров плавно интерполируются значения цветов в точках изображения. Это отличие хорошо иллюстрируют следующие рисунки:

imagecopyresize()
Оригинал

Результат

Если увеличить результат:


imagecopyresample():
Результат:

Если увеличить результат:


Об ограничениях на работу функции imagecopyresampled() с палитровыми изображениями в документации по PHP ничего не сказано. Более того, там есть сноска, в которой описываются проблемы, возникающие с палитровыми изображениями. Из этого можно было бы сделать вывод, что функция работает с такими изображениями, но, просмотрев исходный код функции я убедился в обратном:
if (!dst->trueColor) {
gdImageCopyResized (dst, src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
return;
}

В примерах мы будем использовать функцию imagecopyresampled(), но если у вас более старая версия GD, то просто замените "resampled" на "resized".

Пример 33: Функция изменяющая размер изображения.
<?
function imageresize($outfile,$infile,$neww,$newh,$quality) {

$im=imagecreatefromjpeg($infile);
$im1=imagecreatetruecolor($neww,$newh);
imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));

imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}

imageresize("","webcam.jpg",320,240,75);

?>

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

Пример 34: Изменение размеров изображения с заданным коэффициентом.
<?
function imageresize($outfile,$infile,$percents,$quality) {
$im=imagecreatefromjpeg($infile);
$w=imagesx($im)*$percents/100;
$h=imagesy($im)*$percents/100;
$im1=imagecreatetruecolor($w,$h);
imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}

imageresize("","webcam.jpg",30,75);

?>

Иногда необходимо вписать новое изображение в определенные рамки, например как на сервере fota.mota.ru. В таком случае можно воспользоваться следующей функцией:

Пример 35: Изменение размеров изображения с вписыванием в рамки
<?
function imageresize($outfile,$infile,$neww,$newh,$quality) {
$im=imagecreatefromjpeg($infile);
$k1=$neww/imagesx($im);
$k2=$newh/imagesy($im);
$k=$k1>$k2?$k2:$k1;

$w=intval(imagesx($im)*$k);
$h=intval(imagesy($im)*$k);

$im1=imagecreatetruecolor($w,$h);
imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}

imageresize("","webcam.jpg",640,240,75);

?>

Комментарии пользователей (всего 2)

korban / 20 апреля 2006, 18:33:59

header('Content-type: image/jpeg');

function imageresize($outfile,$infile,$percents,$quality) {
$im=imagecreatefromjpeg($infile);
$w=imagesx($im)*$percents/100;
$h=imagesy($im)*$percents/100;
$im1=imagecreatetruecolor($w,$h);
imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}

$d=opendir("img/user/");
while(($e=readdir($d)) !==false) {
if (!ereg("^(.*)\.(jpg)$",$e,$P)) continue;
$patche="img/user/$e";

$foto = imageresize("","$patche",75,75);
echo ("<img src='" . $foto. "'>"."<BR>");

}

По идее этот скрипт создает функцию сжатия, потом ищет все файлы JPEG и
должен вывести все фото на экран, но выводит только первую, остальные игнорирует! Подскажите, чего здесь не хватает?

Corwin Celebdil / 21 октября 2005, 10:15:47

Опечатка:

"Функция imagecopyresampled() появилась в библиотеке GD с версии 2.0.1 и отличается от imagecopyresampled() тем, что при изменении размеров <...>"

Вместо второй imagecopyresampled() должно быть imagecopyresize()

Источник: http://www.codenet.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
yok

Участник тусовки


Зарегистрирован: 06.02.2008
Сообщения: 260
Откуда: krasnodar

СообщениеДобавлено: Пн Авг 31, 2009 7:08 am    Заголовок сообщения:
Ответить с цитатой

Добрый день Ден, и форум! Smile
После того, как я загрузил фото на сервер, и как из Вашей темы о загрузке файлов на сервер, у меня появилась переменная $myfile=$_FILES['myfile']['tmp_name'],
я хочу сразу обработать фото до нужного размера и сохранить.
imageresize("/foto/$next_foto","$myfile",320,240,75);
У меня отлично работает на локальной машине с временным файлом, но правильно ли это.
Может необходимо сохранить сначала, а потом уже обрабатывать?
ХОТЕЛОСЬ БЫ ЗНАТЬ ВАШЕ МНЕНИЕ. Neutral
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Пн Авг 31, 2009 8:41 am    Заголовок сообщения:
Ответить с цитатой

по мне сначала обрабатываешь потом сохраняешь. если будет галлерея и фотка попадает после сохранения сразу туда, то могу возникнуть пролемы с пользощвателями, которым периодически не будет показываться картинка. а временный файл он ведь уже на сервере. модифицируешь а потом переносишь куда надо и всё. Wink
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
yok

Участник тусовки


Зарегистрирован: 06.02.2008
Сообщения: 260
Откуда: krasnodar

СообщениеДобавлено: Пн Авг 31, 2009 9:07 am    Заголовок сообщения:
Ответить с цитатой

Спасибо Krow. Idea
Так же , по моему разумению, получается двойная работа сервера, сначала сохранил, потом обработал и опять сохранил. Раз подход работы с временным файлом таков же , как и с имеющимся, то логично предположить что лучше работать с временным. К тому же если строить по твоему принцыпу, krow.

Спасибо большое. Ден, а твое мнение, ты же АС!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Пн Авг 31, 2009 10:23 am    Заголовок сообщения:
Ответить с цитатой

так же я думаю что стоит все изменения производить над временным файлом. допустим у тебя есть картинка, но тебе что то надо сделать с ней, береш её, делаешь её копию, и работаешь с копией, а потом просто уже модифицированной картинкой заменяешь если надо оригинал... если нужно будет нажать отмену то просто удалишь копию. )
ЗЫ привет землякам ))
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Sleemer




Зарегистрирован: 04.02.2011
Сообщения: 2

СообщениеДобавлено: Пт Фев 04, 2011 10:43 am    Заголовок сообщения:
Ответить с цитатой

Все добрый день! Денис, у меня к вам вопрос, касающийся изменения размера. Я использую Ваш скрипт, который Вы написали в книге, только проблема в том, что в самом скрипте уже указаны размеры уменьшенной картинки. Поэтому разные картинки уменьшаются по разному. Что делать, чтобы все картинки уменьшались пропорционально?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Martin

Завсегдатай


Зарегистрирован: 28.07.2009
Сообщения: 623
Откуда: Харьков

СообщениеДобавлено: Пт Фев 04, 2011 2:20 pm    Заголовок сообщения:
Ответить с цитатой

Как альтернатива скрипту из книги http://mediumexposure.com/smart-image-resizing-while-preserving-transparency-php-and-gd-library/
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Фев 04, 2011 2:33 pm    Заголовок сообщения:
Ответить с цитатой

Sleemer, нужно определить размеры исходной картинки, вычислить размеры новой картинки, например, если исходная картинка 800х600, а у меньшить ее нужно в 2 раза, то размеры новой картинки будут 400х300 и передаем эти размеры скрипту. Вот и все )
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Sleemer




Зарегистрирован: 04.02.2011
Сообщения: 2

СообщениеДобавлено: Пт Фев 04, 2011 2:56 pm    Заголовок сообщения:
Ответить с цитатой

Спасибо, буду химичить Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
zakzak




Зарегистрирован: 27.12.2012
Сообщения: 5
Откуда: Kiev

СообщениеДобавлено: Чт Dec 27, 2012 3:23 pm    Заголовок сообщения:
Ответить с цитатой

Зачем придумывать велосипед?
До нас уже хорошие люди позаботились и живали максимум с GD
Представляю Image Moo библеотека для CI, но её можно использовать в любом коде.
Туториал и скачать http://www.matmoo.com/digital-dribble/codeigniter/image_moo/
Не буду описывать, так как в туториале есть всё.
_________________
Все отлично... =)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP Часовой пояс: GMT
Страница 1 из 1
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис