Страница: 1 |
Страница: 1 |
Вопрос: Создание анимированной GiF!
Добавлено: 15.09.07 17:52
Автор вопроса: Игорь | ICQ: 457394129
Товарищи как имея допустим 3 BMP, последовательно сохранить их в GIF-анимацию, при этом задав определённую частоту кадров?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #1
Добавлено: 15.09.07 23:48
Вот я нашел на компе - как открывать гифы
Тебе надо сделать то же, но наоборот)))
'Если у кого-то есть претензии или замечания, по поводу того, что я использовал чужой код, прошу писать мылом: krutoydima@mtu-net.ru
'http://www.dndsoft.cjb.net
'Использовать этот код можно свободно, но с желательным указанием авторов.
Option Explicit
Public RepeatTimes As Long
Public TotalFrames As Long
Public Function LoadImage(sFile As String, aImg As Variant) As Boolean
LoadImage = False
If Dir$(sFile) = "" Or sFile = "" Then
MsgBox "Файл " & sFile & " не найден", vbCritical
Exit Function
End If
On Error GoTo ErrHandler
Dim fNum As Integer
Dim imgHeader As String, fileHeader As String
Dim buf$, picbuf$
Dim imgCount As Integer
Dim i&, j&, xOff&, yOff&, TimeWait&
Dim GifEnd As String
GifEnd = Chr(0) & Chr(33) & Chr(249)
For i = 1 To aImg.Count - 1
Unload aImg(i)
Next i
fNum = FreeFile
Open sFile For Binary Access Read As fNum
buf = String(LOF(fNum), Chr(0))
Get #fNum, , buf '
Close fNum
i = 1
imgCount = 0
j = InStr(1, buf, GifEnd) + 1
fileHeader = Left(buf, j)
If Left$(fileHeader, 3) <> "GIF" Then
MsgBox "Формат файла не поддерживается", vbCritical
Exit Function
End If
LoadImage = True
i = j + 2
If Len(fileHeader) >= 127 Then
RepeatTimes& = Asc(Mid(fileHeader, 126, 1)) + (Asc(Mid(fileHeader, 127, 1)) * 256&
Else
RepeatTimes = 0
End If
Do
imgCount = imgCount + 1
j = InStr(i, buf, GifEnd) + 3
If j > Len(GifEnd) Then
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
TimeWait = ((Asc(Mid(imgHeader, 4, 1))) + (Asc(Mid(imgHeader, 5, 1)) * 256&) * 10&
If imgCount > 1 Then
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)
End If
aImg(imgCount - 1).Tag = TimeWait
aImg(imgCount - 1).Picture = LoadPicture("temp.gif"
Kill ("temp.gif"
i = j
End If
DoEvents
Loop Until j = 3
If i < Len(buf) Then
fNum = FreeFile
Open "temp.gif" For Binary As fNum
picbuf = String(Len(fileHeader) + Len(buf) - i, Chr(0))
picbuf = fileHeader & Mid(buf, i - 1, Len(buf) - i)
Put #fNum, 1, picbuf
imgHeader = Left(Mid(buf, i - 1, Len(buf) - i), 16)
Close fNum
TimeWait = ((Asc(Mid(imgHeader, 4, 1))) + (Asc(Mid(imgHeader, 5, 1)) * 256)) * 10
If imgCount > 1 Then
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)
End If
aImg(imgCount - 1).Tag = TimeWait
aImg(imgCount - 1).Picture = LoadPicture("temp.gif"
Kill ("temp.gif"
End If
TotalFrames = aImg.Count - 1
Exit Function
ErrHandler:
MsgBox "Произоншла ошибка (номер:" & Err.Number & " при чтении файла", vbCritical
LoadImage = False
On Error GoTo 0
End Function
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 16.09.07 02:03
Это не сложно, но геморно. В инете гиф хорошо документирован, даже на русском. Найди формат гифа и будет тебе счастье.
Номер ответа: 3
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #3
Добавлено: 16.09.07 13:35
http://www.w3.org/Graphics/GIF/spec-gif89a.txt
Номер ответа: 4
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #4
Добавлено: 16.09.07 13:37
или Джон Миано "Сжатие изображений". Тока на тот момент lzw был под патентом. И само сжатие не рассмотрено. Зато хорошо рассмотрено анимирование
Номер ответа: 5
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #5
Добавлено: 19.09.07 22:47
Все говорят, что просто, а на самом деле я не знаю никого на этом форуме, кто бы реализовал программное сдатие bmp в gif на уровне формата файлов (минуя обходные пути). Описание сто раз просматривал, но до конца нормально так и не въехал в детали реализации lzw-алгоритма для gif. Так что лучше написал бы кто это хоть на vb6/net на уровне форматов.
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 20.09.07 01:26
Ща делаю курсач - свой формат граф фафйла, со сжатием лзв так что знаком с проблемами на себе.
лзв не сложный алго. тока на вб сложно будет делать. он работает с битами. очень часто >> << & |. так что оптимальный язык - си. но и на вб можно сделать, правда гемор и медленно. в частности еще придеца делать что нить типа хэш таблицы или бинарных деревьев. или авл деревья. ибо при сжатии размер словаря растёт ОЧЕНЬ большими темпами. напремер при линейном поиске сжать картинку 300 Х 300 на с++ с оптимизацией компилятора(нуно оптимазить на уровне алгоритма) просто нереально.скорость на каждые 100 000 сжатых байт увеличивается значительно.
сам алго, повоторюсь, весьма прост. и после сжатия не требует к файлу крепить словарь. но сжимает он слабо :/
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 20.09.07 02:18
да лзв попомйму и готовый где-то был...
Номер ответа: 8
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #8
Добавлено: 20.09.07 02:54
не, со сжиманием поторпился сжимает раза в два хуже пнг. но сильно зависит от картинки. так же ооочень сильно зависит скорость. линейный поиск фтопку
Номер ответа: 9
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #9
Добавлено: 20.09.07 03:29
http://ifolder.ru/3411284
вот. можете глянуть какая скорость у линейного сжатия и как она пляшет в зависимости от содержания файла