Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118

Сохранение анимации gif при загрузке файла

18.12.2013, 04:03. Показов 5902. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На сайт требуется загружать изображения некоторые из которых являются анимированными (в формате gif). Впоследствии эти изо выводятся в разных местах, в некоторых не в полный размер.
Сделал сохранение и вывод с ресайзом, но при этом пропадает анимация (изо становится статичным), хотя сохраняется в формате gif.
Порыл инет в поисках решения проблеммы, везде отсылают к ImageMagick. Но мне это показалось излишне сложным...
Может кто-нибудь может подсказать способ сохранения анимации проще???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2013, 04:03
Ответы с готовыми решениями:

Изменение размера анимированного GIF файла без уничтожения анимации
Мне нужно изменить размеры файла GIF так, чтобы анимация не пропадала

Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации
Всем привет.. задача такая: Необходимо открыть файл GIF.. Например, как в этой статье про декодирование.. ...

Сохранение анимации в GIF-файл
можно ли как-нибудь преоброзовать формат файлф из паскаля graphabc где происходит некоторое движение тел, вдругой формат-к примеру gif?...

11
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
18.12.2013, 12:41
Dozentos, вот статья на Хабре: http://habrahabr.ru/post/186084/. Там описывается как раз то, что Вам нужно. Если не хотите читать статью (хотя она небольшая) - то читайте ниже:
- Скачиваем php класс отсюда: https://github.com/Yuriy-Khomenko/GIF_eXG
- Затем пишем такой код и пользуемся:
PHP
1
2
3
4
5
6
 # Подключаем класс
 require_once "gif_exg.php";
 
 $nGif = new GIF_eXG("../image/src.gif",1); # Тут открываем исходный файл GIF
 $nGif->resize("../image/dst1.gif",180,180,1,0); # Изменяем размеры до 180х180 (для примера)
 $nGif->resize("../image/dst2.gif",150,150,0,0); # # Изменяем размеры до 150х150 (для примера)
небольшие замечания по передаваемым параметрам:
— в конструкторе второй параметр отвечает за оптимизацию структуры, если (1) то выходной файл более компактен по размеру, если (0) то сохранится вся исходная структура;
— в единственной открытой функции resize четвертый параметр указывает соблюдать ли симметрию (1), или не соблюдать (0);
— пятый параметр экспериментальный: (1) попытаться интерполировать пикселы, (0) без интерполяции (рекомендуется);
0
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118
18.12.2013, 16:52  [ТС]
Спасибо.
Я правильно понимаю, что dst1.gif - это новое имя файла, сохранённого на сервере?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
18.12.2013, 16:55
Цитата Сообщение от Dozentos Посмотреть сообщение
Я правильно понимаю, что dst1.gif - это новое имя файла, сохранённого на сервере?
Да, я тоже так понимаю. Туда нужно вписывать путь до нового изображения. Класс писал не я, просто нашёл для вас.
1
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118
19.12.2013, 17:49  [ТС]
Наверное я уже наглею, но может вы подскажете ещё такой момент:
Предложенный класс прекрасно работает, когда нужно сохранить изо gif на сервере. А если нужно вывести уже сохранённое на сервере изо на странице, но изменив его размер???
Т.е. для jpg я делаю так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$image = imagecreatefromjpeg($fname); //resourse-1
        
           $ow = imagesx($image);
       $oh = imagesy($image);
       
           if ($ow > $oh){
               $coeff = $max/$ow;
           }else{
               $coeff = $max/$oh;
           }
           $w = round($ow * $coeff);
           $h = round($oh * $coeff);
       $temp = imagecreatetruecolor($w, $h); //resourse-2
           imagecopyresampled($temp, $image, 0, 0, 0, 0, $w, $h, $ow, $oh);
           
           imagejpeg($temp);
           
           imagedestroy($temp);
           imagedestroy($image);
           
           header('Content-Type: image/jpeg');
                   return $temp;
