|
|
|
| Нас по почте попросили прислать пример создания уменьшенных копий изображений. Ну и чтоб добру не пропадать выкладываю в форум - может еще кому понадобится.
PS: Cкрипт не универсальный. Просто чтобы показать как работать с GDLib.
<?php
// Создадим уменьшенную копию изображения
// имя файла с которым будем работать
// файл должен находиться в том же месте, что и этот скрипт
$source="test.jpg";
// определим размеры уменьшенного изображения
$d_w=133;
$d_h=100;
// вызываем функцию изменения размера
resizeimg($source, 133, 100);
// выводим картинку на экран
?>
<img src="small.jpg">
<?
function resizeimg($filename, $w, $h)
{
// определим коэффициент сжатия изображения, которое будем генерить
$ratio = $w/$h;
// создадим пустое изображение по заданным размерам
$dest_img = imagecreatetruecolor($w, $h);
// зальём его белым цветом
imagefill($dest_img, 0, 0, 0xFFFFFF);
// получим размеры исходного изображения
$size_img = getimagesize($filename);
// получим коэффициент сжатия исходного изображения
$src_ratio=$size_img[0]/$size_img[1];
// здесь вычисляем размеры, чтобы при масштабировании сохранились
// 1. Пропорции исходного изображения
// 2. Исходное изображение полностью помещалось на маленькой копии
// (не обрезалось)
if ($src_ratio>$ratio)
{
$old_h=$size_img[1];
$size_img[1]=floor($size_img[0]/$ratio);
$old_h=floor($old_h*$h/$size_img[1]);
}
else
{
$old_w=$size_img[0];
$size_img[0]=floor($size_img[1]*$ratio);
$old_w=floor($old_w*$w/$size_img[0]);
}
// исходя из того какой тип имеет изображение
// выбираем функцию создания
switch ($size_img['mime'])
{
// если тип файла JPEG
case 'image/jpeg':
// создаем jpeg из файла
$src_img = imagecreatefromjpeg($filename);
$ext="jpg";
break;
// если тип файла GIF
case 'image/gif':
// создаем gif из файла
$src_img = imagecreatefromgif($filename);
$ext="gif";
break;
}
// масштабируем изображение функцией imagecopyresampled()
// $dest_img - уменьшенная копия
// $src_img - исходной изображение
// $w - ширина уменьшенной копии
// $h - высота уменьшенной копии
// $size_img[0] - ширина исходного изображения
// $size_img[1] - высота исходного изображения
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);
// в зависимости от типа файла выбирвем функцию сохранения в файл
switch ($size_img['mime'])
{
case 'image/jpeg':
// сохраняем в файл small.jpg
imagejpeg($dest_img, "small.$ext");
break;
case 'image/gif':
// сохраняем в файл small.gif
imagegif($dest_img, "small.$ext");
break;
}
// чистим память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);
}
?>
|
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(31.07.2004 в 04:10)
| | Прикольно! Есть неточности в коде, но смысл был понятен... и код был переписан под свои нужды. !!!Оч полезная статейка!!! | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 13:40)
| | >Есть неточности в коде.
Тот скрипт, что я выложил сильно нигде не тестировался, потому если вы увидели ошибки в коде, то может поделитесь? Вместо доведем его до ума :)
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(05.08.2004 в 13:55)
| | вы рассмотрели как изменять размер изображения, т.е. его уменьшать и если оно не вписывается создаются пустые черные поля, а как сделать чтоб оно урезалось пропорционально, относительно центра исходника изображения ????
В прикрепленной картинке рисонок, результат действия этого скрипта, а мне нужно без черных полей..... Очень расчитываю на вашу помощь. | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 16:01)
| | >т.е. его уменьшать и если оно не вписывается создаются пустые черные
Да, это так:
Я выложу сегодня поправленный вариант – ближе к ночи. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 16:24)
| | Огромное спасибо !!!!!!!!!! :))))
Я буду постоянно посещать ваш Форум и задовать вам вопросы :))) Еще раз вам спасибо !!
ЖДУ СКРИПТ :) | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 16:29)
| | ЖДУ СКРИПТ :).......... | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 16:01)
| | Выкладываю. Это измененная функция resizeimg()
<?
function resizeimg($filename, $smallimage, $w, $h)
{
// Имя файла с масштабируемым изображением
$filename = "../".$filename;
// Имя файла с уменьшенной копией.
$smallimage = "../".$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_img, 255, 255, 255);
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_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);
// сохраняем уменьшенную копию в файл
if ($size_img[2]==2) imagejpeg($dest_img, $smallimage);
else if ($size_img[2]==1) imagegif($dest_img, $smallimage);
else if ($size_img[2]==3) imagepng($dest_img, $smallimage);
// чистим память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);
return true;
}
?>
|
Вызов функции осуществляется следующим образом:
<?
resizeimg($bigimage, $smallimage, 133, 100);
?>
|
$bigimage - имя файла с изображением, которое нужно смасштабировать
$smallimage - имя файла, куда надо записать смасштабированное изображение.
133 и 100 - это максимальные размеры уменьшенной копии изображения (в пикселях) по ширине и высоте соответсвенно. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | щас попробую.... :) | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | А куда вписовать имя фаила ?
//// Так у вас
$filename = "../".$filename;
$smallimage = "../".$smallimage;
//// Так надо ?
$filename = "1.jpg".$filename;
$smallimage = "small.jpg".$smallimage; | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 22:10)
| | Нужно вызывать функцию так:
<?
$bigimage = "bigimage.jpg"
$smallimage = "smallimage.jpg"
resizeimg($bigimage, $smallimage, 133, 100);
?>
|
Код был взят с реального приложения, поэтому есть свои особенности.
Если файл с кодом и изображения лежат в одной директории, то вот эти строки нужно закомментировать.
<?
//$filename = "../".$filename;
// Имя файла с уменьшенной копией.
//$smallimage = "../".$smallimage;
?>
|
Иначе подразумевалось, что изображения лежат на один уровень выше скрипта. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | Все разобрался, тестирую | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | Еще вопрос, у вас есть такая вещь как
// чистим память от созданных изображений
Я так понимаю уменьшеная картинка должна удалятсяпосле закрытия броузера ? | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 22:25)
| | >Я так понимаю уменьшеная картинка должна удалятсяпосле закрытия броузера ?
Нет. Картина сохраняется в файл и никуда не удаляется.
Метод imagedestroy() чистит память сервера занятую создаваемыми изображениями во внутреннем формате GD. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 23:21)
| | Понятно, а как сделать чтоб удалялась ? | |
|
|
|
|
|
|
|
для: Олег
(03.01.2005 в 23:52)
| | Для этого предназначена функция
unlink("имя_удаляемого_файла");
|
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(04.01.2005 в 00:52)
| | т.е. в код просто вставляю unlink("small.jpg"); и по закрытию броузера удаляется созданый фаил ? Щас опробую :) | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(04.01.2005 в 00:52)
| | Ну эта команда unlink("имя_удаляемого_файла");
удаляет этот фаил сразу а как сделать чтоб он удалялся по закрытию окна броузера ? | |
|
|
|
|
|
|
|
для: Олег
(04.01.2005 в 02:16)
| | >а как сделать чтоб он удалялся по закрытию окна броузера ?
А дело в том, что PHP не может узнать, что окно браузера было закрыто и следовательно удалить файл.
Какую задачу Вы хотите решить? Возможно, что писать в файлы вообще ничего не нужно…, но нужно определиться с задачей. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | Все замечательн, но есть одна проблема. Нужно вставить уменьшение изображения на реальном сайте.
Но библиотека GD, которая там стоит уже не поддерживает функцию CreateImageFromGif.
Естессно, на хостинговом сервере никто ее менять не станет.
Что делать?
Может подскажете где старую либу найти? | |
|
|
|
|
|
|
|
для: grigstar
(16.01.2005 в 07:13)
| | >Но библиотека GD, которая там стоит уже не поддерживает функцию CreateImageFromGif.
imagecreatefromgif() имеется ввиду?
Хм.. как странно. Ранее не подерживалась функция imagegif() - пока не истек срок действия патента на формат GIF, но imagecreatefromgif() работала всегда.
>Что делать?
Может подскажете где старую либу найти?
Так Вы же все равно не сможете установить другую версию библиотеки на хостинге...
Если недоступна функция imagecreatefromgif(), то это значит Вы не сможете работать с файлами формата GIF.
Или же речь идет о функции imagegif()? | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(16.01.2005 в 10:44)
| |
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]); // сохраняем уменьшенную копию в файл
if ($size_img[2]==2) imagejpeg($dest_img, $smallimage);
else if ($size_img[2]==1) imagegif($dest_img, $smallimage);
else if ($size_img[2]==3) imagepng($dest_img, $smallimage);
|
Пишет что нету досутпа (unable access) к картинке =\ Не могу понять почему. На папку стоит 777 =\ И указывает на эти 4 строки, смотря какой файл. не могу понять, что на хостинге не так. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(03.01.2005 в 21:51)
| | Маленькое дополнение, которое позволит маштабировать относительно того как расрасположена фотография, то есть горизонтально или вертикально...
if ($size_img[0]<$size_img[1]){$w=100; $h=133; }
else {$w=133; $h=100;}
|
этот код необходимо разместить после строки
$size_img = getimagesize($filename);
|
и стороку
разместить под предлагаемым кодом.
вызов функции естественно изменяется
resizeimg($bigimage, $smallimage);
|
и инициализация функции тоже
function resizeimg($filename, $smallimage){...}
|
Удобно тем, что в основном картинки изменяют для предварительного просмотра, скажем фотоальбома на сайте, и если пропорция горизонтальных превьюшек будет отличаться от вертикальных, визуально будут выглядеть разных размеров, что портит общий вид страницы... | |
|
|
|
|
|
|
|
для: GRain
(01.02.2005 в 14:45)
| | В приведенном мною коде масштабирование, на самом деле, осуществляется по пропорциям исходного изображения.
Параметры $w=133 и $h=100 являются ограничителями максимальных размеров уменьшенной копии по ширине и высоте. Т.е. при масштабировании учитывается только один из этих параметров, а второй размер высчитывается автоматически исходя из пропорций исходного изображения.
Хотя, в моем примере тоже правильней и корректней было бы указать равные ограничители по ширине и высоте. Например $w=133 и $h=133. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(01.02.2005 в 23:31)
| | А можно если картинка горизонтальная и маштабируется по макс. значениям, допустим, 100х100, но высота в итоге получается меньше 100, как-нибуть поместить картинку по середине квадратика 100х100 и залить недостающие поля белым цветом? и на оборот и вертикальмыми... | |
|
|
|
|
|
|
|
для: Niemand
(16.06.2005 в 00:31)
| | Немного модифицировал этот скрипт
if ($size_img[2]==2)
{
header('Content-type: image/jpeg');
imagejpeg($dest_img);
}
else if ($size_img[2]==1)
{
header('Content-type: image/gif');
imagegif($dest_img);
}
else if ($size_img[2]==3)
{
header('Content-type: image/png');
imagepng($dest_img);
}
|
То есть по идее он должен вывести картинку не сохраняя ее в файл, и забыть про нее. Но и тут идут глюки:
Warning: Cannot modify header information - headers already sent by (output started at там-то\index.php:75) in тут-то\imgresize.php on line 51
GIF
С хедерами вроде бы понятно, должны раньше отсылаться, но как сделать чтобы картинка выходила в моем дизайне и не такими крокозяблами? Никак не могу разобраться(
[поправлено модератором] | |
|
|
|
|
|
|
|
для: babilonian
(27.01.2006 в 20:54)
| | Так не получится, вывод нескольких изображений на одной странице описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=5173
PS Под новый вопрос лучше заводить новую тему, сославшись на старую. | |
|
|
|