Toni_s Ответов: 0

Получите один gif-кадр за раз.


Всем привет.
У меня есть вопрос о том, как играть в анимацию, не используя слишком много памяти.
Я хочу загрузить в каждый тик таймера только один кадр непосредственно с диска, не загружая все кадры в память в переменную.
У меня есть одна функция для этого, но если я ее вызову, она замедлится в каждом кадре немного больше.
Если gif имеет много кадров в конце, анимация выглядит как повтор. Временной интервал не играет никакой роли.

Первая функция воспроизводит анимацию и использует переменную.
Когда я использую эту функцию ниже, анимация воспроизводится без каких-либо проблем, но использует слишком много памяти.

Вторая функция-избирательная.
Он берет только один кадр непосредственно с диска и не все, должен вызываться в каждом ТИКе таймера. Смотреть ниже.
В этой функции анимация воспроизводится, но в каждом кадре немного медленнее.
Я полагаю, система.Чертеж.изображения читать в формате GIF каждый раз с начала жиф пока проиндексированных рамка,
и поэтому нужно больше времени для следующего кадра.

Я опубликовал этот вопрос также в Microsoft Developer Network по следующей ссылке,

https://social.msdn.microsoft.com/Forums/vstudio/en-US/2b0e4b02-fd85-4f89-aedd-e7af91d32dfb/gif-animation-slows-down?forum=vbgeneral#2b0e4b02-fd85-4f89-aedd-e7af91d32dfb

но не повезло.

Пожалуйста, любое предложение будет оценено по достоинству.
Кроме того, эта статья-моя первая. Пожалуйста, наберитесь терпения. :)

Что я уже пробовал:

Private Function GetAllinMemory(ByVal GifImg As Image) As Frame()
    'RETURNS ALL FRAMES AND THE DURATION IN VARIABLE
    Dim gif As Image = GifImg ' Image.FromFile("MyGif.gif")
    Dim fd As New Imaging.FrameDimension(gif.FrameDimensionsList()(0))
    Dim frameCount As Integer = gif.GetFrameCount(fd)
    Dim frames(frameCount) As Frame
    If frameCount > 1 Then
        Dim times() As Byte = gif.GetPropertyItem(&H5100).Value
        For i As Integer = 0 To frameCount - 1
            gif.SelectActiveFrame(fd, i)
            Dim length As Integer = BitConverter.ToInt32(times, 4 * i) * 10
            frames(i) = New Frame(length, New Bitmap(gif))
        Next
    Else
        frames(0) = New Frame(0, New Bitmap(gif))
    End If
    Return frames
End Function


Private Function GetGifFremeFromDisk(ByVal File As String, ByVal Index As Integer) As Frame
    FrameInterval = 1
    If System.IO.File.Exists(File) = False Then
        Return Nothing
    End If

    Dim gif As Image = Image.FromFile(File)
    Dim fd As New Imaging.FrameDimension(gif.FrameDimensionsList()(0))
    Dim frameCounter As Integer = gif.GetFrameCount(fd)
    frameCount = frameCounter
    Dim OneFrame As Frame
    If Index >= frameCount Then Index = frameCount
    If frameCount > 1 Then
        Dim times() As Byte = gif.GetPropertyItem(&H5100).Value
        gif.SelectActiveFrame(fd, Index)
        Dim length As Integer = BitConverter.ToInt32(times, 4 * Index) * 10
        OneFrame = New Frame(length, New Bitmap(gif))
        FrameInterval = length
    Else
        OneFrame = New Frame(FrameInterval, New Bitmap(gif))
    End If
    gif.Dispose()
    Return OneFrame
End Function

0 Ответов