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

Форум PHP

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

 

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

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

тема: Создание уменьшенных копий
 
 автор: glsv (Дизайнер)   (31.07.2004 в 04:10)   письмо автору
 
 

Нас по почте попросили прислать пример создания уменьшенных копий изображений. Ну и чтоб добру не пропадать выкладываю в форум - может еще кому понадобится.

PS: Cкрипт не универсальный. Просто чтобы показать как работать с GDLib.


<?php
    
// Создадим уменьшенную копию изображения
    
    // имя файла с которым будем работать
    // файл должен находиться в том же месте, что и этот скрипт
    
$source="test.jpg";
    
// определим размеры уменьшенного изображения
    
$d_w=133;
    
$d_h=100;
    
// вызываем функцию изменения размера
    
resizeimg($source133100); 
    
    
// выводим картинку на экран
    
?>
    <img src="small.jpg">


<?
function resizeimg($filename$w$h)
{
    
// определим коэффициент сжатия изображения, которое будем генерить
    
$ratio $w/$h;
    
// создадим пустое изображение по заданным размерам 
    
$dest_img imagecreatetruecolor($w$h);    
    
// зальём его белым цветом
    
imagefill($dest_img000xFFFFFF);  
    
// получим размеры исходного изображения
    
$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_img0000$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);        
}
?>

   
 
 автор: bonis   (05.08.2004 в 13:40)   письмо автору
 
   для: glsv (Дизайнер)   (31.07.2004 в 04:10)
 

Прикольно! Есть неточности в коде, но смысл был понятен... и код был переписан под свои нужды. !!!Оч полезная статейка!!!

   
 
 автор: glsv (Дизайнер)   (05.08.2004 в 13:55)   письмо автору
 
   для: bonis   (05.08.2004 в 13:40)
 

>Есть неточности в коде.
Тот скрипт, что я выложил сильно нигде не тестировался, потому если вы увидели ошибки в коде, то может поделитесь? Вместо доведем его до ума :)

   
 
 автор: Олег   (03.01.2005 в 16:01)   письмо автору
 
   для: glsv (Дизайнер)   (05.08.2004 в 13:55)
 

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

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

   
 
 автор: glsv (Дизайнер)   (03.01.2005 в 16:24)   письмо автору
 
   для: Олег   (03.01.2005 в 16:01)
 

>т.е. его уменьшать и если оно не вписывается создаются пустые черные
Да, это так:
Я выложу сегодня поправленный вариант – ближе к ночи.

   
 
 автор: Олег   (03.01.2005 в 16:29)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 16:24)
 

Огромное спасибо !!!!!!!!!! :))))
Я буду постоянно посещать ваш Форум и задовать вам вопросы :))) Еще раз вам спасибо !!
ЖДУ СКРИПТ :)

   
 
 автор: Олег   (03.01.2005 в 21:00)   письмо автору
 
   для: Олег   (03.01.2005 в 16:29)
 

ЖДУ СКРИПТ :)..........

   
 
 автор: glsv (Дизайнер)   (03.01.2005 в 21:51)   письмо автору
 
   для: Олег   (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_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]==2)  imagejpeg($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;         
  }  
?>


Вызов функции осуществляется следующим образом:

<?
  resizeimg
($bigimage$smallimage133100);
?>

$bigimage - имя файла с изображением, которое нужно смасштабировать
$smallimage - имя файла, куда надо записать смасштабированное изображение.
133 и 100 - это максимальные размеры уменьшенной копии изображения (в пикселях) по ширине и высоте соответсвенно.

   
 
 автор: Олег   (03.01.2005 в 21:56)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 21:51)
 

щас попробую.... :)

   
 
 автор: Олег   (03.01.2005 в 22:10)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 21:51)
 

А куда вписовать имя фаила ?

//// Так у вас
$filename = "../".$filename;
$smallimage = "../".$smallimage;

//// Так надо ?
$filename = "1.jpg".$filename;
$smallimage = "small.jpg".$smallimage;

   
 
 автор: glsv (Дизайнер)   (03.01.2005 в 22:22)   письмо автору
 
   для: Олег   (03.01.2005 в 22:10)
 

Нужно вызывать функцию так:

<? 
  $bigimage 
"bigimage.jpg"
  
$smallimage "smallimage.jpg"
  
resizeimg($bigimage$smallimage133100); 
?>


Код был взят с реального приложения, поэтому есть свои особенности.
Если файл с кодом и изображения лежат в одной директории, то вот эти строки нужно закомментировать.

<?
//$filename = "../".$filename; 
// Имя файла с уменьшенной копией. 
//$smallimage = "../".$smallimage; 
?>


Иначе подразумевалось, что изображения лежат на один уровень выше скрипта.

   
 
 автор: Олег   (03.01.2005 в 22:17)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 21:51)
 

Все разобрался, тестирую

   
 
 автор: Олег   (03.01.2005 в 22:25)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 21:51)
 

Еще вопрос, у вас есть такая вещь как
// чистим память от созданных изображений

Я так понимаю уменьшеная картинка должна удалятсяпосле закрытия броузера ?

   
 
 автор: glsv (Дизайнер)   (03.01.2005 в 23:21)   письмо автору
 
   для: Олег   (03.01.2005 в 22:25)
 

>Я так понимаю уменьшеная картинка должна удалятсяпосле закрытия броузера ?
Нет. Картина сохраняется в файл и никуда не удаляется.

Метод imagedestroy() чистит память сервера занятую создаваемыми изображениями во внутреннем формате GD.

   
 
 автор: Олег   (03.01.2005 в 23:52)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 23:21)
 

Понятно, а как сделать чтоб удалялась ?

   
 
 автор: glsv (Дизайнер)   (04.01.2005 в 00:52)   письмо автору
 
   для: Олег   (03.01.2005 в 23:52)
 

Для этого предназначена функция
unlink("имя_удаляемого_файла");

   
 
 автор: Олег   (04.01.2005 в 01:29)   письмо автору
 
   для: glsv (Дизайнер)   (04.01.2005 в 00:52)
 

т.е. в код просто вставляю unlink("small.jpg"); и по закрытию броузера удаляется созданый фаил ? Щас опробую :)

   
 
 автор: Олег   (04.01.2005 в 02:16)   письмо автору
 
   для: glsv (Дизайнер)   (04.01.2005 в 00:52)
 

Ну эта команда unlink("имя_удаляемого_файла");
удаляет этот фаил сразу а как сделать чтоб он удалялся по закрытию окна броузера ?

   
 
 автор: glsv (Дизайнер)   (04.01.2005 в 03:22)   письмо автору
 
   для: Олег   (04.01.2005 в 02:16)
 

>а как сделать чтоб он удалялся по закрытию окна броузера ?
А дело в том, что PHP не может узнать, что окно браузера было закрыто и следовательно удалить файл.
Какую задачу Вы хотите решить? Возможно, что писать в файлы вообще ничего не нужно…, но нужно определиться с задачей.

   
 
 автор: grigstar   (16.01.2005 в 07:13)   письмо автору
 
   для: glsv (Дизайнер)   (03.01.2005 в 21:51)
 

Все замечательн, но есть одна проблема. Нужно вставить уменьшение изображения на реальном сайте.
Но библиотека GD, которая там стоит уже не поддерживает функцию CreateImageFromGif.
Естессно, на хостинговом сервере никто ее менять не станет.
Что делать?
Может подскажете где старую либу найти?

   
 
 автор: glsv (Дизайнер)   (16.01.2005 в 10:44)   письмо автору
 
   для: grigstar   (16.01.2005 в 07:13)
 

>Но библиотека GD, которая там стоит уже не поддерживает функцию CreateImageFromGif.
imagecreatefromgif() имеется ввиду?

Хм.. как странно. Ранее не подерживалась функция imagegif() - пока не истек срок действия патента на формат GIF, но imagecreatefromgif() работала всегда.

>Что делать?
Может подскажете где старую либу найти?
Так Вы же все равно не сможете установить другую версию библиотеки на хостинге...
Если недоступна функция imagecreatefromgif(), то это значит Вы не сможете работать с файлами формата GIF.
Или же речь идет о функции imagegif()?

   
 
 автор: Akira   (21.11.2005 в 00:52)   письмо автору
 
   для: 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 строки, смотря какой файл. не могу понять, что на хостинге не так.

   
 
 автор: GRain   (01.02.2005 в 14:45)   письмо автору
 
   для: 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);

и стороку
$ratio = $w/$h;

разместить под предлагаемым кодом.
вызов функции естественно изменяется
resizeimg($bigimage, $smallimage);

и инициализация функции тоже
function resizeimg($filename, $smallimage){...}

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

   
 
 автор: glsv (Дизайнер)   (01.02.2005 в 23:31)   письмо автору
 
   для: GRain   (01.02.2005 в 14:45)
 

В приведенном мною коде масштабирование, на самом деле, осуществляется по пропорциям исходного изображения.
Параметры $w=133 и $h=100 являются ограничителями максимальных размеров уменьшенной копии по ширине и высоте. Т.е. при масштабировании учитывается только один из этих параметров, а второй размер высчитывается автоматически исходя из пропорций исходного изображения.

Хотя, в моем примере тоже правильней и корректней было бы указать равные ограничители по ширине и высоте. Например $w=133 и $h=133.

   
 
 автор: Niemand   (16.06.2005 в 00:31)   письмо автору
 
   для: glsv (Дизайнер)   (01.02.2005 в 23:31)
 

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

   
 
 автор: babilonian   (27.01.2006 в 20:54)   письмо автору
 
   для: 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

С хедерами вроде бы понятно, должны раньше отсылаться, но как сделать чтобы картинка выходила в моем дизайне и не такими крокозяблами? Никак не могу разобраться(

[поправлено модератором]

   
 
 автор: cheops   (27.01.2006 в 21:54)   письмо автору
 
   для: babilonian   (27.01.2006 в 20:54)
 

Так не получится, вывод нескольких изображений на одной странице описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=5173

PS Под новый вопрос лучше заводить новую тему, сославшись на старую.

   
Rambler's Top100
вверх

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