Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сложное масштабирование изображений в PHP

Автор: fox++
http://foxweb.net.ru/
9 августа 2005 года

Статья описывает методику сложного форматирования изображений на PHP под нужный формат независимо от их начальных размеров и ориентации, но всегда выдаёт изображения строго определённого размера. В скрипте используются функции обработки изображений библиотеки GD. Скрипт будет полезен для новостных сайтов и фотогалерей.

Суть проблемы

Работая над новостным сайтом, я столкнулся с проблемой хранения картинок к статьям в двух форматах – мелкий (90 на 90 для заголовочных блоков) и крупный (218 на сколько есть). Новости хранились в базе и добавлялись очень просто. С картинками выходило сложнее. Исходные изображения с цифровой фотокамеры (или цифрового макета бумажной газеты) загружались в PhotoShop и обрабатывались дизайнером под нужный формат. Уже сам факт ручной работы с графикой заставил задуматься об автоматизации. Кроме того, приходилось локально сохранять две картинки, а потом закачивать их через форму по отдельности, да чтоб ещё и не перепутать, где какая! Возникает избыточность, а размер занимаемого места становился всё больше и больше.

Первые идеи

С самого начала работы над проектом я знал, что существует такая вещь, как ImageMagick для Perl. Запустить этот чудо-модуль мне так и не удалось. Потом я перешёл на PHP, и понял, что Perl не совсем приспособлен для таких вещей. На PHP тоже можно формировать картинки с помощью модуля GD. Он хоть и попроще будет, но функции масштабирования в нём есть, что и требовалось.

Постановка задачи – написать скрипт, получающий путь исходного изображения и выводил бы данные image/jpeg – картинку нужного формата (см. описание протокола HTTP).

Скрипт масштабирования resize.php

Входные параметры:

  • $f – имя файла в виде path/file.jpg. Можно было придумать более защищённый способ адресации, но суть алгоритма не меняется. Например, предавать только номер статьи из базы, а скрипт сам бы определил местонахождение картинки;
  • $q – качество сжатия JPEG;
  • $type – формат картинки (в смысле линейные размеры) где в зависимости от значения $type производятся следующие действия:
    • $type = 0 – из исходной картинки вырезается квадратная серединка и приводится к формату 90x90 пикселей;
    • $type = 1 – исходная картинка масштабируется пропорционально и приводится к ширине 218 пикселей (опционально наносится надпись);
    • $type = 2 – исходная картинка выводится без изменений.

Посмотрим начало скрипта:

resize.php

<?php 

// f - имя файла 
// type - способ масштабирования 
// q - качество сжатия 
// src - исходное изображение 
// dest - результирующее изображение 
// w - ширниа изображения 
// ratio - коэффициент пропорциональности 
// str - текстовая строка 

// тип преобразования, если не указаны размеры 
if ($type == 0) $w = 70;  // квадратная 70x70 
if ($type == 1) $w = 90;  // квадратная 90x90 
if ($type == 2) $w = 218; // пропорциональная шириной 218 


// качество jpeg по умолчанию 
if (!isset($q)) $q = 100;

Здесь как обычно проверяются входные параметры. Вы, конечно, можете задать более жёсткие условия проверки. Смотрим дальше.

// создаём исходное изображение на основе 
// исходного файла и опеределяем его размеры 
$src = imagecreatefromjpeg($f); 
$w_src = imagesx($src); 
$h_src = imagesy($src);

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

В этой части программы мы загружаем исходное изображение в переменную $src. Функции imagesx и imagesy определяют размеры исходной картинки и записывают их в соответствующие переменные. Они нам понадобятся для вычисления коэффициента пропорциональности. Здесь же с помощью функции header передаём заголовок Content-type: image/jpeg в браузер пользователя. После этого он ожидает, что следующий поток данных будет jpeg-файлом.

Следующее условие отвечает за размер выводимой картинки и непосредственно за вывод. Возможно, что исходная картинка уже нужного размера. Если это не так, обработаем её. Для этого поставим следующее условие:

