Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572

Как сохранить gif картинку с анимацией уменьшив ширину и высоту

21.08.2019, 17:48. Показов 1063. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно уменьшить картинку gif при этом сохранив анимацию и скопировать получившийся результат в какую-нибудь папку. Я посмотрела многие ресурсы, нашла только форум где кто-то задавал похожий вопрос. Ссылку оставлять не буду так как этот сайт тоже по php могут забанить, а скажу лишь то что тому кто задавал вопрос на форуме предложили посмотреть скрипт phpBB (functions_posting.php), там что-то похожее есть. Я так и сделала скачала скрипт phpBB, нашла этот файл он оказался не маленьким на 2700 строк кода. Саму функцию было найти не трудно, когда я перетащила часть кода на тестовый сайт и переделала скрипт, то при сохранении уменьшенной копии картинки 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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?php
    function get_supported_image_types($type = false)
    {
        if (@extension_loaded('gd'))
        {
            $format = imagetypes();
            $new_type = 0;
        
            if ($type !== false)
            {
                // Type is one of the IMAGETYPE constants - it is fetched from getimagesize()
                switch ($type)
                {
                    // GIF
                    case IMAGETYPE_GIF:
                        $new_type = ($format & IMG_GIF) ? IMG_GIF : false;
                    break;
    
                    // JPG, JPC, JP2
                    case IMAGETYPE_JPEG:
                    case IMAGETYPE_JPC:
                    case IMAGETYPE_JPEG2000:
                    case IMAGETYPE_JP2:
                    case IMAGETYPE_JPX:
                    case IMAGETYPE_JB2:
                        $new_type = ($format & IMG_JPG) ? IMG_JPG : false;
                    break;
    
                    // PNG
                    case IMAGETYPE_PNG:
                        $new_type = ($format & IMG_PNG) ? IMG_PNG : false;
                    break;
    
                    // WBMP
                    case IMAGETYPE_WBMP:
                        $new_type = ($format & IMG_WBMP) ? IMG_WBMP : false;
                    break;
                }
            }
            else
            {
                $new_type = array();
                $go_through_types = array(IMG_GIF, IMG_JPG, IMG_PNG, IMG_WBMP);
    
                foreach ($go_through_types as $check_type)
                {
                    if ($format & $check_type)
                    {
                        $new_type[] = $check_type;
                    }
                }
            }
    
            return array(
                'gd'        => ($new_type) ? true : false,
                'format'    => $new_type,
                'version'   => (function_exists('imagecreatetruecolor')) ? 2 : 1
            );
        }
    
        return array('gd' => false);
    }   
      
    //Функция масштабирования изображения при получении высоты и ширины картинки   
    function get_img_size_format($width, $height, $width_src = false, $height_src = false)
    {
        if (($width_src < 0) || ($height_src < 0)) {
        echo "Некорректные входные параметры";
        return false;
      }
      if (!$height_src) $height_src = $width_src / ($width / $height);
      if (!$width_src) $width_src = $height_src / ($height / $width);
      
      
      return array(
                round($width_src),
                round($height_src)
            );
      
        
    }
        
        $source = "./temp/bbbbb.gif";
        
        $dimension = @getimagesize($source);
        list($width, $height, $type, ) = $dimension;
        
        $types = array("", "gif", "jpeg", "png"); // Массив с типами изображений
        $ext = $types[$type]; // Зная "числовой" тип изображения, узнаём название типа
        $destination = "./temp2/photo.".$ext;
        
         
        list($new_width, $new_height) = get_img_size_format($width, $height,250);
        
        $type = get_supported_image_types($type);
        
        if ($type['gd'])
            {
            if ($type['format'] === false)
                {
                    return false;
             
                }
            switch ($type['format'])
                {
                    case IMG_GIF:
                    $image = @imagecreatefromgif($source);
                    
                    break;
              case IMG_JPG:
                      @ini_set('gd.jpeg_ignore_warning', 1);
                        $image = @imagecreatefromjpeg($source);
                    break;
            case IMG_PNG:
                          $image = @imagecreatefrompng($source);
                    break;
            case IMG_WBMP:
                          $image = @imagecreatefromwbmp($source);
                    break;
           } 
           if (empty($image))
                {
                    return false;
                }
          if ($type['version'] == 1)
                {
                    $new_image = imagecreate($new_width, $new_height);
    
                    if ($new_image === false)
                    {
                        return false;
                    }
            imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                }
          else
          {
                $new_image = imagecreatetruecolor($new_width, $new_height);
 
                    if ($new_image === false)
                    {
                        return false;
                    }
              @imagealphablending($new_image, false);
                    @imagesavealpha($new_image, true);
      
                    imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
          }
          if (@ini_get('safe_mode') || @strtolower(ini_get('safe_mode')) == 'on')
                {
                
            @touch($destination);
                }
            
                switch ($type['format'])
                {
                    case IMG_GIF:
                        imagegif($new_image, $destination);
                    break;
      
                    case IMG_JPG:
                        imagejpeg($new_image, $destination, 90);
                    break;
      
                    case IMG_PNG:
                        imagepng($new_image, $destination);
                    break;
      
                    case IMG_WBMP:
                        imagewbmp($new_image, $destination);
                    break;
                }
      
                imagedestroy($new_image);
            
          
        }
        else
            {
                return false;
            }
