Как сохранить анимированный Gif

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Как сохранить анимированный Gif

Сообщение RazArt » 02.11.2008 (Вс) 16:28

Мну это очень надо для одной программы

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как сохранить анимированный Gif

Сообщение Debugger » 02.11.2008 (Вс) 17:41

http://www.wotsit.org/ - читай, смотри.
А если с английским туго - посмотри в "Кирпичном Заводе" (раздел такой), или viewtopic.php?f=1&t=34776&p=6678915&hilit=%D0%90%D0%BD%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9+GIF#p6678915.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Как сохранить анимированный Gif

Сообщение RazArt » 02.11.2008 (Вс) 18:06

Мне надо не проиграть, а именно сохранить, когда я имею несколько картинок

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как сохранить анимированный Gif

Сообщение Debugger » 02.11.2008 (Вс) 19:46

Для того, чтобы проиграть файл, его надо прочитать. Логично?
Если умеешь читать, то и умеешь писать (ибо секреты формата известны). Так?
Просто надо захотеть (прям как в песне :) )

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Как сохранить анимированный Gif

Сообщение RazArt » 05.11.2008 (Ср) 11:48

А не можеш выложить пример, я пытался, но так и не понял(

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как сохранить анимированный Gif

Сообщение Debugger » 05.11.2008 (Ср) 12:29

В топике, ссылку на который я тебе дал, есть пример. В нем есть функция LoadGif. Но! В коде там полнейшая каша. Надо бы звать телепата. Давай попробуем разобраться, что делает эта функции.
Сначала очевидно, проверяется существование файла и он загружается в строковой буффер (buf). Это происходит до строчек
Код: Выделить всё
        Get #fNum, , buf 'Get GIF File into buffer
    Close fNum

Что происходит потом? Не секрет, что в некоторых типах файлов есть заголовки. GIF - такой формат. Заголовок оканчивается символами
Код: Выделить всё
GifEnd = Chr(0) & Chr(33) & Chr(249)

Загружаем заголовок
Код: Выделить всё
    j = InStr(1, buf, GifEnd) + 1

Потом идут проверки на правильность формата и наличие нескольких изображений в файле (анимация). Обратим внимание на строчку
Код: Выделить всё
RepeatTimes& = Asc(Mid(fileHeader, 126, 1)) + (Asc(Mid(fileHeader, 127, 1)) * 256&)

Количество повторений (сколько раз нужно прокрутить анимацию GIF-а), кодируется в двух символах в заголовке - в 126 и 127. Если их нет, то анимация не должна повторяться.
Умирааааю...
Код: Выделить всё
        j = InStr(i, buf, GifEnd) + 3
            fNum = FreeFile
            Open "temp.gif" For Binary As fNum
                picbuf = String(Len(fileHeader) + j - i, Chr(0))
                picbuf = fileHeader & Mid(buf, i - 1, j - i)
                Put #fNum, 1, picbuf
                imgHeader = Left(Mid(buf, i - 1, j - i), 16)
            Close fNum

Здесь автор поступает очень логично. В VB можно загружать GIF-картинки, если они не анимированы. GIF-анимация от GIF-картинки тем, что в первом несколько заголовков. Заголовки отделяются #0 #33 #209, а само описание изображения идет после заголовка до начала следующего заголовка (я прав?) . Возьмем это на заметку, когда будем писать создаватель GIFов, это нас спасет.
В j содержится, соответственно, позиция текущего заголовка (я опять прав?)
Код: Выделить всё
            TimeWait = ((Asc(Mid(imgHeader, 4, 1))) + (Asc(Mid(imgHeader, 5, 1)) * 256&)) * 10&
                ...
                xOff = Asc(Mid(imgHeader, 9, 1)) + (Asc(Mid(imgHeader, 10, 1)) * 256&)
                yOff = Asc(Mid(imgHeader, 11, 1)) + (Asc(Mid(imgHeader, 12, 1)) * 256&)
                Load aImg(imgCount - 1)
                aImg(imgCount - 1).Left = aImg(0).Left + (xOff * Screen.TwipsPerPixelX)
                aImg(imgCount - 1).Top = aImg(0).Top + (yOff * Screen.TwipsPerPixelY)

Присмотримся к этому коду. Ни для кого не тайна, что каждый фрейм из GIF-анимации может быть смещен в сторону. Это смещение указывается в 9,10 и 11,12 символах по оси X и Y соответственно. А время до смены следующего фрейма указывается в 4 и 5м символах.
Вот и все. Сейчас займусь написанием кырпича для сохранения GIF-анимаций. Если допишу - выложу (если не умру)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сохранить анимированный Gif

Сообщение tyomitch » 06.11.2008 (Чт) 20:15

Debugger писал(а):
Код: Выделить всё
        j = InStr(i, buf, GifEnd) + 3
            fNum = FreeFile
            Open "temp.gif" For Binary As fNum
                picbuf = String(Len(fileHeader) + j - i, Chr(0))
                picbuf = fileHeader & Mid(buf, i - 1, j - i)
                Put #fNum, 1, picbuf
                imgHeader = Left(Mid(buf, i - 1, j - i), 16)
            Close fNum

Здесь автор поступает очень логично. В VB можно загружать GIF-картинки, если они не анимированы.

Ни разу не логично.
Этот код не работает с сидюка, без прав записи в текущую папку (т.е. из Program Files), и когда контролов существует одновременно несколько.
Весь респект Оловянникову, но мой код лучше.
Изображение

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как сохранить анимированный Gif

Сообщение Debugger » 07.11.2008 (Пт) 16:50

И вправду не логично. Но ведь лучше чем разбирать ручками)
Тащи свой код сюда, тоже разберем.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как сохранить анимированный Gif

Сообщение tyomitch » 07.11.2008 (Пт) 23:37

Debugger писал(а):Тащи свой код сюда, тоже разберем.

Он был на viewtopic.php?f=1&t=6020 и в ряде других мест, но убит злыми хостерами :-((
Может у кого остался сохранённый?
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 25

    TopList  
cron