Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите зделать загрузку изображений с масштабированием
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Помогите зделать загрузку изображений с масштабированием

Страниц (1): [1]
 

1. Sergiiuss - 10 Апреля, 2009 - 11:02:07 - перейти к сообщению
Нужно зделать чтобы через форму загрузки:
CODE (text):
скопировать код в буфер обмена
  1. <form enctype="multipart/form-data" action="upload.php" method="post">
  2. <input type="hidden" name="MAX_FILE_SIZE" value="3000000"><!--размер файла в байтах-->
  3. Послать файл: <input name="userfile" type="file">
  4. <input type="submit" value="Загрузить рисунок">
  5. </form>

можно было загрузить рисунки таких форматов: JPG, JPEG, GIF, PNG, TIF

При этом на сервере в папке /images/ должно создаватся 3 копии данного рисунка различных размеров:
- первый с обязательной шириной 200 прикселей и высотой до 700 пикселей
- второй с обязательной шириной 100 прикселей
- третий с обязательной шириной 50 прикселей
при этом нужно удалить старое название загружаемого изображения и присвоить каждому из рисунков новое.

Еще было бы неплохо прописать все проверки на ошибки.

Вот к какому обработчику я пришол, но он только JPG формат загружает, и неполучается указать папку /images/ скприпт выдавал ошибку :

