Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Создание анимированной GiF! Добавлено: 15.09.07 17:52  

Автор вопроса:  Игорь | ICQ: 457394129 
Товарищи как имея допустим 3 BMP, последовательно сохранить их в GIF-анимацию, при этом задав определённую частоту кадров?

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: www.rascalspb.narod.ru
 Профиль | | #3
Добавлено: 16.09.07 13:35
http://www.w3.org/Graphics/GIF/spec-gif89a.txt

Ответить

Номер ответа: 4
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #4
Добавлено: 16.09.07 13:37
или Джон Миано "Сжатие изображений". Тока на тот момент lzw был под патентом. И само сжатие не рассмотрено. Зато хорошо рассмотрено анимирование

Ответить

Номер ответа: 5
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 19.09.07 22:47
Все говорят, что просто, а на самом деле я не знаю никого на этом форуме, кто бы реализовал программное сдатие bmp в gif на уровне формата файлов (минуя обходные пути). Описание сто раз просматривал, но до конца нормально так и не въехал в детали реализации lzw-алгоритма для gif. Так что лучше написал бы кто это хоть на vb6/net на уровне форматов.

Ответить

Номер ответа: 6
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: www.rascalspb.narod.ru
 Профиль | | #8
Добавлено: 20.09.07 02:54
не, со сжиманием поторпился =) сжимает раза в два хуже пнг. но сильно зависит от картинки. так же ооочень сильно зависит скорость. линейный поиск фтопку

Ответить

Номер ответа: 9
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #9
Добавлено: 20.09.07 03:29
http://ifolder.ru/3411284
вот. можете глянуть какая скорость у линейного сжатия и как она пляшет в зависимости от содержания файла

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам