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


Пользователь месяца
TimurR TimurR 1-й за Август
Очков активности: 726 3 темы, 35 сообщений, 11 баллов репутации
ТОП самых активных за этот месяц
  • Фотография ShowPrint
    #1

    ShowPrint (ShowPrint.ru)
    Очков активности: 207 2 темы, 17 сообщений, 6 баллов репутации

  • Фотография Ixman
    #2

    Ixman (o5cat.ru)
    Очков активности: 72 0 тем, 8 сообщений, 6 баллов репутации

  • Фотография WGN
    #3

    WGN (worldgamenews.com)
    Очков активности: 69 Вне конкурса за определение пользователя месяца

  • Фотография magnet
    #4

    magnet (rbfxdirect.com)
    Очков активности: 67.5 Вне конкурса за определение пользователя месяца

  • Фотография BLIK
    #5

    BLIK
    Очков активности: 30 Вне конкурса за определение пользователя месяца

  • Фотография Алексей111
    #6

    Алексей111
    Очков активности: 27 5 тем, 3 сообщения, 1 балл репутации

  • Фотография torix
    #7

    torix
    Очков активности: 22.5 2 темы, 9 сообщений, 1 балл репутации

  • Фотография TimurR
    #8

    TimurR
    Очков активности: 22.5 Вне конкурса за определение пользователя месяца

  • Фотография Developer
    #9

    Developer
    Очков активности: 21 1 тема, 11 сообщений, 1 балл репутации

  • Фотография profi
    #10

    profi (1informer.com)
    Очков активности: 18 0 тем, 12 сообщений, 1 балл репутации

  • Показать весь ТОП 10

Kwork.ru - услуги фрилансеров от 500 руб.

Поддержите форум! =)
Апдейты
  • Яндекс тИЦ: 19.11.2017
  • Яндекс выдача: 20.09.2018
Топ 5 участников по репутации


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

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

#1 lesli007

lesli007
  • Неактивные
  • 108 сообщений
  • Репутация: -4
0

Отправлено 20 March 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
  • Заблокированные
  • 1956 сообщений
  • Репутация: 71

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

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

#3 lesli007

lesli007
    Topic Starter
  • Неактивные
  • 108 сообщений
  • Репутация: -4

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

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

#4 surfer

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

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

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

#5 lesli007

lesli007
    Topic Starter
  • Неактивные
  • 108 сообщений
  • Репутация: -4

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

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

#6 ZiTosS

ZiTosS
  • Неактивные
  • 5148 сообщений
  • Репутация: 8

Отправлено 22 March 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 March 2011 - 00:02

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

#8 ZiTosS

ZiTosS
  • Неактивные
  • 5148 сообщений
  • Репутация: 8

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

lesli007,
1) Сначала определяем функцию. Не надо делать как у вас было ранее... определение функции было засунуто в условный блок.
2) код собираем, полный формат приводить не буду, опишу первую (определение функции) мою вставку кода как Код 1, а вторую - Код 2
<?php
Код 1
Код 2
?>
3) В общем случае, PHP хоть и интерпретируемый язык, но он не привередлив к месту определения функции, и если вы поменяете местами два этих куска кода и функция будет объявляться позже, чем вы её используете, PHP всё проглотит и обработает. Удачи вам.
  • 0

#9 lesli007

lesli007
    Topic Starter
  • Неактивные
  • 108 сообщений
  • Репутация: -4

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

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

#10 surfer

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

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

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

robot

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


Похожие темы

  Название темы Автор Статистика Последнее сообщение

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