PHP:
скопировать код в буфер обмена
  1. <?
  2. $w = 200; // Максимальная ширина конечного файла
  3. $ww = 100;
  4. $www = 50;
  5. $q = 100; // Качество jpeg изображения
  6.  
  7. $file = $_FILES["userfile"]["name"]; // Записываем оригинальное имя файла
  8.  
  9. $src = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]); // Создаем временный файл
  10. $w_src = imagesx($src); // Определяем его линейный размер по горизонтали (ширина)
  11. $h_src = imagesy($src); // Определяем его линейный размер по вертикали (высота)
  12.  
  13. $dir = "$DOCUMENT_ROOT"; // Папка, куда будет записан уже преобразованный файл
  14.  
  15. $path = "$dir$file"; // Полный путь к файлу (включая и его имя)
  16.  
  17. if ($w_src != $w)  // Проверяем не равна ли уже исходная ширина необходимой нам
  18.   {
  19.    if ($w_src > $h_src or $h_src > $w_src) // Если изображение горизонтальное или вертикальное
  20.      {
  21.       $ratio = $w_src/$w; // Считаем соотношение пропорций
  22.       $w_dest = $w; // Конечная ширина будет равна максимальной
  23.       $h_dest = round($h_src/$ratio); // Считаем конечную высоту
  24.      }
  25.    else // Если изображение квадратное
  26.      {
  27.       $w_dest = $w; // Подставляем максимальные значения
  28.       $h_dest = $w;
  29.      }
  30.    $dest = imagecreatetruecolor($w_dest,$h_dest); // Создаем пустое изображение
  31.    imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
  32.    // Преобразуем исходное изображение в конечное (с новыми размерами).
  33.    // Функция использует ресемплинг, поэтому изображение будет лучшего
  34.    // качества, чем если использовать вместо imagecopyresampled функцию
  35.    // imagecopyresized
  36.   }
  37. else
  38.   {
  39.    $dest = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]);  
  40.    // Если исходная ширина равна нужной нам на выходе, то просто
  41.    // создаем временный файл без преобразований
  42.   }
  43. if (!file_exists ("$path")) // Проверяем не существует ли уже файл
  44.   {
  45.    $res = imagejpeg($dest,"$path",$q); // Копируем файл в папку
  46.    if ($res) // Если скопировано успешно, выдаем сообщение об успехе
  47.      {
  48.       echo "Файл закачан1";
  49.      }
  50.    else // Если не скопировано, то выдаем сообщение об ошибке
  51.      {
  52.       echo "Ошибка записи файла!";
  53.      }
  54. }
  55.  
  56. echo "<br>";
  57.  
  58.  
  59. if ($w_src != $ww)  // Проверяем не равна ли уже исходная ширина необходимой нам
  60.   {
  61.    if ($w_src > $h_src or $h_src > $w_src) // Если изображение горизонтальное или вертикальное
  62.      {
  63.       $ratio1 = $w_src/$ww; // Считаем соотношение пропорций
  64.       $w_dest1 = $ww; // Конечная ширина будет равна максимальной
  65.       $h_dest1 = round($h_src/$ratio1); // Считаем конечную высоту
  66.      }
  67.    else // Если изображение квадратное
  68.      {
  69.       $w_dest1 = $ww; // Подставляем максимальные значения
  70.       $h_dest1 = $ww;
  71.      }
  72.    $dest1 = imagecreatetruecolor($w_dest1,$h_dest1); // Создаем пустое изображение
  73.    imagecopyresampled($dest1, $src, 0, 0, 0, 0, $w_dest1, $h_dest1, $w_src, $h_src);
  74.    // Преобразуем исходное изображение в конечное (с новыми размерами).
  75.    // Функция использует ресемплинг, поэтому изображение будет лучшего
  76.    // качества, чем если использовать вместо imagecopyresampled функцию
  77.    // imagecopyresized
  78.   }
  79. else
  80.   {
  81.    $dest1 = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]);  
  82.    // Если исходная ширина равна нужной нам на выходе, то просто
  83.    // создаем временный файл без преобразований
  84.   }
  85. if (!file_exists ("a$path")) // Проверяем не существует ли уже файл
  86.   {
  87.    $res = imagejpeg($dest1,"a$path",$q); // Копируем файл в папку
  88.    if ($res) // Если скопировано успешно, выдаем сообщение об успехе
  89.      {
  90.       echo "Файл закачан2";
  91.      }
  92.    else // Если не скопировано, то выдаем сообщение об ошибке
  93.      {
  94.       echo "Ошибка записи файла!";
  95.      }
  96. }
  97.  
  98.  
  99.  
  100.  
  101. echo "<br>";
  102.  
  103.  
  104. if ($w_src != $www)  // Проверяем не равна ли уже исходная ширина необходимой нам
  105.   {
  106.    if ($w_src > $h_src or $h_src > $w_src) // Если изображение горизонтальное или вертикальное
  107.      {
  108.       $ratio2 = $w_src/$www; // Считаем соотношение пропорций
  109.       $w_dest2 = $www; // Конечная ширина будет равна максимальной
  110.       $h_dest2 = round($h_src/$ratio2); // Считаем конечную высоту
  111.      }
  112.    else // Если изображение квадратное
  113.      {
  114.       $w_dest2 = $www; // Подставляем максимальные значения
  115.       $h_dest2 = $www;
  116.      }
  117.    $dest2 = imagecreatetruecolor($w_dest2,$h_dest2); // Создаем пустое изображение
  118.    imagecopyresampled($dest2, $src, 0, 0, 0, 0, $w_dest2, $h_dest2, $w_src, $h_src);
  119.    // Преобразуем исходное изображение в конечное (с новыми размерами).
  120.    // Функция использует ресемплинг, поэтому изображение будет лучшего
  121.    // качества, чем если использовать вместо imagecopyresampled функцию
  122.    // imagecopyresized
  123.   }
  124. else
  125.   {
  126.    $dest2 = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]);  
  127.    // Если исходная ширина равна нужной нам на выходе, то просто
  128.    // создаем временный файл без преобразований
  129.   }
  130. if (!file_exists ("x$path")) // Проверяем не существует ли уже файл
  131.   {
  132.    $res = imagejpeg($dest2,"x$path",$q); // Копируем файл в папку
  133.    if ($res) // Если скопировано успешно, выдаем сообщение об успехе
  134.      {
  135.       echo "Файл закачан3";
  136.      }
  137.    else // Если не скопировано, то выдаем сообщение об ошибке
  138.      {
  139.       echo "Ошибка записи файла!";
  140.      }
  141.    imagedestroy($dest); // Освобождаем память
  142.    imagedestroy($src);
  143. }
  144. ?>

