-Поиск по дневнику

Поиск сообщений в php

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 20.09.2007
Записей:
Комментариев:
Написано: 41


PHP GD 2x ресайз

Суббота, 16 Февраля 2008 г. 23:33 + в цитатник
все записи автора

Задача:
1. Взять изображение N-размера.
2. Cоздать к большому изображение маленькую пропорциональную превьюшку.
3. Наложить на большое изображение(изначального размера), логотип формата PNG 24bit
4. Сохранить 2 изображения в формате JPEG: 1. SMALL(100x100) 2. BIG(STANDART SIZE)+LOGO


Начнём:
 Сразу определимся надо-ли нам это... =) надо? отлично! поехали.

Нам потребуется: большая картинка(на ваш вкус и цвет), логотип или что-то подобное в формате PNG 24bit, Редактор и минимально терпения =).


Открываем редактор, если вы пользуетесь блокнотом(NotePad) мне вас искренне жаль =\
Начнём разжёвывать =):
$filename = "";
$filename_logo = "";

$filename - Путь до картинки, которую мы собственно будем клонировать и уменьшать.
$filename_logo - Путь до логотипа, который мы собераемся накладывать на большое изображение.
// header('Content-type: image/jpeg');

Эта строчка нам врятли понадобится, а в некоторых вещах может даже помешать, но если мы хотим вывести изображение на экран, то без неё необойтись. Она оповещает брауз о выводе изображения на эекран и не более чего лишнего...
$info_img = getimagesize($filename);

В переменную $info_img засовываем функцию GetImageSize() которая определяет информацию касательно нашего изображения и засовывает всю информацию в массив по ячейкам [0],[1],[2] и .....т.д.. В данном случае нас интересует только 2 ячейки [0] и [1], ячейка [0] - хранит данные о ширине изображения а ячейка [1] - хранит информацию о высоте изображения.
list($width, $height) = $info_img;

Дабы нам было удобней определяться в ячейках ширины и высоты, с помощью функции list() мы распредилим $info_img[0] на $width, а info_img[1] на $height.
$small_size = 100;

Создаём переменную в которой будем хранить данные о размерах будущей превьюшки в пиксилях.
if($width > $height) {
$s_width = $small_size;
$s_height = $small_size*($height/$width);
}
if($width < $height) {
$s_width = $small_size*($width/$height);
$s_height = $small_size;
}
if($width == $height) {
$s_width = $small_size;
$s_height = $small_size;
}

Подошли к более интересному содержанию кода... Вопервых нам надо определить что у нашего изображения больше высота или ширина и следовательно выдать разные значения для представленный переменных(Что-бы получившиеся превьюшка была пропорциональна), а именно для:
$s_width - переменная с данными ширины маленького изображения(SMALL);
$s_height - переменная с данными высоты маленького изображения(SMALL);
$small_image = imagecreatetruecolor($s_width, $s_height);
$big_image = imagecreatetruecolor($width, $height);

Этими строчками мы создаём 2 новых изображения:
$small_image - маленькое изображение(превьюшка) размеры которого не превышают 100x100;
$big_image - большое изображение, изначального размера;
if($info_img['mime'] == 'image/gif') {
$image = imagecreatefromgif($filename);
}
if($info_img['mime'] == 'image/jpeg') {
$image = imagecreatefromjpeg($filename);
}
if($info_img['mime'] == 'image/png') {
$image = imagecreatefrompng($filename);
}

В этих строчках кода, нам надо опредилить тип загруженного нами файла, в данном случае это может быть JPG/JPEG,GIF,PNG;
imagecopyresampled($small_image, $image, 0, 0, 0, 0, $s_width, $s_height, $width, $height);
imagecopyresampled($big_image, $image, 0, 0, 0, 0, $width, $height, $width, $height);

В этой части кода мы уменьшаем одну копию изображения до пределов 100x100(px)
2ю оставляем неизменной
imagealphablending($image, true);
$logo_image = imagecreatefrompng($filename_logo);
$logo_width = ImageSX($logo_image);
$logo_height = ImageSY($logo_image);
imagecopy($big_image, $logo_image, $width-($logo_width+10), $height-($logo_height+10), 0, 0, $logo_width, $logo_height);

Осталась самая малость, нам надо наложить на большую картинку($big_image) наш прозрачных логотип PNG.
функция ImageAlphaBlending() даёт возможность делать наложение прозрачных изображений...
$logo_image - с помощью функции ImageCreateFromPNG создаём изображение с логотипом.
В переменные $logo_width и $logo_height с помощью функций ImageSX(размер по X - ширина) и ImageSY(размер по Y - высота), пихаем данные относительно размеров логотипа...
С помощью функции ImageCopy() мы накладываем изображение логотипа на большое изображение, в правый нижний угол.
imagejpeg($small_image, "picture/small_picture.jpg";, 80);
imagejpeg($big_image, "picture/big_picture.jpg", 80);


Вот уже и конец близок... Сохранение двух картинок: 1. Маленькая превьюшка 100x100 2. Картинка изначального размера но с логотипом в правом нижнем углу.
Немного ближе расмотрим строчку  "imagejpeg($image, "picture.jpg", 80)":
Сама функция ImageJpeg() - выдаёт окончательное изображение в формате JPEG/JPG
$image - Это изображение которое выводится на экран или сохроняется.
"picture.jpg" - путь и имя картинки куда мы хотим осуществить сохранение изображения.
80 - это качество выходящего изображение JPEG базируеться от 1 до 100.
Вот собственно и всё.... =) На всякий пожарный, если вам искренне впадлу читать мои утомительные описания, вот вам готовый листинг кода:








 <?php
$filename 
""// путь до картинки
$filename_logo = ""// путь до логотипа PNG
$small_size 100// максимальный размер превьюшки

$info_img getimagesize($filename); // собераем информацию изображения
list($width$height) = $info_img;

// определяем пропорции
if($width $height) {
$s_width $small_size;
$s_height $small_size*($height/$width);
}
if(
$width $height) {
$s_width $small_size*($width/$height);
$s_height $small_size;
}
if(
$width == $height) {
$s_width $small_size;
$s_height $small_size;
}

$small_image imagecreatetruecolor($s_width$s_height);
$big_image imagecreatetruecolor($width$height);


// определяем тип изображения 
if($info_img['mime'] == 'image/gif') {
$image imagecreatefromgif($filename);
}
if(
$info_img['mime'] == 'image/jpeg') {
$image imagecreatefromjpeg($filename);
}
if(
$info_img['mime'] == 'image/png') {
$image imagecreatefrompng($filename);
}

imagecopyresampled($small_image$image0000$s_width$s_height$width$height);
imagecopyresampled($big_image$image0000$width$height$width$height);

// накладываем лого на большое изображение
imagealphablending($imagetrue); 
$logo_image imagecreatefrompng($filename_logo); 
$logo_width ImageSX($logo_image); 
$logo_height ImageSY($logo_image); 
imagecopy($big_image$logo_image$width-($logo_width+10), $height-($logo_height+10), 00$logo_width$logo_height); 

// сохраняем 2 изображения
imagejpeg($small_image"picture/small_picture.jpg"80);
imagejpeg($big_image"picture/big_picture.jpg"80); 
?>

 (500x120, 26Kb)
Рубрики:  Склад готовых решений

MniD   обратиться по имени Воскресенье, 17 Февраля 2008 г. 00:09 (ссылка)
Большое спасибо, товарищь, статья элементарная, но для новичков самое оно + для пополнения сообщества, надо раскручивать его и поднимать =)
Ответить С цитатой В цитатник
Аноним   обратиться по имени Воскресенье, 17 Февраля 2008 г. 00:47 (ссылка)
Именно для новичков и писалось =)
В особенности, как не смешно, формулу процентного соотношения незнают многие =) 5 кл. однако =)
Надо ещё про MySQL для новичков написать...
Ответить С цитатой В цитатник
goldencards   обратиться по имени Пятница, 18 Апреля 2008 г. 17:00 (ссылка)
НАШ САЙТ точкаRU
без предоплаты по договору оформляет карты клиента Метро Кэш энд Керри в сеть немецких торговых центров Метро Кэш энд Керри на частных лиц и сотрудников организаций!в короткие сроки! Карта-клиента именная обязательно с вашей фотографией(делается при вас в самом магазине METRO), с номером, штрих - кодом, со специальной магнитной полосой, названием фирмы, от которой вы будете нами зарегистрированы.Карточки оформляются: на граждан России и иностранных граждан.Оформление делается без предварительной оплаты, то есть вначале мы оформляем вас, вы получаете пропуска, потом оплачиваете.
metro cas
h carry карта клиента
метро кэш энд кэрри
магазин мэтро кеш анд кэрри
как оформить карту метро кэш кэрри
метро карта клиента
НАШ САЙТ точкаRU
Ответить С цитатой В цитатник
somewisestar   обратиться по имени Воскресенье, 01 Ноября 2009 г. 01:15 (ссылка)
Ответить С цитатой В цитатник
Аноним   обратиться по имени Вторник, 30 Марта 2010 г. 15:39 (ссылка)
алгоритм подойдёт только для вписывания в квадрат
Ответить С цитатой В цитатник    |    Не показывать комментарий
Комментировать К дневнику Страницы: [1] [Новые]
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку