Slow motion video

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
ron2
New User
New User
Posts: 6
Joined: Mon Nov 05, 2012 6:56 am

Slow motion video

Post by ron2 »

I'd like to be able to control the speed at which I play videos. I'm writing a program that teaches sign language. And some of the signs are hard to see in regular speed. How hard would it be to make that possible?
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Slow motion video

Post by IdeasVacuum »

Hi ron2

In the mean time, if you use animated gif files, you can set the duration of frame display in the file - not only that, but if required, each frame or a group of frames can have a different display duration - so, you might show the sign at a "normal" speed, followed by a slow-mo, followed again by a normal speed.

If you want the User to have control of the speed, then write a routine that displays individual images - after all, videos and animations are simply a way of storing and displaying many still images.

Animated gifs by the way can be displayed as a web page, in a WebGadget.

There are numerous Gif building apps out there - I use Serif DrawPlus. There is a free version of DrawPlus but I don't know if that particular version can be used to make gifs.
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
ron2
New User
New User
Posts: 6
Joined: Mon Nov 05, 2012 6:56 am

Re: Slow motion video

Post by ron2 »

Wow IdealsVacuum,

You just gave me a whole lot of viable ideals. Thankyou.
If you want the User to have control of the speed, then write a routine that displays individual images - after all, videos and animations are simply a way of storing and displaying many still images.
Can you point me in the right direction on how to do that?
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Slow motion video

Post by IdeasVacuum »

Well, no. I think what I can do, with some of my old code, is show how not to do it more than how to do it. :)
The code below loads existing image files on demand*. For your app, you will probably need to embed all the images within the exe (as the button images are here), or you could store them in the Application data folder if you are not worried about somebody stealing them. In the code below, the playback speed can be adjusted by the User. You could do that in the code instead.

* Browse to the first image file, the app finds all the other eligible images in the folder. Works best if all the images are the same size (Height/Width), as they will be in your project.

Code: Select all

;A very basic image viewer/slide show app. IdeasVacuum

;### Windows

  #Desktop = 0
  #WinMain = 1
   #Folder = 2

;### Gadgets
Enumeration
  #ImageGdgt
  #ImageGdgtDummy
  #Image
  #ImageBackground
  #BtnFileOpen
  #BtnSave
  #BtnCopy
  #BtnPaste
  #BtnBack
  #BtnFwd
  #StrFile
  #StatusBar
  #BtnExit
  #BtnSld
  #StrDelay
EndEnumeration

;### Fonts
Global FontID1
FontID1 = LoadFont(1, "Tahoma", 10, #PB_Font_HighQuality)

ExamineDesktops()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UseJPEG2000ImageEncoder()
UseJPEG2000ImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Global Btn01
Global Btn02
Global Btn03
Global Btn04
Global Btn05
Global Btn06
Global Btn07

;### Catch Images
  Btn01 = CatchImage(1, ?Btn01)
  Btn02 = CatchImage(2, ?Btn02)
  Btn03 = CatchImage(3, ?Btn03)
  Btn04 = CatchImage(4, ?Btn04)
  Btn05 = CatchImage(5, ?Btn05)
  Btn06 = CatchImage(6, ?Btn06)
  Btn07 = CatchImage(7, ?Btn07)

Global sgImageFullPathOrg.s = Space(1024)
Global      sgDefaultPath.s = "C:\Documents and Settings\"
Global        sgCurrImage.s = Space(64)
Global              sgPat.s = "All Supported Image Files|*png;*jpg;*jpeg;*bmp|Portable Network Graphics PNG|*.png|Joint Photographic Experts Group JPG JPEG|*.jpg;jpeg|Bitmap Image File BMP|*.bmp"
Global          sgSavePat.s = "Portable Network Graphics PNG|*.png|Joint Photographic Experts Group JPG JPEG|*.jpg;jpeg|Bitmap Image File BMP|*.bmp"

Global igImageGdgX.i = 0
Global igImageGdgY.i = 35
Global igImageGdgW.i = 720
Global igImageGdgH.i = 600

Global Dim sgImage.s(1024)
Global     igImageTotal = 0
Global       igListDone = #False
; Window Min/Max Size
Global igWinHeightMax.l = (DesktopHeight(#Desktop) - 80) ; Allow for Task Bar
Global  igWinWidthMax.l = (DesktopWidth(#Desktop) -10)   ; Allow for inaccurate screen posn
Global    igWinHeight.l = 660
Global     igWinWidth.l = 720

Global     sgTitle.s = "IdeasVacuum Image Viewer"
Global igTotalArgs.i = 0
Global       igEsc.i = #False
Global igSlideShow.i = #False

Declare ShowImageBack()
Declare ShowImage()
Declare StartImage()
Declare ImageOpen()
Declare ImageSave()
Declare ImagePaste()
Declare ListImgFiles()
Declare ImageBack()
Declare ImageFwd()
Declare OpenWinMain()
Declare SetDelay(iUpDown.i)
Declare SlideShow()

Procedure ListImgFiles()
;-----------------------
Shared igImageTotal
Shared sgDefaultPath
Shared sgImage

 Dim sPatNext.s(3)
     sPatNext(0) = "*.jpg"
     sPatNext(1) = "*.jpeg"
     sPatNext(2) = "*.png"
     sPatNext(3) = "*.bmp"
    igImageTotal = 0

       iCnt = 0
   For iCnt = 0 To 3

     If ExamineDirectory(#Folder, sgDefaultPath, sPatNext(iCnt))

         While NextDirectoryEntry(#Folder)

                       igImageTotal + 1
               sgImage(igImageTotal) = DirectoryEntryName(#Folder)

         Wend

         FinishDirectory(#Folder)

     EndIf

   Next

   SortArray(sgImage(),#PB_Sort_Ascending | #PB_Sort_NoCase,0,igImageTotal)

   igListDone = #True

EndProcedure

Procedure ShowImageBack()
;------------------------
     iImageGdgtW.i = GadgetWidth(#ImageGdgt)
     iImageGdgtH.i = GadgetHeight(#ImageGdgt)

     SetGadgetState(#ImageGdgt,ImageBack)

EndProcedure

Procedure ShowImage()
;--------------------
 iGdgPosnX.i = 0
 iGdgPosnY.i = 35
 iWinPosnX.i = 0
 iWinPosnY.i = 0
     sSize.s = Space(32)

                  If (igSlideShow = #False) : ShowImageBack() : EndIf

                      iImageHgt.i = ImageHeight(#Image)
                     iImageWdth.i = ImageWidth(#Image)
                            sSize = StrU(iImageWdth,#PB_Long) + " x " + StrU(iImageHgt,#PB_Long)
                    StatusBarText(#StatusBar, 1, sSize)

                    dImageRatio.d = (iImageHgt / iImageWdth)

                     If (iImageWdth > (igWinWidthMax - 5)) Or (iImageHgt > (igWinHeightMax - 80))

                           dScaledWidth.d = ((igWinWidthMax - 5) * dImageRatio)
                          dScaledHeight.d = ((igWinHeightMax - 80) * dImageRatio)

                               iImageWdth = Round(dScaledWidth, #PB_Round_Nearest)
                                iImageHgt = Round(dScaledHeight, #PB_Round_Nearest)

                              igImageGdgW = iImageWdth
                              igImageGdgH = iImageHgt

                              ResizeImage(#Image,iImageWdth,iImageHgt,#PB_Image_Smooth)

                     EndIf

                     If(igImageGdgW > iImageWdth)

                           iGdgPosnX = ((igImageGdgW - iImageWdth) / 2)

                     EndIf

                     If(igImageGdgH > iImageHgt)

                           iGdgPosnY = (((igImageGdgH - iImageHgt) / 2) + 35)

                     EndIf

                     If((igImageGdgW > igWinWidth) Or (igImageGdgH > igWinHeight))

                           iWinPosnX = ((igWinWidthMax - igImageGdgW) / 2)
                           iWinPosnY = ((igWinHeightMax - igImageGdgH) / 2)

                         iWinH.i = igImageGdgH + 80
                         If(iWinH > igWinHeightMax) : iWinH = igWinHeightMax : EndIf
                         iWinW.i = igImageGdgW
                         If(iWinW > igWinWidthMax) : iWinW = igWinWidthMax : EndIf

                         ResizeWindow(#WinMain,iWinPosnX,iWinPosnY,iWinW,iWinH)
                         ResizeGadget(#ImageGdgtDummy,#PB_Ignore,#PB_Ignore,igImageGdgW,igImageGdgH)
                         ResizeGadget(#BtnExit,(igImageGdgW -35),#PB_Ignore,#PB_Ignore,#PB_Ignore)

                     EndIf

                         ResizeGadget(#ImageGdgt, iGdgPosnX, iGdgPosnY, iImageWdth, iImageHgt)
                       SetGadgetState(#ImageGdgt,ImageID(#Image))
                       SetWindowTitle(#WinMain, sgTitle + "   " + sgDefaultPath)

                      If (igSlideShow = #False) : SetGadgetText(#StrFile, sgCurrImage) : EndIf
EndProcedure

Procedure StartImage()
;---------------------
Shared sgCurrImage
Shared sgDefaultPath
Shared sgImageFullPathOrg

; Args
              sgImageFullPathOrg = ""
                      iTotalArgs = CountProgramParameters()

        For i = 0 To iTotalArgs

                  sgImageFullPathOrg = sgImageFullPathOrg + ProgramParameter(i) + " "
        Next i

      If(Len(sgImageFullPathOrg) > 4)

                                  sgImageFullPathOrg = RTrim(sgImageFullPathOrg)
              If LoadImage(#Image,sgImageFullPathOrg)

                    sgDefaultPath = GetPathPart(sgImageFullPathOrg)
                      sgCurrImage = GetFilePart(sgImageFullPathOrg)

                            If(Len(sgCurrImage) > 0)

                                    ShowImage()
                            EndIf

                    igListDone = #False
              EndIf
      EndIf

EndProcedure

Procedure ImageOpen()
;--------------------

Shared sgCurrImage
Shared sgDefaultPath
Shared sgImageFullPathOrg
                                                                          ;first opt in sgPat
      sgImageFullPathOrg = OpenFileRequester("Select Image",sgDefaultPath,sgPat,0)

      If(Len(sgImageFullPathOrg) > 0)

              If LoadImage(#Image,sgImageFullPathOrg)

                    sgDefaultPath = GetPathPart(sgImageFullPathOrg)
                      sgCurrImage = GetFilePart(sgImageFullPathOrg)

                            If(Len(sgCurrImage) > 0)

                                    ShowImage()
                            EndIf

                    igListDone = #False
              EndIf
      EndIf

EndProcedure

Procedure ImageSave()
;-------------------
sNameNoExt.s = Space(64)
      sExt.s = Space(6)
  sNewName.s = Space(1024)

                        sExt = GetExtensionPart(sgCurrImage)
                        sExt = "." + sExt
                  sNameNoExt = RemoveString(sgCurrImage,sExt,#PB_String_NoCase)

                sImagePath.s = SaveFileRequester("Save Image",sgDefaultPath + sNameNoExt,sgSavePat,0)

         If(Len(sImagePath) > 0)

               ;reload the original image to maintain original size
               If LoadImage(#Image,sgImageFullPathOrg)

                            sPath.s = GetPathPart(sImagePath)
                            sName.s = GetFilePart(sImagePath)
                               sExt = GetExtensionPart(sName)

                        If(Len(sExt) > 0)

                                      sExt = "." + sExt
                                sNameNoExt = RemoveString(sName,sExt,#PB_String_NoCase)

                        Else
                                sNameNoExt = sName
                        EndIf

                               iIndex.i = SelectedFilePattern()

                        Select iIndex

                                 Case 0: sNewName = sPath + sNameNoExt + ".png"
                                         SaveImage(#Image,sNewName,#PB_ImagePlugin_PNG)

                                 Case 1: sNewName = sPath + sNameNoExt + ".jpg"
                                         SaveImage(#Image,sNewName,#PB_ImagePlugin_JPEG)

                                 Case 2: sNewName = sPath + sNameNoExt + ".bmp"
                                         SaveImage(#Image,sNewName,#PB_ImagePlugin_BMP)

                        EndSelect

                        SetGadgetText(#StrFile, sNewName)
              EndIf

              igListDone = #False

       EndIf

EndProcedure

Procedure ImagePaste()
;--------------------
Shared sgImageFullPathOrg

        iGetOK = GetClipboardImage(#Image,32)
     If(iGetOK > 0)

              ; Save TempCopy of image for later use
                               sgImageFullPathOrg = "C:\temp\TempClip.png"
              SaveImage(#Image,sgImageFullPathOrg,#PB_ImagePlugin_PNG)

              ShowImage()

              igListDone = #False

     EndIf

EndProcedure

Procedure ImageBack()
;-------------------
Shared sgCurrImage
Shared sgImageFullPathOrg
Shared sgDefaultPath

      iImageCnt = 1
  sgDefaultPath = GetPathPart(sgImageFullPathOrg)

  If(igListDone = #False) : ListImgFiles() : EndIf

         For iImageCnt = 1 To igImageTotal Step 1

               If ( (UCase(sgImage(iImageCnt))) = (UCase(sgCurrImage)) )

                      If(iImageCnt > 1)

                                    sgCurrImage = sgImage(iImageCnt - 1)
                             sgImageFullPathOrg = sgDefaultPath + sgCurrImage

                            If LoadImage(#Image,sgImageFullPathOrg)

                                    ShowImage()
                                    
                            EndIf

                      EndIf

                      Break

               EndIf

         Next

EndProcedure

Procedure ImageFwd()
;-------------------
Shared sgCurrImage
Shared sgImageFullPathOrg
Shared sgDefaultPath

    iImageTotal = 0
      iImageCnt = 0
  sgDefaultPath = GetPathPart(sgImageFullPathOrg)

  If(igListDone = #False) : ListImgFiles() : EndIf

         For iImageCnt = 1 To igImageTotal Step 1
 
               If ( (UCase(sgImage(iImageCnt))) = (UCase(sgCurrImage)) )

                      If( ((iImageCnt + 1) < igImageTotal) Or ((iImageCnt + 1) = igImageTotal) )

                                    sgCurrImage = sgImage(iImageCnt + 1)
                             sgImageFullPathOrg = sgDefaultPath + sgCurrImage

                            If LoadImage(#Image,sgImageFullPathOrg)

                                    ShowImage()

                            EndIf

                      EndIf
                   
                      Break

               EndIf
         Next

EndProcedure

Procedure SlideShow()
;--------------------
Shared sgCurrImage
Shared igEsc
Shared igShowBack

  iImageCnt.i = 0
     iGdgID.i = 0

        igEsc = #False

        SetGadgetText(#StrFile, "Hit ESC Key to stop Slide Show")
          sDelay.s = GetGadgetText(#StrDelay)
          iDelay.i = Val(sDelay)

        While WindowEvent() : Wend

         ListImgFiles()

          sgCurrImage = sgImage(1)
          igSlideShow = #True

         While (igEsc = #False)
 
                  iImageCnt + 1 
                  ImageFwd()
                  If (iImageCnt = igImageTotal)
                      sgCurrImage = sgImage(1)
                        iImageCnt = 1
                  EndIf

                  Delay(iDelay)
                  igEsc = GetAsyncKeyState_(#VK_ESCAPE)

                 If WindowEvent() = #PB_Event_Gadget
                        If(EventGadget() = #BtnExit) : igEsc = #True : End : EndIf
                 EndIf
         Wend

               igEsc = #True
         igSlideShow = #False

EndProcedure

Procedure OpenWinMain()
;----------------------

  If OpenWindow(#WinMain, 0, 0, igWinWidth, igWinHeight, sgTitle, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)

          WindowBounds(#WinMain,igWinWidth,igWinHeight,igWinWidthMax,igWinHeightMax)

           ImageGadget(#ImageGdgtDummy,igImageGdgX,igImageGdgY,igImageGdgW,igImageGdgH,0,#PB_Image_Border)
           ImageGadget(#ImageGdgt,igImageGdgX,igImageGdgY,igImageGdgW,igImageGdgH,0)

     ButtonImageGadget(#BtnFileOpen, 0, 0, 34, 34, Btn01)
         GadgetToolTip(#BtnFileOpen, "Open")

     ButtonImageGadget(#BtnSave,    34, 0, 34, 34, Btn02)
         GadgetToolTip(#BtnSave, "Save As")

     ButtonImageGadget(#BtnCopy,    68, 0, 34, 34, Btn03)
         GadgetToolTip(#BtnCopy, "Copy to Clipboard")

     ButtonImageGadget(#BtnPaste,  102, 0, 34, 34, Btn04)
         GadgetToolTip(#BtnPaste, "Paste from Clipboard")

     ButtonImageGadget(#BtnBack,   136, 0, 34, 34, Btn05)
         GadgetToolTip(#BtnBack, "Previous Image")

     ButtonImageGadget(#BtnFwd,    170, 0, 34, 34, Btn06)
         GadgetToolTip(#BtnFwd, "Next Image")

     ButtonImageGadget(#BtnSld,    204, 0, 34, 34, Btn07)
         GadgetToolTip(#BtnSld, "Slide Show (ESC key to stop)")

            SpinGadget(#StrDelay,  240, 6, 50, 22, 1, 5000, #PB_Spin_Numeric)
         GadgetToolTip(#StrDelay, "Slide Display Interval")

        SetGadgetState(#StrDelay, 250)
         SetGadgetFont(#StrDelay, FontID1)

          StringGadget(#StrFile,   300, 6, 350, 22, "", #PB_String_BorderLess)
         GadgetToolTip(#StrFile, "File Path")
         SetGadgetFont(#StrFile, FontID1)

          ButtonGadget(#BtnExit, (igWinWidth - 34), 0, 34, 34, "Exit")
         GadgetToolTip(#BtnExit, "Exit Viewer")

         CreateStatusBar(#StatusBar, WindowID(#WinMain))
       AddStatusBarField(600)        ;0 General Messages
       AddStatusBarField(#PB_Ignore) ;1 Image Size
           StatusBarText(#StatusBar, 0, " ")
           StatusBarText(#StatusBar, 1, " ")

  EndIf

EndProcedure

;#### MAIN

OpenWinMain()
 StartImage()

;Event loop

Repeat

  iEvent.i = WaitWindowEvent(1)

  Select iEvent

    Case #PB_Event_Gadget

                iGdgID = EventGadget()

         Select iGdgID
                         Case     #BtnExit: iEvent = #PB_Event_CloseWindow : Break
                         Case #BtnFileOpen: ImageOpen()
                         Case     #BtnSave: ImageSave()
                         Case     #BtnCopy: SetClipboardImage(#Image)
                         Case    #BtnPaste: ImagePaste()
                         Case     #BtnBack: ImageBack()
                         Case      #BtnFwd: ImageFwd()
                         Case      #BtnSld: SlideShow()             
         EndSelect

  EndSelect

Until iEvent = #PB_Event_CloseWindow

End

DataSection
  Btn01:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C0000001C000000,$DF0D720000000608,$5948700900000094
  Data.q $0E0000C40E000073,$00001B0E2B9501C4,$DB07454D49740700,$E3896122020E1302,$5845740700000031
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $03000027D2EEA800,$B5894854414449C5,$F1C01845148C4BD6,$2807D9AFB0F4F57F,$8828C14411021091
  Data.q $0920F41E0F071F11,$4A307BAC7C4C47C1,$485D96DC09283C42,$842682F1A36068BC,$D1204227BB03C68B
  Data.q $A084C44C0F8B9660,$4F7479975DC5C182,$7F75774CCF774F77,$8CBBB0A2CCC8601E,$FA97EAABAA5DF25F
  Data.q $613161112B5775F2,$283819F91171C618,$270591142F79E522,$37B7ABB48C32A6F0,$E606001C0FA698CE
  Data.q $AD34C640D81176B5,$832DB613A6773B6D,$FDE035CB95D22323,$70D81BA040A2FF40,$68B2D977A4752A53
  Data.q $6B5272D6A4E4B2DC,$06BEDF63792CB719,$668105BE8046015C,$64A52A6E64065D46,$563CE6B037A3D1CF
  Data.q $D3D9D2C3C3EBC92A,$DE818603D34C6713,$4A528D357FD57DE6,$000C8FB3C35C183E,$F75D12F07ABC0A90
  Data.q $C2FB2DE4E4D0E66E,$1B1898C6C7C61C77,$810FEB44C28A3AD3,$A55920E637C4458F,$AED6014FA94A5BD4
  Data.q $E5D65B1CBACB64E8,$EF3AA5D30AB7FEF8,$0C0DCC46DB7C3E1D,$994D4C5F3F7FB430,$35D5D1D7DBDDECAF
  Data.q $636ED4A569CD319A,$D1ECFA86328FDCCE,$EFA73EB63F6F3DB5,$BF8662779002CBEE,$E37AB377F785E69C
  Data.q $194BA5E03782DBC6,$8998CE674380703A,$591DA4A5AE40FDD6,$BE8E56AB8BCF6663,$7C8BA1E0E165BAB6
  Data.q $E8E817F3E1CB397B,$3B1DD188D8379EEE,$BC71D15D4EA7B392,$6962BDD0207E6CC1,$9ABE5C5FE9F265B6
  Data.q $87EC28B13132302C,$F00CF1F8EEF82713,$7112DA4B7344888E,$7B6E4F14F9FBBC22,$D516305F6FB6A79E
  Data.q $8E30CA176BB27C6A,$D35830CA00D7C889,$697D9FDE5F1E3599,$337BEBADE5F65F79,$2989C1783B5DF577
  Data.q $CD99803FF7559A78,$8F3E728B7FF372DE,$675FB9C945122C53,$A8CCD371930DCB42,$DFEE1E67E6CA9D2E
  Data.q $BFAEE799FD43F4F4,$C40C450280220006,$FE9F8E407245060B,$389E29CE737D37F0,$840F80D815345F6B
  Data.q $4C4B2CDEB2C1A69D,$0C571D156FCDE0B5,$06851DB7FF943195,$354ABC4C372C0450,$370152C56D26AFC1
  Data.q $6A34508AE26178D0,$55EBB45765802A51,$71A84AC17B5AFC13,$746C500ED02704C3,$A96813AE46E0A969
  Data.q $340DC1355E84F9B4,$CE2C034280762F25,$6E83769AF8EB9158,$CA8ED66F53D41098,$FC1396A71EA160CD
  Data.q $57F389ABF1A0600F,$945A800D57036EA9,$DB0BD4EBECB1405A,$200500E26178260D,$2F16BEDA29A5FCDF
  Data.q $6813A06DB4E3D4D4,$AD28B5F2065C7ECA,$241B8B12BB058336,$B8293BAD77AB2B6D,$25F30668055C0DB1
  Data.q $75655DA128C34E2F,$06C8AC666BED8D02,$2D612A7A83026F66,$AAC674E372582B6D,$4820EA516B026E97
  Data.q $A13026DD43714A2D,$D4B4A2D6CC02C5E4,$41B827A8348F5E02,$31B00DF5F6584E7B,$C97B3F9CA7017AD6
  Data.q $CADF7512C0CF7ADF,$9FC2BDFC7F063BCE,$CB58C6A984497AF9,$8EA18C89EA52862F,$C6376771A683C528
  Data.q $70250E9C74675DF5,$8E63007F8052445A,$00005B4B3A1D52D6,$42AE444E45490000,$0000000000008260
EndDataSection
DataSection
  Btn07:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1B0000001A000000,$9F16620000000608,$594870090000006B
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$FA17BA122E0F1B02,$58457407000000EB
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $03000027D2EEA800,$CD8948544144490E,$9FC61C656C4BCF96,$70C2C7E7347AFDE7,$4ACC3F6F01CC5C6E
  Data.q $A1A37442CC2D68DC,$82ED180C235936A4,$08828203FA289B4B,$15245D303041768A,$DD2B994831FA52D2
  Data.q $2355B57236957198,$6D3CE73339649177,$F536999CF7932E12,$03E1E7EF9EF17785,$C001241240F0E2EF
  Data.q $800EA3DC5E4F0035,$0C7C19DC24ACBD6C,$1BF453AA1E00AFC0,$031D99922B7FB180,$F739DCF2482A2FB8
  Data.q $D3350E447A818007,$9921BECCD57ADADA,$8B78F1E30CD5DDA8,$9FF608C1F2457D99,$11EC58B163264CA2
  Data.q $E8F0B0A6C90ADCE7,$5666123A3A3B28E8,$4499325121A57924,$648A7BCF3CF3972E,$5EB366C8666C2C3E
  Data.q $24D7DCE755DB5B5B,$1DBDBDA0008B75E3,$9205EE739E737373,$CB905A5A5AC984EF,$FB9CE3D62C58BCE5
  Data.q $3A0008A970AF6EFC,$EBE48C64C9913B3B,$66857EFEC987AF24,$224349F9269EF3CF,$38F8F8C6EEEEE800
  Data.q $953630F9F24FBE49,$97B9CE7ACD9B214A,$FBFA000890DDBE48,$4A7E48E4343431FB,$66634E9D363099F2
  Data.q $86D5F249BE48C666,$BEBE8C3C3C300044,$30F1F2417DCE733E,$2463636307A7A7B6,$3000448699C901F9
  Data.q $31EEBABABAE93939,$0C0EC61FDE496FB3,$41BC91D07070600C,$CECECC491121A872,$18ACCD7BA952A536
  Data.q $D7B7B7A08C8C8FC5,$116EB47C925F739C,$CF69E9E9879E7800,$313F14592587FDF7,$3E00E39B9B9AE131
  Data.q $BCBCB054A954486E,$FC51FA499FB3315C,$077F972E506AEAEA,$5858584922DD4AF0,$8FEFBEDBA54A96A8
  Data.q $7B7B7B1162C5F144,$2DD66E92E304107E,$FF0F0F0E0959595A,$EC612FD2547F7DF4,$4902B6B6B636F6F6
  Data.q $9A7F420001FA4A2F,$5DDDDD81B1B1B317,$F7630A7E92B3D25F,$D7492EBEBEB1F7F7,$ECED148F7C5F2D25
  Data.q $95949033737360EC,$A58474747B187DF4,$BA3E92BBD25F25A5,$DAC038383A2A1773,$8C316926BD249ADA
  Data.q $20D50A14284A952D,$577F76AB7A486E08,$7D17171631F1F1D1,$7A724C30FA49EF49,$AB56A95F3E7C8A7A
  Data.q $D152E632F97A49DF,$082542850A09C9C9,$3F392611BD24CF82,$9D9D9CAF9F3E473F,$4BD54939E0820CDD
  Data.q $64AF3F3F30CEDAC1,$85340115CE765932,$E9D294D4D4F28674,$50D2B8016ECCD974,$11FB335512244939
  Data.q $64C993949CA22240,$69BFF03C01B76660,$89E006BBAF49FF41,$3900BFD5360D83BA,$007935F1C2FDF1BD
  Data.q $AE444E4549000000,$0000000000826042
EndDataSection
DataSection
  Btn06:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C0000001B000000,$C4D1900000000608,$59487009000000ED
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$BD6F9B09040E1302,$58457407000000F7
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $02000027D2EEA800,$B58948544144491D,$F0071C7112A831D6,$B68A4D2D777FEFEF,$E10818919A04B448
  Data.q $883509E4845C3E64,$441ED5B414D6D4D4,$F252D0822D0E6E7B,$1C4449C21C29A45C,$7489D7A74A6F296A
  Data.q $7BDE38BE436FFF77,$F9FC70707EF4E4BD,$03F1FBBBFF03FFDE,$7675BC780172EC49,$6564DB3B8031D80F
  Data.q $A94AB94A52E840F3,$30B8FE48B7FBEFA5,$A515E484A7F493BB,$607DBF70B9113BD4,$C0114618624A9528
  Data.q $BD7A893264B1C8AB,$2910791133C88A6E,$5162C5166CD90006,$1979C6E4456F5294,$2C2B0C30C5F52953
  Data.q $982A54AFB938D242,$E4441FDB6D96E7CF,$9F30005660E3C936,$C990F5864C9923CF,$D5AB0001C78F1064
  Data.q $48E71C75CB56AD0A,$A40D1A35833F5D6B,$1B6DB2E9D8D0E9D3,$F920BF5AD7DB76ED,$2A560B3BDBD9A3F7
  Data.q $A5E444355AB54295,$50A140018A441C88,$1ABBFFE6C3972E40,$12254D5AB5000629,$297222F7A94ACB89
  Data.q $CB4D9B340C30CC52,$0C5226F2229BACB2,$3CF3CC5237BD8200,$C909DD75D71D3A74,$162F4F5EBD629127
  Data.q $1997F2487D6B470B,$418F1E308D1A3415,$68C74440EFC93EF2,$39F24FBEFDFA36DB,$66CC0026EB278FC9
  Data.q $DB079BD0CB972C33,$C92E3A74E838E395,$BE44530000F760A3,$DE79E9C7D093264E,$920E3C78862C58B5
  Data.q $46FEBD7ADEBB76E8,$1EBEB5A9ACE9E1F2,$00C00794A5000216,$6AEE7CF98060C180,$05DB0679FC91EFAD
  Data.q $243870C53A74D60A,$9D7686E767244780,$2CB4CB972BC444AE,$DBCAE9EA3AF005CB,$EA4977D6B49F3A0C
  Data.q $DF7C2DCA35F7657F,$BEFB5C91CA3E45CF,$A780182F683FF87F,$C41E0DFC136F3F24,$0000F095B85717CE
  Data.q $42AE444E45490000,$0000000000008260
EndDataSection
DataSection
  Btn02:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C0000001A000000,$AF137F0000000608,$59487009000000D3
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$E2950F23030E1302,$58457407000000E6
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $01000027D2EEA800,$ED89485441444954,$F1C71C41024AC1D5,$0B41E1AECBBACCEF,$F49BA127460E9617
  Data.q $EAF40DEAC780BE0A,$2E97A0F37823E973,$85232D882329E09B,$56B5B083A7765DB4,$330E60FE210BAD84
  Data.q $8011FFFE6181F30C,$52946D275D7453E2,$218610025290A528,$DC90C14192D38039,$8D1A3427C74A02CD
  Data.q $DA5D75C1D3A75054,$BBB76E88D1A336ED,$AF786964A4860A82,$054F5EBD4CB97621,$1C71C5D75C7DFBF5
  Data.q $D5A559415803CF3C,$6DB206C88420016A,$74C6A1D9C982A39B,$01016644B0FD7211,$D683B200D58A4008
  Data.q $34752F9C50F687B3,$E87548BCBAB80E18,$09342D12A9866CCB,$C7CB047EF2340F95,$565E4B9980659054
  Data.q $854B53451A9A2A02,$C441AF0C7F1D94FC,$4B18FF09FC997EF0,$820290F7D63B9C17,$D5AB50A952A67368
  Data.q $94FCFE63D7AF79E2,$D2AD5AA26F95B3D8,$66E63C78F9E3366C,$3FFE87B0C7BDDA0D,$A87E0011FB980394
  Data.q $16DE0D82E372EBC8,$A98FA10B1FB7264C,$56C05B3E308BA64B,$679D810779AFC11A,$000000C2893C430A
  Data.q $6042AE444E454900,$0000000000000082
EndDataSection
DataSection
  ImageBack:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$0003000000040000,$8774800000000301,$544C50060000004E
  Data.q $7C000000E3DFE045,$700900000013A44C,$0000000000735948,$A41665EA01000000,$5441444976000000
  Data.q $00000101C1ED9C78,$40486EAFFF208200,$0000000000000001,$0000000000000000,$0000000000000000
  Data.q $0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000
  Data.q $0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000,$66B501000F8306EF
  Data.q $45490000000084E4,$0000826042AE444E
EndDataSection
DataSection
  Btn04:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C00000016000000,$4F2F650000000608,$594870090000005D
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$8E4D3D0F030E1302,$5845740700000005
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $01000027D2EEA800,$ED894854414449A7,$BF8614515B483195,$84241441E69E137B,$4B8268F89E1C4A42
  Data.q $844194EA9050E0D1,$0732420947104208,$1C4411264B828767,$F4B245AED110759C,$B828A2088D1AD909
  Data.q $41DB9797D460E0E8,$7E4A9C5126926AD3,$1CF738FFF739CB38,$0358028D14A517B8,$4169B9F334CC5554
  Data.q $C80498B163946186,$69EA6A54A94E3264,$061C38557AF5EC09,$0B05D4F15AA94A40,$AEA8D027A180E621
  Data.q $DB653C78F352B2EB,$75A94FAF884213B6,$5C0CB0061A8FD4A5,$30C85F3E7CA7E556,$F8A34688BAEBA50C
  Data.q $6CD93CF9F2007EFD,$B6C3972E438E3956,$3C141FCABF605DED,$7CBE3FBF5050832E,$891125DB6174A4D0
  Data.q $4A9BAF0D12244844,$45CB972A2BBBB8A5,$9FC87B41F7D0ECB9,$9FF39B563A5476DD,$5D98E64818780FE8
  Data.q $1393EB83636F645C,$918B2CB6086CD34C,$9A74D58850DE9C78,$F9322F3C399F4B5F,$B8E3E3C3C676A0ED
  Data.q $7C02843565828D35,$0817C69E9B190609,$DE5DD5A8BF4E9AB0,$85E75CFA14D93244,$6A2EF739D64E4D42
  Data.q $3FFE0DB836E0DB83,$5D0ACACEF1EF35C1,$FD5D5CDC82AF3D3D,$4E6ECD0649A9DC1B,$6ECD0641A5BFAFBF
  Data.q $EF6C037003BFB53A,$DF1FE2164877A35F,$CFD6C8A2E8E8AD04,$DFADEFD2FCFFEEC7,$C1330EBD64A6FC4C
  Data.q $444E454900000000,$00000000826042AE
EndDataSection
DataSection
  Btn03:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C0000001B000000,$C4D1900000000608,$59487009000000ED
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$7BE5723A020E1302,$5845740700000067
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $01000027D2EEA800,$ED89485441444906,$F1C01450C26ABDD6,$5B839339D4B70E7F,$A2EB7364A543A5C1
  Data.q $5DE6807C19F16BA3,$5A6E66082109792C,$A08A10411176334A,$9BB43A436A543343,$81C0F7A5D0DCC3E6
  Data.q $0E70B85C7F70E70B,$A69A43C88A575A40,$BB2E5D75B802A564,$4C9C798F1FC2745D,$7074E8B8028F5E54
  Data.q $1EC2820A2C2D3D7A,$C47F67DC8C4E12D1,$773E8BA97DFB5F31,$BB095D965965003B,$6FD852C30D79F7EB
  Data.q $70CDC0184A9B015C,$28883C053A3460C8,$366ECC62DD77B808,$812E5EB6168E3B69,$0CC198330620FE3F
  Data.q $D997802984FFB066,$326FBE283DBB788C,$CF5356444C356E87,$894DBAB1DE7A9B3B,$5595A4924B1A5E69
  Data.q $B0DAEB819E346F3C,$D7DF2782C5B786A2,$975BC873F451E642,$251BFCF5C6A42445,$00AC2A2F58838A22
  Data.q $AE444E4549000000,$0000000000826042
EndDataSection
DataSection
  Btn05:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1C0000001B000000,$C4D1900000000608,$59487009000000ED
  Data.q $0E00004D0E000073,$00000968D546014D,$DB07454D49740700,$5741FB35030E1302,$58457407000000B7
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $01000027D2EEA800,$BD894854414449FE,$F007147152A83FD6,$0C5A506BFBBF39EF,$9E5C9C255A8FBC5B
  Data.q $422123E190E8222E,$1B9A0A6ADB268727,$C328691726E6E682,$7F918922D20537C9,$DD044797149710C6
  Data.q $EF4F8782DCB4EFEE,$CE3FBA6FC0EDEBC5,$208881C3BF039EE7,$399DDDE828F001C8,$E462C22E00A74202
  Data.q $BF9993744419DB25,$F65EF7A318C24888,$9005BF331481F609,$4A54BC00C204830C,$ED66063A050A169D
  Data.q $AD69E8890F4440FA,$32B2B8D0756DF356,$872E5C9BF3334A22,$32A2B808147D3A74,$B6DB60FA94AEBA22
  Data.q $962227DAFF4A952E,$CEBAEB90A1DBFAD6,$BF1E3C5DF9988B56,$0003162C74B56ADB,$1D43B366CC1B366C
  Data.q $95CBA3468C2B56AC,$D7AF57BE6633D111,$F204891200085FD5,$8CBF3E7CD8C1FCF9,$152A545E88895111
  Data.q $9617DE270752A54E,$20C9932773309D07,$D11300010246CD9B,$D5E3264C9F7E6635,$BC00C385DDEFD56A
  Data.q $295A1A3469DF5AD6,$3D8E8E413BE5A515,$5C76DDBB6BE71C76,$98C65F9113168DD7,$9AEDDBA3FD7AF5B3
  Data.q $E631859110003148,$168C3870C63C78C1,$F5EBDE791173C0F3,$C75FF6091972E5DC,$6DB6CFE20DE616D5
  Data.q $326111169B366ADF,$50ACB2C0E9D3A099,$1105C88BEA6B7883,$ABEFDFB0C58B1755,$1C76FC4FDE4CB972
  Data.q $899DE3B018A1F6E7,$98060C1CD318D4C8,$B7DE256FF261A74E,$5162C53B5AD2BD55,$98A003957489C888
  Data.q $568160639B3323F9,$D2237318D8D4A539,$EF75D777F36BCE55,$03CC205030CFC88B,$A603FB161278013F
  Data.q $009AFC5D8788EBC0,$AE444E4549000000,$0000000000826042
EndDataSection
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
Post Reply