// если размер исходного изображения 
// отличается от требуемого размера 
if ($w_src != $w) 
{

Следующая часть программы будет подгонять картинку под ширину 218 пикселей (пропорциональное уменьшение) для случая $type=1.

// операции для получения прямоугольного файла 
   if ($type==2) 
   { 
       // вычисление пропорций 
       $ratio = $w_src/$w; 
       $w_dest = round($w_src/$ratio); 
       $h_dest = round($h_src/$ratio); 

       // создаём пустую картинку 
       // важно именно truecolor!, иначе будем иметь 8-битный результат 
       $dest = imagecreatetruecolor($w_dest,$h_dest); 
       $str = "foxweb.net.ru"; 
       imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src); 

Вначале вычисляем коэффициент $ratio, чтобы сразу вычислить размеры результирующей картинки $w_dest и $h_dest. Потом создаём новую картинку $dest с таким же размерами, это заготовка для масштабированной картинки. Самая сложная часть алгоритма – функция imagecopyresized. В ней я указал результирующую и исходную картинку, координаты левого верхнего угла для обоих картинок (0, 0, 0, 0) и координаты правого нижнего угла для обоих картинок ($w_dest, $h_dest, $w_src, $h_src). Вот официальная справка на эту функцию:

imagecopyresized - копирует и изменяет размеры части изображения

int imagecopyresized ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

imagecopyresized() копирует прямоугольную часть одного изображения в другое изображение. Dst_im - результирующее изображение, src_im - исходное изображение. Если исходные и координаты расположения и ширины и высот отличаются, будет выполнено растяжение или сжатие фрагмента изображения. Начало координат - верхний левый угол. Эта функция может быть использована, чтобы копировать области в пределах того же изображения (если dst_im и src_im совпадают), но если области перекрывают результаты быть непредсказуемым.

Вместо неё можно использовать imagecopyresampled() - ресемплирование со сглаживанием. Картинка получится более качественной. Подробнее о параметрах функции можно узнать в документации на сайте http://php.net/imagecopyresized/ .

Следующая часть кода совершенно необязательна. Она печатает произвольную надпись на готовой картинке. Причём, контрастным цветом: на тёмном фоне надпись будет белая, на светлом – чёрная. Сначала определим координаты вывода текста (в нашем примере это внизу справа) и три цвета – $white, $black и $gray с помощью функции imagecolorallocate. Чтобы определить, каким цветом печатать надпись, сравним цвет точки (функция imagecolorat), где будет надпись, со «средним» цветом $gray. Если цвет точки окажется светлее серого, то надпись будет чёрного цвета ($color = $black). Если цвет точки окажется темнее серого, то надпись будет белого цвета ($color = $white). Наконец определяем строку $str и наносим её функцией imagestring, указав размер шрифта, координаты, строку и цвет. Помните, что эта функция выводит только латинские символы одним шрифтом. Хотя никто не запрещает вам пользоваться TrueType шрифтами, благо такие функции есть.

        // определяем координаты вывода текста 
        $size = 2; // размер шрифта 
        $x_text = $w_dest-imagefontwidth($size)*strlen($str)-3; 
        $y_text = $h_dest-imagefontheight($size)-3; 

        // определяем каким цветом на каком фоне выводить текст 
        $white = imagecolorallocate($dest, 255, 255, 255); 
        $black = imagecolorallocate($dest, 0, 0, 0); 
        $gray = imagecolorallocate($dest, 127, 127, 127); 
        if (imagecolorat($dest,$x_text,$y_text)>$gray) $color = $black; 
        if (imagecolorat($dest,$x_text,$y_text)<$gray) $color = $white; 

        // выводим текст 
        imagestring($dest, $size, $x_text-1, $y_text-1, $str,$white-$color); 
        imagestring($dest, $size, $x_text+1, $y_text+1, $str,$white-$color); 
        imagestring($dest, $size, $x_text+1, $y_text-1, $str,$white-$color); 
        imagestring($dest, $size, $x_text-1, $y_text+1, $str,$white-$color); 

        imagestring($dest, $size, $x_text-1, $y_text,   $str,$white-$color); 
        imagestring($dest, $size, $x_text+1, $y_text,   $str,$white-$color); 
        imagestring($dest, $size, $x_text,   $y_text-1, $str,$white-$color); 
        imagestring($dest, $size, $x_text,   $y_text+1, $str,$white-$color); 

        imagestring($dest, $size, $x_text,   $y_text,   $str,$color); 
    } 

Несколько сложнее выглядит часть кода для получения квадратного фрагмента.

    // операции для получения квадратного файла 
    if (($type==0)||($type==1)) 
    { 
         // создаём пустую квадратную картинку 
         // важно именно truecolor!, иначе будем иметь 8-битный результат 
         $dest = imagecreatetruecolor($w,$w); 

         // вырезаем квадратную серединку по x, если фото горизонтальное 
         if ($w_src>$h_src) 
         imagecopyresized($dest, $src, 0, 0,
                          round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                          0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); 

         // вырезаем квадратную верхушку по y, 
         // если фото вертикальное (хотя можно тоже серединку) 
         if ($w_src<$h_src) 
         imagecopyresized($dest, $src, 0, 0, 0, 0, $w, $w,
                          min($w_src,$h_src), min($w_src,$h_src)); 

         // квадратная картинка масштабируется без вырезок 
         if ($w_src==$h_src) 
         imagecopyresized($dest, $src, 0, 0, 0, 0, $w, $w, $w_src, $w_src); 
     } 

	// вывод картинки и очистка памяти 
	imagejpeg($dest,'',$q); 
	imagedestroy($dest); 
	imagedestroy($src); 
} 

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

Немного поясню конструкцию: round((max($w_src, $h_src) – min($w_src, $h_src)) / 2). Это выражение вычисляет координату x или y верхнего левого угла квадратного блока (без разницы для горизонтальной или вертикальной картинки). Это видно на рисунках.

Горизонтальное изображение
Вертикальное изображение

Обычно в горизонтальных картинках (лица, пейзажи, объекты) наиболее информативна центральная часть, а в вертикальных (чаще всего это стоящие люди) - наиболее важна верхняя часть. Чтобы изменить вырезаемый фрагмент вертикальной картинке, строку:

imagecopyresized($dest, $src, 0, 0, 0, 0, $w,
                 $w, min($w_src,$h_src), min($w_src,$h_src)); 

можно заменить на

imagecopyresized($dest, $src, 0, 0, 0,
                 round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                 $w, $w, min($w_src,$h_src), min($w_src,$h_src)); 

Тогда в вертикальной картинке будет браться не верхняя часть, а средняя (это зависит от расположения объектов на фотографии). Точно так же можно брать нижнюю часть или правую/левую часть горизонтальной картинки – поэкспериментируйте с координатами. Особенно этот метод пригодится, если нужно создать квадратные «превьюшки» (thumbnails) в одной таблице.

В конце выводим картинку imagejpeg() и очищаем память imagedestroy().

Демонстрация масштабирования

Чтобы вам не приходилось лихорадочно менять входные переменные в процессе отладки на локальном сервере, предлагаю демо-страничку, которая загружает четыре картинки разных форматов. Тестовые исходные картинки должны храниться в текущей директории под именами image1.jpg и image2.jpg. Здесь же должен находиться файл resize.php, который на выводе выдаёт jpeg-изображение.

resize.htm

<html>
<head>
 <title></title>
</head>
<body>
 <h3 align="center">Демонстрационный пример масштабирования картинок</h3>
 <table align="center">
   <tr align="center" valign="top">
     <td>90*90<br><img src="resize1.php?f=av.jpg&t=1&w=90&s=0" border=0></td>
     <td>90*90<br><img src="resize.php?f=news114.jpg&type=1" border=0></td>
   </tr>
   <tr align="center" valign="top">
     <td>218*x<br><img src="resize.php?f=av.jpg&type=2" border=0></td>
     <td>218*x<br><img src="resize.php?f=news114.jpg&type=2" border=0></td>
   </tr>
 </table>
</body>
</html>

Просмотровщик картинок

Этот скрипт достаточно прост, он всего лишь формирует страницу, ссылки, осуществляет всю навигацию по каталогу картинок. Вся работа по загрузке картинок производится через resize.php. Его можно взять за основу простого веб-альбома.

preview.php

<html> 
<head> 
   <title></title> 
</head> 
<body> 
<?php 

