Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Загрузка картинки с последющим тройным изменением размера

#1 lesli007

lesli007
  • Пользователь
  • 108 сообщений
  • Репутация: -4
0

Отправлено 20 Март 2011 - 16:09

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

Так выглядит форма:
Изображение

Код:
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Загрузка изображения с изменением размеров</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>Загрузка изображения с изменением размеров</h1>
<?php

// код php приведен ниже
...

?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<br>
<label>Тип загрузки</label>
<br>
<select name="file_type">
<option value="1">Эскиз</option>
<option value="2">Большое изображение</option>
</select>
<br>
<label>Поворот</label>
<br>
<input type="text" name="file_rotate">
<br>
<input type="submit" value="Загрузить">
</form>
</body>
</html>


<?php

// Пути загрузки файлов
$path = 'i/';
$tmp_path = 'tmp/';
// Массив допустимых значений типа файла
$types = array('image/gif', 'image/png', 'image/jpeg');
// Максимальный размер файла
$size = 1024000;

// Обработка запроса
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Проверяем тип файла
if (!in_array($_FILES['picture']['type'], $types))
die('<p>Запрещённый тип файла. <a href="?">Попробовать другой файл?</a></p>');

// Проверяем размер файла
if ($_FILES['picture']['size'] > $size)
die('<p>Слишком большой размер файла. <a href="?">Попробовать другой файл?</a></p>');

// Функция изменения размера
// Изменяет размер изображения в зависимости от type:
// type = 1 - эскиз
// type = 2 - большое изображение
// rotate - поворот на количество градусов (желательно использовать значение 90, 180, 270)
// quality - качество изображения (по умолчанию 75%)
function resize($file, $type = 1, $rotate = null, $quality = null)
{
global $tmp_path;

// Ограничение по ширине в пикселях
$max_thumb_size = 200;
$max_size = 600;

// Качество изображения по умолчанию
if ($quality == null)
$quality = 75;

// Cоздаём исходное изображение на основе исходного файла
if ($file['type'] == 'image/jpeg')
$source = imagecreatefromjpeg($file['tmp_name']);
elseif ($file['type'] == 'image/png')
$source = imagecreatefrompng($file['tmp_name']);
elseif ($file['type'] == 'image/gif')
$source = imagecreatefromgif($file['tmp_name']);
else
return false;

// Поворачиваем изображение
if ($rotate != null)
$src = imagerotate($source, $rotate, 0);
else
$src = $source;

// Определяем ширину и высоту изображения
$w_src = imagesx($src);
$h_src = imagesy($src);

// В зависимости от типа (эскиз или большое изображение) устанавливаем ограничение по ширине.
if ($type == 1)
$w = $max_thumb_size;
elseif ($type == 2)
$w = $max_size;

// Если ширина больше заданной
if ($w_src > $w)
{
// Вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);

// Создаём пустую картинку
$dest = imagecreatetruecolor($w_dest, $h_dest);

// Копируем старое изображение в новое с изменением параметров
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);

// Вывод картинки и очистка памяти
imagejpeg($dest, $tmp_path . $file['name'], $quality);
imagedestroy($dest);
imagedestroy($src);

return $file['name'];
}
else
{
// Вывод картинки и очистка памяти
imagejpeg($src, $tmp_path . $file['name'], $quality);
imagedestroy($src);

return $file['name'];
}
}

$name = resize($_FILES['picture'], $_POST['file_type'], $_POST['file_rotate']);

// Загрузка файла и вывод сообщения
if (!@copy($tmp_path . $name, $path . $name))
echo '<p>Что-то пошло не так.</p>';
else
echo '<p>Загрузка прошла удачно <a href="' . $path . $_FILES['picture']['name'] . '">Посмотреть</a>.</p>';

// Удаляем временный файл
unlink($tmp_path . $name);
}

?>

 

 

  • 0

#2 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 20 Март 2011 - 16:28

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

#3 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 21 Март 2011 - 20:50

Помогите пожалуйста, можно поподробнее?
  • 0

#4 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 21 Март 2011 - 21:03

я немного по-другому делаю, могу свое решение предложить
  • 0

#5 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 21 Март 2011 - 21:17

было бы замечательно
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Март 2011 - 17:52

lesli007, Первым делом я бы оптимизировал функцию и добавил в неё параметры:
  • под каким именем сохранить картинку (не обязательный)
  • до каких размеров (в px)
  • что взять за границу сжатия (ширину или высоту)
/**
*
* $file - массив с данными (именем файла, временным именем файла, типом и т.д.)
* $dim_resize - размер, до которого будем изменять изображение (увеличивать или уменьшать)
* $side - на какую из сторон будем смотреть - ширина ("w") или высота "h"
* $save_file - имя файла с расширением, под которым хотим сохранить картинку
* $rotate - поворот картинки
* $quality - качество выходной картинки (для привьюшек можно и поменьше от 1 до 100)
*
*/

function resize($file, $dim_resize, $side = "w", $save_file="", $rotate = null, $quality = null)
{
// Если указано имя для сохранения, то изменяем стандартное
$file['name'] = ( $save_file != "" ) ? $save_file : $file['name'];

// Качество изображения по умолчанию
if ($quality == null)
$quality = 75;

// Cоздаём исходное изображение на основе исходного файла
if ($file['type'] == 'image/jpeg')
$source = imagecreatefromjpeg($file['tmp_name']);
elseif ($file['type'] == 'image/png')
$source = imagecreatefrompng($file['tmp_name']);
elseif ($file['type'] == 'image/gif')
$source = imagecreatefromgif($file['tmp_name']);
else
return false;

// Поворачиваем изображение
$src = ( $rotate != null ) ? imagerotate($source, $rotate, 0) : $source;

// Определяем ширину и высоту изображения
$w_src = imagesx($src);
$h_src = imagesy($src);

// определяем коэффициент сжатия/растяжения
$ratio = ( $side == "w" ) ? $w_src / $dim_resize : $h_src / $dim_resize;

$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);

// Создаём пустую картинку
$dest = imagecreatetruecolor($w_dest, $h_dest);

// Копируем старое изображение в новое с изменением параметров
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);

// Вывод картинки и очистка памяти
imagejpeg($dest, $file['path_save'].$file['name'], $quality);
imagedestroy($dest);
imagedestroy($src);

return $file['path_save'].$file['name'];
}


А теперь по использованию функции:
// Пути загрузки файлов
$path = 'i/';
$tmp_path = 'tmp/';

// Массив допустимых значений типа файла
$types = array('image/gif', 'image/png', 'image/jpeg');

// Максимальный размер файла
$size = 1024000;

// Обработка запроса
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Проверяем тип файла
if (!in_array($_FILES['picture']['type'], $types))
die('<p>Запрещённый тип файла. <a href="?">Попробовать другой файл?</a></p>');

// Проверяем размер файла
if ($_FILES['picture']['size'] > $size)
die('<p>Слишком большой размер файла. <a href="?">Попробовать другой файл?</a></p>');

$file = $_FILES['picture']; // копируем параметры картинки в переменную $file
$file['save_patch'] = $tmp_path; // добавляем к ним путь для сохранения resize-картинок

$files_resized = array(); // здесь будут храниться путь+имя resize-файлов

// сжимаем/увеличиваем по ширине картинку до 300px, высота - по пропорциям
$files_resized[] = resize($file, 300, "w", "file1_300w.jpg", $_POST['file_rotate']);

// сжимаем/увеличиваем по высоте картинку до 60px, ширина - по пропорциям
$files_resized[] = resize($file, 60, "h", "file2_60h.jpg", $_POST['file_rotate']);

// сжимаем/увеличиваем по ширине картинку до 500px, высота - по пропорциям
$files_resized[] = resize($file, 500, "w", "file3_500w.jpg", $_POST['file_rotate']);

// Удаляем временный файл загруженного оригинала
unlink($tmp_path . $file['tmp_name']);
}

Конечно в коде много недочетов(таких как сохранение любой картинки с заголовками JPG) и функция не универсальная(Имя файла приходится указывать самому, притом расширение картинки лучше определить). Также из кода убрал пересохранение файла во временный каталог, определение переменной $tmp_path глобальной, копирование картинки после ресайза.
Конечно при таком коде нет уверенности, что файл сохранится по назначению (прав хватит ли). Но не стал заморачиваться, кому надо, тот доработает и с расширениями, и с копированием, и с именами так как ему нужно будет.
  • 0

#7 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 23 Март 2011 - 00:02

вижу что внизу несколько картинок создаются - придумать лишь параметры. огромное спасибо Вам! Подскажите только, эти 2 кода друг за другом поставить?
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Март 2011 - 18:23

lesli007,
1) Сначала определяем функцию. Не надо делать как у вас было ранее... определение функции было засунуто в условный блок.
2) код собираем, полный формат приводить не буду, опишу первую (определение функции) мою вставку кода как Код 1, а вторую - Код 2
<?php

Код 1
Код 2

?>
3) В общем случае, PHP хоть и интерпретируемый язык, но он не привередлив к месту определения функции, и если вы поменяете местами два этих куска кода и функция будет объявляться позже, чем вы её используете, PHP всё проглотит и обработает. Удачи вам.
  • 0

#9 lesli007

lesli007
    Topic Starter
  • Пользователь
  • 108 сообщений
  • Репутация: -4

Отправлено 23 Март 2011 - 21:09

Подскажите пожалуйста! Я пытаюсь сделать в одной картинок ширину 2056. Если ее делаю то ничего не происходит.
При проверке на ошибки Allowed memory size of 33554432 bytes exhausted (tried to allocate 8400 bytes). Как изменить уровень доступной памяти?
  • 0

#10 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 23 Март 2011 - 21:18

как вы делаете?
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru