Страница: 1 |
Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 19.09.05 18:43
юзай примеры!
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 20.09.05 00:20
Barsik, ты ж не VBLamer, хоть одним глазом на дату последнего ответа смотри