// читаем список jpg-файлов в массив list 
$list = array(); 
if ($dir = opendir('.'))  // успешное открытие текущей директории 
{ 
     // перебираем именя файлов, полученные readdir 
     while (false !== ($file = readdir($dir))) 
     { 
         // отбираем только .jpg, отсекаем ссылки '.' и '..' 
         if ($file != "." && $file != ".." && preg_match("/.jpg/i", $file)) 
         { 
          $list[] = $file; // пишем имя файла в массив 
          $i++;  // счётчик файлов, нужен для определения границ массива 
         } 
     } 
     closedir($dir); // закрываем директорию 
} 

// переменные по умолчанию, полученные через GET 
if ($f == '')    $f = $list[0]; // если файл не указан, берём первый из списка 
if ($num == '')  $num = 0;    // номер запрошенного файла 
if ($type == '') $type = 1;  // тип по умолчанию "средний" 

// заголовочек - имя файла 
echo "<p>$list[$num]</p>\n"; 

// определяем ссылку с картинки анализируя type 
// щёлкая по картинке файл будет перезагружаться с новым type 
if ($type == 0) $link = "href=\"?type=1&num=$num\" title=\"показать 90\""; 
if ($type == 1) $link = "href=\"?type=2&num=$num\" title=\"показать 218\""; 
if ($type == 2) $link = "href=\"?type=full&num=$num\" title=\"показать весь\""; 
if ($type == "full") $link = "href=\"?type=0&num=$num\" title=\"показать 70\""; 
echo "<a $link><img src=\"resize.php?f=$list[$num]&type=$type\" border=0></a>"; 

// определяем, крайние ли элементы списка 
$num1 = $num-1; 
if ($num1<0)    $num1 = $i-1;    // если num вышел за 0, переводим его на 0 
$num2 = $num+1; 
if ($num2>$i-1) $num2 = 0; // если num вышел за i, переводим его на i-1 

// ссылки навигации 
echo "<br><a href=\"?type=$type&num=$num1\">пред</a> 
<a href=\"?type=$type&num=$num2\">след</a>"; 

?> 
</body> 
</html>

Думаю, что скрипт достаточно хорошо комментирован, потому объясню лишь суть. Вначале происходит загрузка имён jpg-файлов в текущем каталоге в массив $list. Потом загружаем картинку с нужными параметрами из скрипта resize.php, причём на картинке «висит» ссылка на её увеличенную копию (изменяется параметр $type). В конце формируем ссылки на следующую и предыдущую картинку. Вот и всё. В качестве тестирования накидайте в каталог скрипта два десятка фотографий и вы получите простенькую «смотрелку». Навигацию, конечно, можно усложнить, но тогда скрипт уже будет «сложненьким».

Почему не работает GD?