?>
Добавлено через 1 час 58 минут
Нашла способ есть специальная библиотека её можно скачать с github. https://github.com/Yuriy-Khomenko/GIF_eXG. Подключаешь её потом просто вызываешь класс.
PHP
1
2
3
$nGif = new GIF_eXG("./temp/144066306455.gif",1);
$nGif->resize("./temp2/dst1.gif",180,180,1,0);
$nGif->resize("./temp2/dst2.gif",150,150,0,0);
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2019, 17:48
Ответы с готовыми решениями:

Как вставить картинку с Gif анимацией в виджет WP
Всем привет! Сделал Gif-ку и теперь хочу разместить ее в виджете. Добавлял ее в Мультимедиа файлы и создавал виджет Изображение....

Как растянуть картинку на 100% окна бразуера и в ширину и в высоту
Мне необходимо иметь картинку в самом верху страницы и что бы вне зависимости размера окна браузера - она всегда была на 100 по ширине и...

Как создать *.GIF файл с анимацией?
Как создать *.GIF файл с анимацией?

1
Невнимательный
 Аватар для ft4l
3109 / 1285 / 359
Регистрация: 08.02.2013
Сообщений: 7,552
Записей в блоге: 2
21.08.2019, 18:24
В приведённом коде нет работы с фреймами анимированого gif
imagecreatefromgif() получает только первый фрейм.

Мне как-то больше попалось ответов с Imagick.
Но у себя получаю 'нет' , если запускаю такой код,
PHP
1
echo (extension_loaded('imagic'))? "imagic есть": "нет";
// под виндовс пока нашёл только бинарники этого расширения не совместимые с моей версией php

Добавлено через 11 минут
Цитата Сообщение от Katerina1993 Посмотреть сообщение
GIF_eXG
Работает
немного сыпет сообщения типа [php7:warn] [php7:notice], но анимация есть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2019, 18:24
Помогаю со студенческими работами здесь

Как сделать ширину и высоту автоматической?
Здравствуйте, скажите пожалуйста как сделать ширину и высоту автоматической? { .class{ /*margin:100px auto 0;*/ width:680px;/*Если...

Как получить ширину и высоту ListViewItem?
Загрузилось приложение, заполнился ListView. Как получить ширину и высоту ListViewItem? Насколько мне известно, ширина и высота у всех...

Как определить ширину высоту виджета?
Как определить ширину высоту виджета? ui-&gt;verticalLayot , например?

Как определить высоту и ширину браузера?
как определить высоту и ширину браузера для масштабирования некоторых объектов, и как это отслеживать в момент ресайза браузера спасибо

Как программно поменять размер (ширину/высоту) компонента
Не давно начал изучать си шарп, возникло несколько вопросов 1. Как программно поменять размер (ширину/высоту) компонента ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru