X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
> Загрузка картинки с последющим тройным изменением размера
lesli007
lesli007
Topic Starter сообщение 20.3.2011, 17:09; Ответить: lesli007
Сообщение #1


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

Так выглядит форма:
[img]http://webformyself.com/wp-content/uploads/2010/33/2.jpg[/img]

Код:
<!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]<?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);
}

?>[/php]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 20.3.2011, 17:28; Ответить: sc2r2bey
Сообщение #2


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 21.3.2011, 21:50; Ответить: lesli007
Сообщение #3


Помогите пожалуйста, можно поподробнее?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 21.3.2011, 22:03; Ответить: sc2r2bey
Сообщение #4


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 21.3.2011, 22:17; Ответить: lesli007
Сообщение #5


было бы замечательно
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 22.3.2011, 18:52; Ответить: ZiTosS
Сообщение #6


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

[php]/**
*
* $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'];
}[/php]

А теперь по использованию функции:
[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>');

$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']);
}[/php]
Конечно в коде много недочетов(таких как сохранение любой картинки с заголовками JPG) и функция не универсальная(Имя файла приходится указывать самому, притом расширение картинки лучше определить). Также из кода убрал пересохранение файла во временный каталог, определение переменной $tmp_path глобальной, копирование картинки после ресайза.
Конечно при таком коде нет уверенности, что файл сохранится по назначению (прав хватит ли). Но не стал заморачиваться, кому надо, тот доработает и с расширениями, и с копированием, и с именами так как ему нужно будет.


Поблагодарили: (0)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 23.3.2011, 1:02; Ответить: lesli007
Сообщение #7


вижу что внизу несколько картинок создаются - придумать лишь параметры. огромное спасибо Вам! Подскажите только, эти 2 кода друг за другом поставить?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 23.3.2011, 19:23; Ответить: ZiTosS
Сообщение #8


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

Код 1
Код 2

?>

3) В общем случае, PHP хоть и интерпретируемый язык, но он не привередлив к месту определения функции, и если вы поменяете местами два этих куска кода и функция будет объявляться позже, чем вы её используете, PHP всё проглотит и обработает. Удачи вам.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
lesli007
lesli007
Topic Starter сообщение 23.3.2011, 22:09; Ответить: lesli007
Сообщение #9


Подскажите пожалуйста! Я пытаюсь сделать в одной картинок ширину 2056. Если ее делаю то ничего не происходит.
При проверке на ошибки Allowed memory size of 33554432 bytes exhausted (tried to allocate 8400 bytes). Как изменить уровень доступной памяти?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 23.3.2011, 22:18; Ответить: sc2r2bey
Сообщение #10


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыКто и зачем покупает картинки обезьян по $200 тысяч?
NFT
167 metvekot 27096 6.3.2024, 21:58
автор: Boymaster
Открытая тема (нет новых ответов) BuxarVideoUploader - Автоматическое скачивание и загрузка видео из любых/ на любые видео хостинги (YouTube, TikTok, Instagram, Facebook, Яндекс Дзен, Вконтакте, Одноклассники, Rutube, Dailymotion, d.tube, Telegram и т.д.
0 BuxarNET 1194 19.7.2023, 5:58
автор: BuxarNET
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыВыравнивание картинки по центру между текстом
10 NikN 2630 6.1.2021, 23:24
автор: buypushplatform
Открытая тема (нет новых ответов) Нужно добавить картинки на сайт
И видео
2 Ksardas777 4078 17.11.2018, 10:41
автор: Intuit89
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыЗагрузка фотографий на сайте.
8 Napoleon-007 1718 5.3.2018, 10:51
автор: Evgeniy3200


 



RSS Текстовая версия Сейчас: 28.3.2024, 18:07
Дизайн