Помогите усовершенствовать Огорчение
2. Sergiiuss - 11 Апреля, 2009 - 09:46:28 - перейти к сообщению
Неужели на таком форуме никто ничем не может помочь?
3. Ch_chov - 12 Апреля, 2009 - 16:26:34 - перейти к сообщению
Вот готовая функция для изменения размеров любых изображений
PHP:
скопировать код в буфер обмена
  1. function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100) {
  2.         if(!file_exists($src)) return false;
  3.         if(($size = getimagesize($src))=== false) return false;
  4.           // Определяем исходный формат по MIME-информации, предоставленной
  5.           // функцией getimagesize, и выбираем соответствующую формату
  6.           // imagecreatefrom-функцию.
  7.         $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  8.         $icfunc = 'imagecreatefrom'.$format;
  9.         if(!function_exists($icfunc)) return false;
  10.        
  11.         $x_ratio = $width/$size[0];
  12.         $y_ratio = $height/$size[1];
  13.        
  14.         $ratio       = min($x_ratio, $y_ratio);
  15.         $use_x_ratio = ($x_ratio == $ratio);
  16.        
  17.         $new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
  18.         $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
  19.         $new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width) / 2);
  20.         $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
  21.        
  22.         $isrc = $icfunc($src);
  23.         $idest = imagecreatetruecolor($width, $height);
  24.        
  25.         imagefill($idest, 0, 0, $rgb);
  26.         imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
  27.         $new_width, $new_height, $size[0], $size[1]);
  28.        
  29.         imagejpeg($idest, $dest, $quality);
  30.        
  31.         imagedestroy($isrc);
  32.         imagedestroy($idest);
  33.         return true;
  34. }
4. Sergiiuss - 12 Апреля, 2009 - 18:24:37 - перейти к сообщению
Большое спасибо за ответ, но у меня есть некоторые сложности.
Хочу уточнить насчет параметров вашей функции.

1) $src - нужно присваивать = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]); ?

2) $dest - нужно присваивать $path ?
$dir = "$DOCUMENT_ROOT";
$file = $_FILES["userfile"]["name"];
$path = "$dir $file";

3) $width, $height - это мои - $w_dest, $h_dest ?

4) $rgb=0xFFFFFF, $quality=100 - когда я уже подставляю функцию их нужно прописывать?

img_resize ($src, $path, $w_dest, $h_dest);
или такого вида будет достаточно?


Вашу функцию нужно прописывать вместо моего следующего кода?
PHP:
скопировать код в буфер обмена
  1.    
  2. $dest2 = imagecreatetruecolor($w_dest2,$h_dest2); // Создаем пустое изображение
  3.    imagecopyresampled($dest2, $src, 0, 0, 0, 0, $w_dest2, $h_dest2, $w_src, $h_src);
  4.    // Преобразуем исходное изображение в конечное (с новыми размерами).
  5.    // Функция использует ресемплинг, поэтому изображение будет лучшего
  6.    // качества, чем если использовать вместо imagecopyresampled функцию
  7.    // imagecopyresized
  8.   }
  9. else
  10.   {
  11.    $dest2 = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]);  
  12.    // Если исходная ширина равна нужной нам на выходе, то просто
  13.    // создаем временный файл без преобразований
  14.   }
  15. if (!file_exists ("x.jpg")) // Проверяем не существует ли уже файл
  16.   {
  17.    $res = imagejpeg($dest2,"x.jpg",$q); // Копируем файл в папку
  18.    if ($res) // Если скопировано успешно, выдаем сообщение об успехе
  19.      {
  20.       echo "Файл закачан3";
  21.      }
  22.    else // Если не скопировано, то выдаем сообщение об ошибке
  23.      {
  24.       echo "Ошибка записи файла!";
  25.      }
  26.    imagedestroy($dest); // Освобождаем память
  27.    imagedestroy($src);
  28. }

А то чтото пока не работает, буду благодарен за ответ Радость
5. Ch_chov - 13 Апреля, 2009 - 15:31:14 - перейти к сообщению
Функция не моя. В интерете когда то накопал.
Вот здесь, то же самое, с описанием.
http://forum.php.su/topic.php?fo...=35&topic=12

$rgb=0xFFFFFF, $quality=100 можно не прописывать.
6. Sergiiuss - 16 Апреля, 2009 - 11:40:00 - перейти к сообщению
Большое спасибо, уже разобрался теперь все работает Радость

 

Powered by ExBB FM 1.0 RC1