Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: GIF разрезать на BMP Добавлено: 25.07.05 18:50  

Автор вопроса:  Дмитрий Щапов
Вопрос этот неоднократно поднимался, но у меня проблема осталась.
Задача проста: мне нужно разбить Gifанимацию на картинки и сохранить в bmp.
Код, которым я пользовался однажды не смог загрузить анимацию нормально(загрузил неправильно - т.е. картики со второй получились хреново, как фотография в паспорте:)).
А код собсно такой:

Private Images() As StdPicture
Public Frames As Byte
Option Explicit

Public Sub Load(ByVal FileName As String)
    Dim fNum As Integer
    Dim imgHeader As String, fileHeader As String
    Dim FileNameTmp As String
    Dim buf$, picbuf$
    Dim i&, j&, xOff&, yOff& ', TimeWait&
    Dim GifEnd As String
    ReDim Images(0)
    GifEnd = Chr(0) & Chr(33) & Chr(249)
    fNum = FreeFile
    Open FileName For Binary Access Read As fNum
        buf = String(LOF(fNum), Chr(0))
        Get #fNum, , buf
    Close fNum
    i = 1
    Frames = 0
    j = InStr(1, buf, GifEnd) + 1
    fileHeader = Left(buf, j)
    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
    FileNameTmp = App.Path + "\temp"
    Do ' Split GIF Files at separate pictures and load them into Image Array
        j = InStr(i, buf, GifEnd) + 3
        If j > Len(GifEnd) Then
            Frames = Frames + 1
            fNum = FreeFile
            Open FileNameTmp 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 Frames > 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
            ReDim Preserve Images(UBound(Images) + 1)
            Set Images(UBound(Images)) = LoadPicture(FileNameTmp)
            'Kill FileNameTmp
            i = j
        End If
    Loop Until j = 3
    ' If there are one more Image - Load it
    If i < Len(buf) Then
        fNum = FreeFile
        Open FileNameTmp 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 Frames > 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
        Frames = Frames + 1
        ReDim Preserve Images(UBound(Images) + 1)
        Set Images(UBound(Images)) = LoadPicture(FileNameTmp)
        'Kill FileNameTmp
    End If
    'TotalFrames = aImg.Count - 1
End Sub


Понравившийся мне контрол требует регистрацию, в примерах анимации GIF на С++ фиг разберёшься(анимация с многопоточностью).

Может у кого есть контрол(может даже и с исходниками...) чтоб разбить GIF на bmp.

Ответить

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

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



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #1
Добавлено: 25.07.05 21:07
попробуй модифицировать код, показа анимированных Гиф... он вроде расщепляет Гиф на отдельные картинки, а потом показывает их... :)

Ответить

Номер ответа: 2
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #2 Добавлено: 25.07.05 21:38
В смысле? Какой код?
В том то и дело, что привиденный код нормально работает, НО из нужной мне анимашки он "извлекает" так сказать "неправильные картинки". Но анимашка хорошая, многие просмоторцики её нормально позуют.

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 25.07.05 23:05
а примерах есть пример проигрования анимации с гифа, и помойму анимация там в пикчебоксе или имедже, посмотри, мож поможет...

Ответить

Номер ответа: 4
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #4 Добавлено: 25.07.05 23:34
Почему именно эту GIF он плохо грузит, я понял - настройки сжатия GIF влияют.
Ну мож тогда есть универсальнаый код?

Ответить

Номер ответа: 5
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #5 Добавлено: 25.07.05 23:37
Да я боюсь там такой же код.
Я ,перед тем как задать вопрос, хорошо прошелся по инету.

Ответить

Номер ответа: 6
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #6
Добавлено: 19.09.05 18:43
юзай примеры!

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 20.09.05 00:20
Barsik, ты ж не VBLamer, хоть одним глазом на дату последнего ответа смотри :)

Ответить

Страница: 1 |

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



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