Я отлаживаю скрипты в Windows, поэтому объясню решение проблемы именно для этой ОС. Скорее всего, причина неработоспособности скрипта в отсутствии модуля php_gd.dll (или более новый php_gd2.dll). Откройте директорию с интерпретатором PHP, создайте директорию extensions, если её нет. Найдите вышеуказанный модуль – он есть в полных дистрибутивах PHP. Пропишите в php. ini (лежит в c:\ windows) строчку extension = php_gd2.dll (а заодно и extension_dir = "c:\php\extensions\", если такой нет). Пути могут быть другими. После этого всё должно заработать. Не «смешивайте» модули php_gd.dll и php_gd2.dll – интерпретатор будет ругаться на дублирование функций в библиотеках.

Заключение

Вот такие интересные вещи можно сделать при помощи пары графических функций – зато какая экономия на изготовлении и хранении дублирующих картинок. Не PhotoShop конечно, но для массового применения это самое то. Картинок на сайте очень много, качественно их выводить необязательно, главное чтобы быстро и просто. Скрипт получился не очень универсальный, но с моей задачей он справляется прекрасно. Следует отметить тонкую разницу между функциями imagecopyresized и imagecopyresampled. Первая просто изменяет размер картинки без сглаживания, она работает быстро, но результат – большие искажения. Вторая функция – ресемплирование, изменение размеров со сглаживанием. Работает она намного медленнее, но картинка получается чистой, как в профессиональных графических пакетах. О ресемплировании можно почитать здесь. Выбирать способ следует исходя из ваших потребностей – быстрее или качественнее. Возможно, вы реализуете другие идеи: задавать произвольный размер x и y, наличие или отсутствие надписи, формат выходного файла, рисование рамочки, водяных знаков, подписи на картинке шрифтами TrueType, вывод картинки-заглушки в случае ошибки.

Если кто заметил какие-то глупые или смешные места в программах, жду ваших комментариев.

Демонстрацию фотогалереи на основе описанной методики можно увидеть на http://foxweb.net.ru/photo/.

Сайт, для которого это всё изначально разрабатывалось – http://58region.ru/. Правда там используется усложнённый вариант – resize.php работает с тремя типами файлов, выводит надпись по желанию и выводит картинку-заглушку в случае отсутствия исходного файла.

Проверить работоспособность скриптов в онлайне и скачать исходники обеих версий можно тут http://foxweb.net.ru/test/resize/.

Всегда жду ваших комментариев. Удачи!

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
98K
01 сентября 2016 года
куку кукуся
0 / / 01.09.2016
+1 / -1
Мне нравитсяМне не нравится
1 сентября 2016, 16:20:16
масштабирование вообще не пашет, фотка получается образанная, но ужастного качества... что-то не то в расчётах
2.
95K
16 марта 2015 года
Сергей Гордиенко
0 / / 16.03.2015
+7 / -0
Мне нравитсяМне не нравится
16 марта 2015, 14:25:36
Код:
function resize_image($source, $out, $width, $height)

{



    $size    = getimagesize($source);

    $format  = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));

    $icfunc  = "imagecreatefrom" . $format;

    if (!function_exists($icfunc))

        return false;

    $rgb     = 0xFFFFFF;



    $x_ratio     = $width / $size[0];

    $y_ratio     = $height / $size[1];

    $ratio       = max($x_ratio, $y_ratio);

    $use_x_ratio = ($x_ratio == $ratio);

    $new_width   = $use_x_ratio ? $width : floor($size[0] * $ratio);

    $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);

    $new_left    = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);

    $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);



    $img     = imagecreatetruecolor($width, $height);

    imagefill($img, 0, 0, $rgb);

    $photo   = $icfunc($source);

    imagecopyresampled($img, $photo, $new_left, $new_top, 0, 0, $new_width,

                    $new_height, $size[0], $size[1]);

    imagepng($img, $out);

}
2.1.
95K
16 марта 2015 года
Сергей Гордиенко
0 / / 16.03.2015
+4 / -1
Мне нравитсяМне не нравится
16 марта 2015, 14:27:43
Я просто оставлю это туть =)
2.1.1.
99K
06 марта 2018 года
0 / / 06.03.2018
+1 / -1
Мне нравитсяМне не нравится
6 марта 2018, 12:17:34
Спасибо большое, добрый человек
3.
90K
25 марта 2013 года
Виктор Полещуков
0 / / 25.03.2013
+1 / -0
Мне нравитсяМне не нравится
25 марта 2013, 13:43:01
А как можно взять определенный размер фото что бы было например 90 * 110? Когда я загружаю фото если оно размером 90 на 110 то просто меняю имя, если фото 100 на 200 то переделываю ее по размер 90 на 110
3.1.
91K
19 мая 2013 года
Сергей Гордиенко
0 / / 19.05.2013
+2 / -0
Мне нравитсяМне не нравится
19 мая 2013, 03:30:50
В скрипте есть $w,$w,
Задай ещё одну переменную $h, и вставляй место второй $w, и будет тебе счастье.
4.
90K
10 марта 2013 года
Марат Долотов
0 / / 10.03.2013
+1 / -0
Мне нравитсяМне не нравится
10 марта 2013, 21:53:48
Странно не работает ни на винде ни на линуксе, php_gd2.dll есть, че код постарел что ли)?
5.
85K
16 сентября 2012 года
Dgeday
0 / / 16.09.2012
+1 / -0
Мне нравитсяМне не нравится
16 сентября 2012, 07:53:58
А как в переменную $str = "foxweb.net.ru"; загнать текст с явно указанной кодировкой, т.е. что бы кириллицу можно было нанести на изображение ?!...
5.1.
4
01 октября 2002 года
mike
3.7K / / 01.10.2002
+0 / -1
Мне нравитсяМне не нравится
10 октября 2012, 15:51:12
Все зависит от того какие шрифты установлены в GD. Обычно там CP-1251. Хотя не факт что русские шрифты там есть. Все зависит от конкретной сборки.

Если со встроенными шрифтами GD проблемы, можно использовать функции для работы с TTF шрифтами - функция imagetextttf http://php.net/manual/en/function.imagettftext.php
6.
25K
13 января 2007 года
larin
0 / / 13.01.2007
+4 / -2
Мне нравитсяМне не нравится
13 января 2007, 02:48:31
Да, в скрипте что-то есть. )))
Ошибки так точно ;)
Вот с какой целью автор написал следующее:
[php]
if ($w_src>$h_src)
imagecopyresized($dest, $src, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
[/php]
Вот это (max($w_src,$h_src)-min($w_src,$h_src) совершенно безсмысленная строка в контексте строки if ($w_src>$h_src). Ведь мы уже проверили, что больше ширина или высота, зачем еще высчитывать это функциями max & min???
Такая же ошибка и в блоке с вертикальной ориентацией.

Так же довольно расточительно создавать уменьшенные копии картинок "на лету". Это может себе позволить только сайт с посещаемостью не более 500-1000 уникальных посетителей в день. При увеличении же пользовательского трафика вам пришлют письмо из саппорта с "предложением" перейти на более дорогой тарифный план. ))))) Так, что картинки нужно создавать один раз, при загрузке на сервер.
7.
Аноним
+1 / -0
Мне нравитсяМне не нравится
21 октября 2005, 07:59:47
Большое спасибо за такой скрипт! Действительно классная вещь!
8.
Аноним
Мне нравитсяМне не нравится
19 сентября 2005, 17:52:46
В файл preview.php после комента // читаем список jpg-файлов в массив list нужно добавить:


if (!isset($i)) {$i=0;}
if (!isset($f)) {$f="";}
if (!isset($num)) {$num="";}
if (!isset($type)) {$type="";}
9.
Аноним
Мне нравитсяМне не нравится
6 сентября 2005, 07:35:53
неплохо, тольк вот не всегда в изображении самая информативная часть - середина...

так что имхо, пользователю в форме добавления нужно сделать 9 radio кнопок.

что-то вроде

+-----+
|o|o|o|
|o|x|o|
|o|o|o|
+-----+

собс-но часть изображения, которую оставляем... хотя и это тоже не уверен, что всегда даст 100% результат
10.
Аноним
+0 / -1
Мне нравитсяМне не нравится
29 августа 2005, 13:42:18
Скорость работы скрипта достаточно высокая, создал нечто похожее, только для прозрачных гифов.
WarWar насчет динамики непонял, есть функция head, с помощью нее можно определять сохранение в кеше.
11.
Аноним
Мне нравитсяМне не нравится
23 августа 2005, 15:20:38
Правильное предложение!
Хоть кто-то догдумался до этого :)

Можно повесить этот скрипт на закачку картинок, чтоб он генерировал нужные нам и сохранял их как статику ОДИН РАЗ. Тогда, там где картинок много, существенно сэкономятся ресурсы сервера и опять же не надо будет возиться с фотошопом. Со страницы будут вызываться статические картинки, ранее сгенерированные. То есть юзер закачает один файл, а сохранится на диске скажем три.

Можно натравить скрипт на директорию фоток с моря, и через полчасика получим директорию маленьких (для веб-альбома скажем).

Мысль пошла в массы, а уж там как хотите :)
12.
Аноним
Мне нравитсяМне не нравится
22 августа 2005, 12:57:28
Ну динамика это хорошо, но не в случае с картинками.
Ведь сколько раз мы добавляем новую картинку? Правильно один (не смотрим варианты ошибок).
А сколько раз пользователи просматривают картинку? Правильно много раз.

Так зачем же карждый раз геренить динамику, тем самым убирая картинки из кешей??

Лучше сразу сгенерить маленькую картинку и ее показывать пользователям. Причем тут неважно (по скорости) какую функцию для рисования для препросмотра выбрать быструю или качественную, тут однозначно будет выбиратся качественная функция: она то будет вызыватся всего один раз.
13.
Аноним
Мне нравитсяМне не нравится
13 августа 2005, 18:05:49
извратили до неузнаваемости :)
сам уже перестал разбираться :))
но всё равно спасибо
14.
Аноним
Мне нравитсяМне не нравится
13 августа 2005, 13:52:16
а еще проще вторую половину сделать вот так

$ratio = $w_src/$w; // width ratio
if ($h_src >= $w_src) { $ratio = $h_src/$w; }
15.
Аноним
Мне нравитсяМне не нравится
13 августа 2005, 13:49:08
там где

if ($w_src != $w) заменяем на
if ($w_src != $w || $h_src != $w)

и далее добавляем в этот раздел

// вычисление пропорций
$ratio = $w_src/$w; // width ratio
$ratio_h = $h_src/$w; // height ratio
if ($ratio_h >= $ratio) { $ratio = $ratio_h; }


тогда картинки будут и по диаганали и по вертикали лимитироваться шириной $w
16.
Аноним
+1 / -0
Мне нравитсяМне не нравится
12 августа 2005, 15:34:39
Мне было сложно.
Неделю проковырялся с этим Перлом, да в CPAN вылавливал инфу, чё там к чему... То ему версия не та, то пакетов не хватает.

Может кто знает, как от и до поставить ImageMagick для Perl?

В PHP красота! Всё упаковано, завёрнуто и готово к употреблению :)
17.
Аноним
Мне нравитсяМне не нравится
12 августа 2005, 13:15:26
>С самого начала работы над проектом я знал, что
>существует такая вещь, как ImageMagick для Perl. >Запустить этот чудо-модуль мне так и не удалось.
>Потом я перешёл на PHP, и понял, что Perl не совсем
>приспособлен для таких вещей. На PHP тоже можно
>формировать картинки с помощью модуля GD. Он хоть
>и попроще будет, но функции масштабирования в нём
>есть, что и требовалось.

Ну да, на php хоть в космос летай, хоть землю рой:D А заюзать тот же GD из PERL это слишком сложно, аха?8)
18.
Аноним
Мне нравитсяМне не нравится
11 августа 2005, 07:56:49
нормальный скрипт
длинноват правда
19.
Аноним
Мне нравитсяМне не нравится
11 августа 2005, 06:30:28
Сорри забираю обратно :)

// операции для получения квадратного файла
if (($type==0)||($type==1))

90х90 или 70х70 - зависит от $w:
if ($type == 0) $w = 70; // квадратная 70x70
if ($type == 1) $w = 90; // квадратная 90x90

То есть у нас два алгоритма: для прямоугольной какртинки и квадратной картинки. Я понимаю, что это аккуранее было бы на основе функций, однако этот скрипт - просто идея, дальшу - кто во что горазд.

Кстати, где ещё куча ошибок чем же текст такой кошмарный?
20.
Аноним
Мне нравитсяМне не нравится
11 августа 2005, 01:07:28
Эх, и правда! То что в исходнике - правильно. А статья писалась для версии без 70x70. Сорри!

Спасибо, что разглядели.
21.
Аноним
+1 / -1
Мне нравитсяМне не нравится
10 августа 2005, 07:38:23
Текст просто кошмарный. Ошибок куча. Например, вот одна.
=== текст ===
$type = 0 – из исходной картинки вырезается квадратная серединка и приводится к формату 90x90 пикселей;
$type = 1 – исходная картинка масштабируется пропорционально и приводится к ширине 218 пикселей (опционально наносится надпись);
$type = 2 – исходная картинка выводится без изменений.
=== код ===
if ($type == 0) $w = 70; // квадратная 70x70
if ($type == 1) $w = 90; // квадратная 90x90
if ($type == 2) $w = 218; // пропорциональная шириной 218
============

Так $type=0 - это 90х90 или 70х70?
Понятно, знающему человеку это не помеха. Но ведь знающему человеку такая статья и не нужна.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог