Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Анимация на KS0108


Анимация на KS0108

Сообщений 1 страница 19 из 19

1

Приветствую.
Кто нибудь выводил раздербаненный до отдельных картинок gif?

0

2

http://bascom.at.ua/load/1-1-0-2

0

3

Это немного совсем не то.
В ссылке говорится о текстовых ЖКИ, я же спрашивал о графических.
И, кстати, при открытии ссылки с мобильного происходит перенаправление на скрипт с платной подпиской.

Отредактировано rustr (2017-08-17 14:41:44)

0

4

Точно, не доглядел.

0

5

Что нужно? Разобрать gif средствами МК или выводить предварительно разобранную картинку? Где картинка будет хранится?

0

6

Может быть, это подходит http://avrproject.ru/publ/vyvod_animiro … /1-1-0-97?

0

7

Пётр Нужно любое решение, которое позволит вывести простенькую анимацию. Есть и гифка, и она же, разобранная на 50 кадров.
forter это я видел, но не могу сообразить, как размер картинок, отличных от 88*88 (у него они заточены под экранчик Нокии, и программка тоже под нее вывод делает.

0

8

А как перевести формат BGF в BAS или в HEX?

0

9

Могу сделать бинарник по вашему видео/анимации, дальше просто лукапом будите читать данные из файла и воспроизводить (всё это естественно будет просто прошиваться в память МК, главное только чтобы влезло), пример результатов: раз и два.

0

10

О. Буду очень благодарен.

Здесь архив с GIF, JPG и BMP

0

11

Готово.
Первая проблема была в том, что черный - это не черный, даёт шумы при преобразовании. Это я поправил.
Вторая проблема - это в момент превращения в девушку, цвет/рисунок блекнет. Это такой гиф, как есть, рисовать руками кучу кадров не буду.) Т.ч. сами правьте.
В общем графика дело наживное, главное научитесь выводить на экран.
Характеристики спрайтов/кадров: 114х64, битовое (1 или 0). Т.е. один кадр занимает 960 байт. Общий объём не кислый: 48000 байта, не уверен, что влезет в МК вместе с кодом.)

0

12

Пример подключения файла к баскому:

Код:
$inc Anim , Nosize , "marvel.frm"


Чтение:

Код:
A = Lookup(tmp , Anim)


Где "tmp" - адрес данных в файле.
А - полученные данные.

0

13

Спасибо, буду смотреть. А чем теперь править цвета? Или это делается до момента преобразования?
И в чем готовится этот .frm?

0

14

Цвета надо править в исходнике (гифке, если есть возможность) или можно разложить опять на кадры, но чтобы качество не терялось, то не в JPG, а в BMP хотя бы.
frm - это я так обозвал, вообще это давняя технология с времен ZX Spectrum, когда берется любая растровая картинка с тру цветами и преобразуется в однобитный вид при помощи утилиты консольной "Алхимия", перегоняется в простой формат FOP, он без всяких жатий (как есть) и потом ЭТО всё клеится в один файл обычным файловым менеджером.

0

15

Разбор гифки на кадры.
Экспорт GIF в BMP.

Код:
UseGIFImageDecoder()

SourceImage.s = "Waves.gif"
ResultDir.s = "Out\"

If LoadImage(0, SourceImage)
  
  If FileSize(ResultDir)<>-2 And CreateDirectory(ResultDir) = 0
    MessageRequester("", "Не удалось создать папку")
    Goto exit
  EndIf
  
  CountImg = ImageFrameCount(0)-1 ; Число кадров в гифке.
  
  For i=0 To CountImg
    SetImageFrame(0, i)     ; Выбор кадра в гифке.
    res = SaveImage(0, ResultDir + i +".bmp")
    Debug "Кадр "+i+"   "+res
  Next i
  
  MessageRequester("", "Картинки сохранены")
  
Else
  MessageRequester("", "Не удалось загрузить картинку")
EndIf

exit:
End

Тоже самое но в PNG (занимает меньше места на диске).

Код:
UseGIFImageDecoder()
UsePNGImageEncoder()

SourceImage.s = "Waves.gif"
ResultDir.s = "Out\"

If LoadImage(0, SourceImage)
    
  If FileSize(ResultDir)<>-2 And CreateDirectory(ResultDir) = 0
    MessageRequester("", "Не удалось создать папку")
    Goto exit
  EndIf
  
  CountImg = ImageFrameCount(0)-1 ; Число кадров в гифке.
  
  For i=0 To CountImg
    SetImageFrame(0, i)     ; Выбор кадра в гифке.

    res = SaveImage(0, ResultDir + i +".png", #PB_ImagePlugin_PNG)
    Debug "Кадр "+i+"   "+res
  Next i
  
  MessageRequester("", "Картинки сохранены")
  
Else
  MessageRequester("", "Не удалось загрузить картинку")
EndIf

exit:
End

Тоже самое, но с изменением размера картинки под индикатор (128x64).

Код:
UseGIFImageDecoder()
UsePNGImageEncoder()

SourceImage.s = "Waves.gif"
ResultDir.s = "Out\"

If LoadImage(0, SourceImage)
    
  If FileSize(ResultDir)<>-2 And CreateDirectory(ResultDir) = 0
    MessageRequester("", "Не удалось создать папку")
    Goto exit
  EndIf
  
  CountImg = ImageFrameCount(0)-1 ; Число кадров в гифке.
  
  For i=0 To CountImg
    SetImageFrame(0, i)     ; Выбор кадра в гифке.
    CopyImage(0, 1)
    ResizeImage(1, 128, 64)
    res = SaveImage(1, ResultDir + i +".png", #PB_ImagePlugin_PNG)
    Debug "Кадр "+i+"   "+res
    FreeImage(1)
  Next i
  
  MessageRequester("", "Картинки сохранены")
  
Else
  MessageRequester("", "Не удалось загрузить картинку")
EndIf

exit:
End


При необходимости, можно произвести обработку перед сохранением на диск, например заменить некоторые цвета и т. д.

0

16

Это для PureBasic ?

0

17

Да.

0

18

Преобразование картинки в черно-белую.

Код:
UseGIFImageDecoder()
UsePNGImageEncoder()

Declare GreyImage(Image)

SourceImage.s = "Waves.gif"
ResultDir.s = "Out\"

If LoadImage(0, SourceImage)
    
  If FileSize(ResultDir)<>-2 And CreateDirectory(ResultDir) = 0
    MessageRequester("", "Не удалось создать папку")
    Goto exit
  EndIf
  
  CountImg = ImageFrameCount(0)-1 ; Число кадров в гифке.
  
  For i=0 To CountImg
    SetImageFrame(0, i)     ; Выбор кадра в гифке.
    CopyImage(0, 1)
    ResizeImage(1, 128, 64)
    GreyImage(1) ; Преобразование цветной картинки в черно-белую
    res = SaveImage(1, ResultDir + i +".png", #PB_ImagePlugin_PNG)
    Debug "Кадр "+i+"   "+res
    FreeImage(1)
  Next i
  
  MessageRequester("", "Картинки сохранены")
  
Else
  MessageRequester("", "Не удалось загрузить картинку")
EndIf

exit:
End


#redlight=30 : #greenlight=53 : #bluelight=11
#total = #redlight + #greenlight + #bluelight

Procedure GreyImage(Image) ; Преобразование цветной картинки в черно-белую.
  
  If StartDrawing(ImageOutput(Image)) 
    
    Width = OutputWidth()-1
    Height = OutputHeight()-1
     
    For x= 0 To Width
      For y=0 To Height
        
        Color=Point(x,y) ; Цвет текущей точки.
        grau=(Red(Color)*#redlight+Green(Color)*#greenlight+Blue(Color)*#bluelight) / #total ; Преобразование в серый.
        
        If grau>30 ; Порог для белого цвета.
          grau=255
        Else
          grau=0
        EndIf
        
        Plot(x,y,RGB(grau,grau,grau))
        
      Next y 
    Next x 
    
    StopDrawing() 
  EndIf

EndProcedure


Сохранение в файле

Код:
UseGIFImageDecoder()
;UsePNGImageEncoder()

Declare GreyImage(Image)
Declare SaveFile(FileName.s, Image)

SourceImage.s = "Waves.gif"
ResultDir.s = "Out\"
ResultFile.s = "Res.bin"

DeleteFile(ResultDir+ResultFile)

If LoadImage(0, SourceImage)
    
  If FileSize(ResultDir)<>-2 And CreateDirectory(ResultDir) = 0
    MessageRequester("", "Не удалось создать папку")
    Goto exit
  EndIf
  
  CountImg = ImageFrameCount(0)-1 ; Число кадров в гифке.
  
  For i=0 To CountImg
    SetImageFrame(0, i)     ; Выбор кадра в гифке.
    CopyImage(0, 1)
    ResizeImage(1, 128, 64)
    GreyImage(1) ; Преобразование цветной картинки в черно-белую
    ;res = SaveImage(1, ResultDir + i +".bmp")
    res = SaveFile(ResultDir+ResultFile, 1) ; Сохранение данных в файле.
    Debug "Кадр "+i+"   "+res
    FreeImage(1)
  Next i
  
  MessageRequester("", "Картинки сохранены")
  
Else
  MessageRequester("", "Не удалось загрузить картинку")
EndIf

exit:
End


#redlight=30 : #greenlight=53 : #bluelight=11
#total = #redlight + #greenlight + #bluelight

Procedure GreyImage(Image) ; Преобразование цветной картинки в черно-белую.
  
  If StartDrawing(ImageOutput(Image)) 
    
    Width = OutputWidth()-1
    Height = OutputHeight()-1
     
    For x= 0 To Width
      For y=0 To Height
        
        Color=Point(x,y) ; Цвет текущей точки.
        grau=(Red(Color)*#redlight+Green(Color)*#greenlight+Blue(Color)*#bluelight) / #total ; Преобразование в серый.
        
        If grau>30 ; Порог для белого цвета.
          grau=255
        Else
          grau=0
        EndIf
        
        Plot(x,y,RGB(grau,grau,grau))
        
      Next y 
    Next x 
    
    StopDrawing() 
  EndIf

EndProcedure


Procedure SaveFile(FileName.s, Image) ; Сохранение данных в файле.
  Res = 0
  
  If OpenFile(0, FileName)
    FileSeek(0, Lof(0)) ; Переход в конец файла.
    
    Pos = 0
    Byte.a = 0
    
    If StartDrawing(ImageOutput(Image)) 
      
      Width = OutputWidth()-1
      Height = OutputHeight()-1
      
      For x= 0 To Width
        For y=0 To Height
          
          Color=Point(x,y) ; Цвет текущей точки.
          Pos + 1
          
          If Color
            Byte | 1
          EndIf
          
          Byte<<1
          
          If Pos % 8 = 0
            WriteAsciiCharacter(0, Byte)
            Byte = 0
          EndIf
          
        Next y 
      Next x 
      
      StopDrawing() 
      Res = 1
    EndIf

    If Pos % 8 <> 0
      WriteAsciiCharacter(0, Byte)
    EndIf
    
    CloseFile(0)
;   Else
;     MessageRequester("", "Не удалоcь открыть файл "+Chr(10)+FileName)
  EndIf
  
  ProcedureReturn Res
EndProcedure

Результат сохраняется в файле Res.bin. Т. к. цвета всего два, результат сохраняется побитово. При размере картинок 128x64 на каждую из них требуется 1024 байта.

0

19

Спасибо, попробую.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Анимация на KS0108