Получите один 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