А как мне вывести gif с сохранением анимации?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
19.12.2013, 18:21
Dozentos, т.е. вы хотите на лету изменять размеры изображения? Если да, то можно сделать так:
- Заменить в классе с хабра эту строку:
PHP
1
function resize($file_dst, $new_x, $new_y, $pr, $sm) {
На эту:
PHP
1
function resize($new_x, $new_y, $pr, $sm, $file_dst=false) {
И в том же файле эту строку:
PHP
1
file_put_contents($file_dst, $gm . $this->gl_mod . $f_buf . (iconv_strlen($con) >= 19 ? $con : "\x21"));
На эти строки:
PHP
1
2
3
4
5
6
7
8
$image = $gm . $this->gl_mod . $f_buf . (iconv_strlen($con) >= 19 ? $con : "\x21");
        if( $file_dst )
            file_put_contents($file_dst, $image);
        else
        {
            header('Content-Type: image/gif');
            echo $image;
        }
Будьте вниматетельны! Не сотрите ничего лишнего! Вызывать функцию изменения размера так:
PHP
1
2
$nGif->resize(180,180,1,0, 'name.gif'); # C сохранением в файл
$nGif->resize(180,180,1,0); # Без сохранения в файл, сразу в браузер
0
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118
19.12.2013, 19:10  [ТС]
Сейчас попробую. Спасибо.
Кстати, при использовании этого класса мне по началу выдавало ошибки (не фатальные). В 318 строке неизвестная переменная $f_buf, и в 267 невозможно выполнить ob_end_clean();, видимо это последствия предыдущей ошибки.
После подавления сообщений об ошибках с помощью @ всё стало работать совсем хорошо. Но может всё же я что-то сделал не правильно?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
19.12.2013, 19:12
У меня тоже Notice вылетали, я не стал разбираться почему.
0
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118
19.12.2013, 22:01  [ТС]
Внёс предложенные вами изменения. В принципе работает... Что касается сохранения - вообще всё прекрасно. А вот изменение размеров на лету...
В мозилле более менее, только грузится долго... А вот в Хроме караул. Изо мигает, а через какое-то время пропадает вовсе...
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.12.2013, 07:20
Может у вас изображения очень большие на входе или на выходе получаются, поэтому либо долго обрабатывается, либо долго грузится соответственно. Может быть вам стоит пересмотреть алгоритм ваших скриптов и сделать сохранение с определёнными размерами, а потом выводить? Потому что при увеличении количества посетителей вашего сайта, обработка на лету будет сильно тормозить сервер.
0
 Аватар для Dozentos
5 / 6 / 0
Регистрация: 26.10.2013
Сообщений: 118
20.12.2013, 22:59  [ТС]
Решил от ресайза на лету отказаться. А чисто на сохранение класс работает прекрасно. Спасибо!
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
21.12.2013, 12:08
Да не за что .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2013, 12:08
Помогаю со студенческими работами здесь

TextOut в TPicture при загрузке gif-файла
Всем доброго времени суток. Читаю GIF картинку из файла в TPictureTPicture *pic=new TPicture(); ...

"Ошибка заголовка gif-файла" при загрузке его из Stream-а
почему вот при таком коде - pac:=TPaker.Create('pack.pck'); stream:=TMemoryStream.Create; pac.ReadRecord(0,stream); ...

Запуск анимации gif при клике на нее
Подскажите, как сделать так, чтобы анимационная картинка включалась/выключалась по клику? Например, есть человек, который стоит (формат...

Показывать GIF-анимацию при загрузке формы
В общем есть две формы. ПРи нажатии на кнопку запускается длительная операция после которой открывается вторая форма. Хотелось бы вместо...

Отображение анимации на контролах. Например при загрузке данных с сервреа, нужно, чтобы крутились песочные часы в ListView, при этом не отображая...
...другое содержимое. То есть я хочу сделать анимацию ожидания получения данных, но не только для ListView, но и для любого другого UI...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru