Merge & Position any no. of Images

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Merge & Position any no. of Images

Post by RASHAD »

Based on the nice code by Danilo
Drag selected image using mouse
Add ,Delete ,Move & Change Zero-Order
Arrow keys To move the selected Image
Ctrl-Arrow To change selected image size
Ctrl- - ,Ctrl- + To change selected image size With respect To Aspect Ratio
Mouse wheel To chang selected image size With respect To Aspect Ratio
Save & Print the final image

Code: Select all

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

Structure canvasitem
  img.i : x.i : y.i : width.i : height.i : alphatest.i
EndStructure

Global isCurrentItem = #False
Global currentItemXOffset.i, currentItemYOffset.i

Global NewList Images.canvasitem()

Procedure DrawCanvas()
  If StartDrawing(CanvasOutput(0))
    Box(0,0,GadgetWidth(0),GadgetHeight(0),RGB(255,255,255))
    ;DrawingMode(#PB_2DDrawing_AlphaBlend)
    ForEach Images()
      DrawAlphaImage(ImageID(Images()\img),Images()\x,Images()\y,Images()\alphatest)
      ;DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ; draw all images with z-order
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure AddImage(x,y,img,alphatest=255)
  If AddElement(Images())
    Images()\img    = img
    Images()\x      = x
    Images()\y      = y
    Images()\width  = ImageWidth(img)
    Images()\height = ImageHeight(img)
    Images()\alphatest = alphatest
  EndIf
EndProcedure

Procedure DelImage()
  Index = ListIndex(Images())
  DeleteElement(Images(), Index)
  DrawCanvas()
EndProcedure

Procedure HitTest(x,y)
  isCurrentItem = #False
  If LastElement(Images()) ; search for hit, starting from end (z-order)
    Repeat
      If x >= Images()\x And x < Images()\x + Images()\width
        If y >= Images()\y And y < Images()\y + Images()\height
          alpha=255
          If Images()\alphatest And ImageDepth(Images()\img)>31
            If StartDrawing(ImageOutput(Images()\img))
              DrawingMode(#PB_2DDrawing_AlphaChannel)
              alpha = Alpha(Point(x-Images()\x,y-Images()\y)) ; get alpha
              StopDrawing()
            EndIf
          EndIf
          If alpha
            MoveElement(Images(), #PB_List_Last)
            isCurrentItem = #True
            currentItemXOffset = x - Images()\x
            currentItemYOffset = y - Images()\y
            Break
          EndIf
        EndIf
      EndIf
    Until PreviousElement(Images())=0
  EndIf
  ProcedureReturn isCurrentItem
EndProcedure

Procedure Bring2Top(index)
  SelectElement(Images(), index)
  MoveElement(Images(), #PB_List_Last)
  isCurrentItem = #True
  currentItemXOffset = x - Images()\x
  currentItemYOffset = y - Images()\y
  DrawCanvas()
EndProcedure

Procedure saveCB()
  StartDrawing(CanvasOutput(0))
    GrabDrawingImage(20,0,0,GadgetWidth(0)-5,GadgetHeight(0)-5)
  StopDrawing()
EndProcedure

Procedure printCB(file.s)
  If PrintRequester()
    If StartPrinting("Vector Print Test")    
      HDC = PrinterVectorOutput(#PB_Unit_Pixel)
      StartVectorDrawing(HDC)
        PageWidth  = PrinterPageWidth()
        PageHeight = PrinterPageHeight()        
        AddPathBox(50, 50, PageWidth-100 , PageHeight-100)
        StrokePath(10)
        If LoadImage(0,file)          
          MovePathCursor(100,100)
          scale.f = (PrinterPageWidth()-200)/ImageWidth(0)
          DrawVectorImage(ImageID(0),255,ImageWidth(0)*scale , ImageHeight(0)*scale)
        Else
          MessageRequester("Error","Can't load the image")
        EndIf
      StopVectorDrawing()   
    StopPrinting()
    EndIf
  EndIf
EndProcedure

Procedure sizeCB()
  ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20)
  ResizeGadget(1,#PB_Ignore,WindowHeight(0)-65,190,34)
  DrawCanvas()
EndProcedure

CatchImage(0,?Image_000)

StartDrawing(ImageOutput(0))
  GrabDrawingImage(10,6,5,24,24)
  GrabDrawingImage(12,32,0,35,32)
  GrabDrawingImage(13,68,5,24,24)
  GrabDrawingImage(18,95,2,24,24)
  GrabDrawingImage(14,125,5,24,24)
  GrabDrawingImage(16,155,5,24,24)
StopDrawing()
FreeImage(0)

winflags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget ;| #PB_Window_Invisible
If OpenWindow(0, 0, 0, 420, 520, "Merge Images", winflags)
  WindowBounds(0,300,300,#PB_Default,#PB_Default)
  CanvasGadget(0, 10, 10, 400, 500 ,#PB_Canvas_Border  | #PB_Canvas_Container)  
    SetGadgetAttribute(0, #PB_Canvas_Cursor , #PB_Cursor_Hand)
    ContainerGadget(1,5,WindowHeight(0)-65,190,34,#PB_Container_Raised)
    SetGadgetColor(1,#PB_Gadget_BackColor,$88FE98)
      ImageGadget(8,5,3,30,30,ImageID(10))
      GadgetToolTip(8,"New Page")
      ImageGadget(9,32,-2,30,30,ImageID(12))
      GadgetToolTip(9,"Add Image")
      ImageGadget(10,68,3,30,30,ImageID(13))
      GadgetToolTip(10,"Del Image")
      ImageGadget(11,95,0,30,30,ImageID(18))
      GadgetToolTip(11,"Bring2Top")
      ImageGadget(12,125,3,30,30,ImageID(14))
      GadgetToolTip(12,"Save..")
      ImageGadget(13,155,3,30,30,ImageID(16))
      GadgetToolTip(13,"Print..")
    CloseGadgetList()
  CloseGadgetList()
 
items = 1 : itemy = 10
BindEvent(#PB_Event_SizeWindow,@sizeCB())

AddKeyboardShortcut(0,#PB_Shortcut_Left,1)
AddKeyboardShortcut(0,#PB_Shortcut_Right,2)
AddKeyboardShortcut(0,#PB_Shortcut_Up,3)
AddKeyboardShortcut(0,#PB_Shortcut_Down,4)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Left,5)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Right,6)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Up,7)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Down,8)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Subtract,9)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Add,10)
AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Subtract,11)
AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Add,12)

;HideWindow(0,0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Quit = 1
      
    Case #PB_Event_Menu
      If EventMenu() > 4
        For index = 1 To items
          If Images()\img = index*100
            nimg = index*100
            CopyImage(index,nimg)
            Break
          EndIf
        Next
      EndIf
      Select EventMenu()
        Case 1
          Images()\x - 1
          If ListSize(Images()) > 0 And Images()\x < 0
             Images()\x + 5
          EndIf
        Case 2
          Images()\x + 1
        Case 3
          Images()\y - 1
          If ListSize(Images()) > 0 And Images()\y < 0
            Images()\y + 5
          EndIf
        Case 4
          Images()\y + 1
        Case 5
          ResizeImage(nimg,Images()\width-1,Images()\height)
        Case 6
          ResizeImage(nimg,Images()\width+1,Images()\height)
        Case 7
          ResizeImage(nimg,Images()\width,Images()\height-1)
        Case 8
          ResizeImage(nimg,Images()\width,Images()\height+1)
        Case 9
          ResizeImage(nimg,Images()\width/1.01,Images()\height/1.01)
        Case 10
          ResizeImage(nimg,Images()\width*1.01,Images()\height*1.01)
        Case 11
          ResizeImage(nimg,Images()\width,Images()\height)
          If Images()\alphatest > 0
            Images()\alphatest - 1
          EndIf
        Case 12
          ResizeImage(nimg,Images()\width,Images()\height)
          If Images()\alphatest < 255
            Images()\alphatest + 1
          EndIf
        EndSelect
        If EventMenu() > 4
          images()\img = nimg
          Images()\width = ImageWidth(nimg)
          Images()\height = ImageHeight(nimg) 
          DrawCanvas()
        Else         
          DrawCanvas()  
        EndIf      
     
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0 
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              If HitTest(x,y)
                DrawCanvas()
              EndIf
              Drag = #True
              
            Case #PB_EventType_LeftButtonUp
              Drag = #False
              
            Case #PB_EventType_MouseMove
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              If ListSize(Images()) > 0 And Images()\x < 0
                Drag = #False
                Images()\x + 5
              ElseIf ListSize(Images()) > 0 And Images()\y < 0
                Drag = #False
                Images()\y + 5
              EndIf
              If Drag = #True
                If isCurrentItem
                  x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                  y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                  If LastElement(Images())
                    Images()\x = x - currentItemXOffset
                    Images()\y = y - currentItemYOffset
                    DrawCanvas()
                  EndIf
                EndIf
              EndIf
              
            Case #PB_EventType_MouseWheel
              Value.f = GetGadgetAttribute(0,#PB_Canvas_WheelDelta )
              For index = 1 To items
                If Images()\img = index*100
                  nimg = index*100
                  CopyImage(index,nimg)
                  Break
                EndIf
              Next
              If value > 0
                ResizeImage(nimg,Images()\width/1.05,Images()\height/1.05)
              Else
                ResizeImage(nimg,Images()\width*1.05,Images()\height*1.05)
              EndIf
              images()\img = nimg
              Images()\width = ImageWidth(nimg)
              Images()\height = ImageHeight(nimg)               
              DrawCanvas()              
          EndSelect          
        
      Case 8                        ;New page
        Select EventType()
          Case #PB_EventType_LeftClick
            For i = 1 To 10
              If IsImage(i)
                FreeImage(i)
              EndIf
            Next
            ClearList(Images())
            StartDrawing(CanvasOutput(0))
              Box(0,0,GadgetWidth(0),GadgetHeight(0),$FFFFFF)
            StopDrawing()     
        EndSelect
        
      Case 1                                        ;Add items
        Select EventType()
          Case #PB_EventType_LeftClick
            File$ = OpenFileRequester("SELECT IMAGE","","All supported formats|*.*;*.bmp; *.jpg; *.jpeg; *.png;*.tif;*.tiff;*.tga|TGA image (*.tga)|*.tga|TIF image (*.tif)|*.tif|TIFF image (*.tiff)|*.tiff|PNG image (*.png)|*.png|BMP image (*.bmp)|*.bmp|JPEG image (*.jpg;*.jpeg)|*.jpg;*.jpeg",0)
            If FileSize(file$) > 0
              result = LoadImage(items, file$)
              If result
                cimg = items*100
                ResizeImage(items,595,595*ImageHeight(items)/ImageWidth(items))
                CopyImage(items,cimg)
                AddImage(10,itemy,cimg)
                itemy + 40
                DrawCanvas()               
                items + 1
              Else
                MessageRequester("Error","Format not supported !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              EndIf
            Else
              MessageRequester("Error","No File loaded !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
            EndIf
          EndSelect
        
      Case 10
        If ListSize(Images()) > 0
          DelImage()
        EndIf
        
      Case 11                    ;Bring item 2 top
        Select EventType()
          Case #PB_EventType_LeftClick
            If ListSize(Images()) > 0
              Bring2Top(0)
            EndIf  
        EndSelect  
       
      Case 12                    ;Save page
        Select EventType()
          Case #PB_EventType_LeftClick
            If ListSize(Images()) > 0
              sFile$ = SaveFileRequester("Please choose file to save",""," All supported formats|*.bmp; *.jpg; *.png | BMP image (*.bmp)| *.bmp| JPEG image (*.jpg;*.jpeg)|*.jpg| PNG image (*.png)| *.png",0)
              If sFile$
                saveCB()
                If GetExtensionPart(sFile$) = ""
                  If SelectedFilePattern() = 1
                    sFile$ + ".bmp"
                  ElseIf SelectedFilePattern() = 2
                    sFile$ + ".jpg"
                  ElseIf SelectedFilePattern() = 0 Or SelectedFilePattern() = 3
                    sFile$ + ".png"
                  EndIf
                EndIf                
                If GetExtensionPart(sFile$) = "bmp"
                  SaveImage(20, sfile$ ,#PB_ImagePlugin_BMP)
                ElseIf GetExtensionPart(sFile$) = "jpg"
                  SaveImage(20, sfile$ ,#PB_ImagePlugin_JPEG)
                ElseIf GetExtensionPart(sFile$) = "png"
                  SaveImage(20, sfile$ ,#PB_ImagePlugin_PNG)
                EndIf              
                FreeImage(20)
                MessageRequester("Info","File saved successfully", #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
              Else
                MessageRequester("Error","Process failed !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              EndIf
            EndIf
              
        EndSelect
        
      Case 13
        Select EventType()      ;Print page
          Case #PB_EventType_LeftClick
            If ListSize(Images()) > 0
              saveCB()
              SaveImage(20, GetTemporaryDirectory()+"print.png" ,#PB_ImagePlugin_PNG)
              FreeImage(20)
              printCB(GetTemporaryDirectory()+"print.png")
              DeleteFile(GetTemporaryDirectory()+"print.png")
              MessageRequester("Info","File printed successfully", #PB_MessageRequester_Ok | #PB_MessageRequester_Info  )
            Else
              MessageRequester("Error","Process failed !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
            EndIf
        EndSelect
      EndSelect
  EndSelect
 
Until Quit = 1
EndIf

DataSection
  Image_000:
     Data.q $464A1000E0FFD8FF,$0100000101004649,$4300DBFF00000100,$0A06070807070A00,$0E0B0A0A0B080808
     Data.q $151D0E0D0D0E1018,$2224251F23181116,$262F372B2621221F,$3141302221293429,$2E253E3E3E3B3934
     Data.q $3E3D37483C434944,$0B0A014300DBFF3B,$1C10101C0E0D0E0B,$3B3B3B3B2822283B,$3B3B3B3B3B3B3B3B
     Data.q $3B3B3B3B3B3B3B3B,$3B3B3B3B3B3B3B3B,$3B3B3B3B3B3B3B3B,$3B3B3B3B3B3B3B3B,$C0FF3B3B3B3B3B3B
     Data.q $03BB002100081100,$1103011102002201,$0100001F00C4FF01,$0001010101010105,$0100000000000000
     Data.q $0908070605040302,$0010B500C4FF0B0A,$0503040203030102,$017D010000040405,$2112051104000302
     Data.q $2207615113064131,$2308A19181321471,$24F0D15215C1B142,$17160A0982726233,$29282726251A1918
     Data.q $3A3938373635342A,$4A49484746454443,$5A59585756555453,$6A69686766656463,$7A79787776757473
     Data.q $8A89888786858483,$9998979695949392,$A8A7A6A5A4A3A29A,$B7B6B5B4B3B2AAA9,$C6C5C4C3C2BAB9B8
     Data.q $D5D4D3D2CAC9C8C7,$E3E2E1DAD9D8D7D6,$F1EAE9E8E7E6E5E4,$F9F8F7F6F5F4F3F2,$0300011F00C4FFFA
     Data.q $0101010101010101,$0100000000000001,$0908070605040302,$0011B500C4FF0B0A,$0704030404020102
     Data.q $0077020100040405,$3121050411030201,$1371610751411206,$A191421408813222,$15F052332309C1B1
     Data.q $E13424160AD17262,$27261A191817F125,$39383736352A2928,$494847464544433A,$595857565554534A
     Data.q $696867666564635A,$797877767574736A,$888786858483827A,$9796959493928A89,$A6A5A4A3A29A9998
     Data.q $B5B4B3B2AAA9A8A7,$C4C3C2BAB9B8B7B6,$D3D2CAC9C8C7C6C5,$E2DAD9D8D7D6D5D4,$EAE9E8E7E6E5E4E3
     Data.q $F9F8F7F6F5F4F3F2,$0001030C00DAFFFA,$F4003F0011031102,$C0295157566E2FB9,$EEAA35AC71410562
     Data.q $05FDD4037A66EB9A,$F9214B33B764F232,$B04D13ABFD7D9250,$37AA8BAF6E79D4FE,$15F60CFA04D860DD
     Data.q $4929A7C36BBC78F3,$59ADCA25DEE09793,$A9917DBB69BB08B5,$231E6EDA67D28907,$1A00FFF10700C8D8
     Data.q $95FE98C893EBF6BF,$B0F228DCA68D3E9D,$FD7D72DCF268A38C,$69B22C725768674D,$AB6E847C2CC92AF7
     Data.q $39336173C59D3EEA,$29E0C6E94CBB3462,$D35D2E290D5717FB,$0068566D7AA33B7D,$F60F15C07172332F
     Data.q $91EF3F59CF00FFF3,$EB0FEF9FBA1F3555,$D257FB7A06FBEC59,$B469B5BDE12885D3,$B35661B478E6EBBA
     Data.q $79FB6F33BF6D8351,$A9C8F79FACE700FF,$0ECEACF69965D622,$3D2375D48315C833,$27274FFBC1D3580D
     Data.q $8EFC2A46A9ABF56F,$777D973C7DEFB556,$BD9B938392502AF4,$DBE746DEFE7E6DED,$F73E2BFDB1E77FAE
     Data.q $24965B8A306329C5,$CF915C9F70A5F27D,$F4D20675D7A0E6B0,$7F264CF4C6C49B5B,$DB34CE6BEA074EBC
     Data.q $F78BB14F14F5EE89,$88F8B763818D9663,$D4AC0E79CDF71CC1,$73F964EB797F9B5C,$34ADF249AB55C2C5
     Data.q $95F194F4C8CFBF76,$643D65D9252A93B4,$568CE3BFD7AF761B,$F420311120B9BFA8,$4B8611DA97E61523
     Data.q $B6CC21D9EA8EB7B7,$902585621E295CF2,$4A1FA01E07C39D63,$F68CED25AB2EF0DB,$00FFA1C06CE3B6B2
     Data.q $21EAFC41E0C7B365,$D9E6FDC978237588,$9B866F7F380A599E,$DB879DFA7DD3B5B2,$EBBA2AFDB1E77FAE
     Data.q $064B8017B666AEA1,$EB7564648C5B31DF,$0CEB2CF32C43A5C7,$45F75BCA2C173716,$F9510FF37E800038
     Data.q $E675A7FD4B6B9AD4,$6372CC2198BB25C1,$DBB57E24F4A5F970,$B94B9BF7AB56A787,$6F62B75DADF6B0F3
     Data.q $00FFC49F00FF76ED,$6D4F2FCFF53185BE,$90715E2CDBCAEE41,$85D233C63963028E,$264B3C6D539FECD7
     Data.q $36F2B3DD8F4B60FC,$15AF23F207F7FE06,$ECBFAE4DF25FEACE,$8A98D624FA00FF0E,$393976B769CBA352
     Data.q $A9C4C37253CF7BAB,$64F231716BAF24A9,$005BD9782059E4F2,$ADC61F183D28ABE0,$FE9B3D00FFCF697F
     Data.q $D5801F56EB00FFF9,$D41AB7B245D74E9F,$BF8C5E4C1EC7219C,$A49139EA9278BACE,$3AFE1FCB19868249
     Data.q $F7E7FDAFBEAD917F,$1AF3BE347FC1FE9D,$DB58F2F7D796C5CF,$3AD02ABFC5D3485E,$C306941936B6B103
     Data.q $FEE7BAFD684D7070,$0FEEC3EBBCD21F7B,$CF529F9507F57BC4,$28B0CE3377AD04FE,$E21AAB830AB7BBE0
     Data.q $797F32925321EDAD,$F7272339359E5BC3,$BBB762F2F5620D92,$70907111BD2B4199,$52F9D270B31ED17B
     Data.q $FA6E0065D9EFD6F9,$C98C4A27D44D7A54,$20C0A52C77B97134,$AE691375B1163596,$1820862C2C49F1C8
     Data.q $2E165EF58AC39D64,$B77CC2D5D4DF4D36,$00FF73DD7E347752,$F5C5B4F65CE98F3D,$00FF2454498E5949
     Data.q $1CE225DED96845C0,$6BA86EE3E1104929,$EE9F949000FF5737,$F3290B832B80FEA7,$49C9F3290B8F4DC9
     Data.q $80B8A2DABF95FA9A,$B57EE45C1F27161C,$B300FFAC2E98A591,$95224BF3E668B867,$93DC56BC7ED081E9
     Data.q $915830980BBBD240,$D3BBCE1A00FFE5FB,$098ABCA3F364EEAC,$EBCFF4939749EFBA,$53F9BD520533465E
     Data.q $52CCB2F4BC3FFA4E,$3BDD2D6AAA42A7A4,$BAF6692B99FCFC6C,$92DBB1A29BDBCB6E,$A100FF7192035772
     Data.q $E2A1CE7874B1CA0F,$6CB3513C3B48AD2B,$E90F7B0CE039E376,$AB73CB8E4C871F4B,$B1042751DC16E4C7
     Data.q $616DB706D7074EFC,$44B7E52D58B7B2B2,$CF354F7DF272DE5E,$DF2E756E52ABCB84,$4EA514C6C58DD3A1
     Data.q $7D8996AE9594E693,$F587F74FDD8F3AC4,$B7757E3C498CC2AC,$3938887B00CEDA32,$B6EC8B1A00FF65E2
     Data.q $5F00FFFD17F1F35F,$1AA1D7A87476AFF1,$C4848FC7DEBDD455,$60AEE6EB08EBC2D6,$3773231791FD5C5E
     Data.q $4B2C9E68A8E25CDD,$4AE50FA48C94F98B,$561CF5A8E7B471DB,$E569AB0E3F3C899F,$0817648503137145
     Data.q $932BBD9E83F38CA4,$3C8FEAA7CF1E7ED0,$DC8DE9FEE68B42B2,$52697203B47F2A64,$EF93CCA5928AC2C3
     Data.q $B65E112BB4FEF5BB,$FD795A924DA75E25,$BCD6791AC4F74EFD,$A27B342F0F69753B,$18677A1D866119CF
     Data.q $AAACC3FEEED025AF,$6448916CD76DCCDD,$E2E075E44825E407,$97440AC1B31FAABD,$C0B9CC8C428D6D30
     Data.q $EBA121BCD7C25A1F,$598FEEAD689667EE,$7F7086F76F0199A1,$DB49C2C549A9609D,$54C6C2F271CAEDD0
     Data.q $BCE3D8B6BEF2C56A,$DAD95FBCB5DBAE51,$70836EE69F374D9A,$FE90772039720128,$4BD79A4BD7F0BF55
     Data.q $CB97B1FD4A9D509F,$F227893FCF45A907,$9D55FA8600FFF4A8,$91D3DE0DA736CDCA,$76CD0DA89F36A51C
     Data.q $03B7CD4D8128BC91,$C3519AE5078A2C1F,$C07FF9BBB07C2AFB,$50E80E530573CC37,$F2BFE92DD376DF4D
     Data.q $12FA00FFE0FA5F15,$14F5F9C69E743553,$FB268EA3298AB3B9,$5D8F60C45286E14E,$612E7EABCC52A5DF
     Data.q $68B43C450485A2D5,$E3A0CF969320C989,$6FD07F5DB67FAA1D,$AF8900FF831E00FF,$F4779A04674F8542
     Data.q $5F9450D3A8498F67,$49AB79CB5E5967DC,$6744B50592621F34,$9EA36DF62641168C,$6DD51C4746E8A9A3
     Data.q $B76DD4039EECDF7A,$678CDD63C974F2EF,$A012C9C2569C1111,$3299B1602016EE06,$2DEFECA8CB34F87D
     Data.q $1A99E1DD9AB8B566,$3A829132BFCC1439,$7425A9D6592D57FA,$7C92A34A96639FEC,$27BE16698E87DEAE
     Data.q $F47D7D74F9B52ED5,$26DBAFD3BD2B6BCB,$09020282323B3388,$D1201E5AED9360C2,$15AF9B5B6CF8213E
     Data.q $3B35F26D372E4C5C,$C2FB033967DCC696,$A98BE8D2C0331DBA,$0EEA5AD3E9AC6341,$572C6C98A576E98C
     Data.q $ADF7E4783F5749E6,$26895475D74D4F3D,$06B2DB6E1154F4D6,$5E7AA58F99EB38E7,$BC683F3D737F3ED6
     Data.q $97B8E60BDF70E6FE,$0D619646EA0277C6,$B8C78B592C6677C1,$24D56B729E247992,$CB5DE4C56A5D4BB9
     Data.q $2DFCE59AEF3F5EB2,$6D567D76EDE191E0,$6A130557E7E1D266,$E94A1FCB13835D00,$C937279EAFEDAC6F
     Data.q $19DFC9246BBBC513,$3B85F5B729AEF4EB,$B353B7BFB21C7A3B,$A47B04D3BE08A1B7,$7A46B92D6639D082
     Data.q $591A71FB68AB4FD4,$358F1BA86A97A179,$D315E5C55BA2BD2D,$6F6EE092BC3FC167,$6140DFDBA57B43AD
     Data.q $38C5124172C8B468,$7FEF1E7A453DB8DC,$B83FBB6AAF8EFCCF,$51F589E7157B6DB1,$E43B4E6E45026114
     Data.q $5242FE5F6D55F83F,$5E1AAB00FA9FBA7F,$16D438714DA66B97,$C96496248942AE79,$ABBAAAA9C7749CDB
     Data.q $51EDBA3A3232EAAB,$573AAE77741F3995,$ACEE4A65682BA575,$B3AE288A220E6DA5,$8AA228008AA228A8
     Data.q $8AA228008AA22800,$8AA228008AA22800,$8AA228008AA22800,$8AA228008AA22800,$D9FF008AA22800
  Image_000end:
EndDataSection
Edit :Code modified
Edit 2: Code Modified
Edit 3: Code modified
1- Added transparency effect as per infratec suggestion
2- Fixed some bugs as per davido remarks
Edit 4:Bug fixed
Last edited by RASHAD on Sun Mar 08, 2020 6:26 pm, edited 7 times in total.
Egypt my love
User avatar
ChrisR
Addict
Addict
Posts: 1150
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Merge & Position any no. of Images

Post by ChrisR »

Thanks Rashad,
I refind the great code from danilo in the background
For buttons Del Image, Bring2Top, Save and Print it would be good to add If ListSize(Images()) > 0 to prevent crashing
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: Merge & Position any no. of Images

Post by RASHAD »

Thanks ChrisR
Previous post updated
Egypt my love
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 341
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: Merge & Position any no. of Images

Post by Mindphazer »

# 2: That one should be Cross Platform (Unless I am mistaken :) )
I'm afraid it's not..
- I had to remove all #MB_OK|#MB_ICONERROR of the MessagRequester()
- the icons are not displayed properly on my Mac, probably due to Retina screen
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: Merge & Position any no. of Images

Post by RASHAD »

Hi Mindphazer
Previous post updated
Please check
Egypt my love
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 341
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: Merge & Position any no. of Images

Post by Mindphazer »

Hi Rashad
The icons are still messed up :
Image
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
User avatar
ChrisR
Addict
Addict
Posts: 1150
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Merge & Position any no. of Images

Post by ChrisR »

With these small changes, in addition, we can adjust the transparency of the image on top, with the + and - keys

Code: Select all

;DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ==>
DrawAlphaImage(ImageID(Images()\img),Images()\x,Images()\y,Images()\alphatest) ; draw all images with z-order
 
;Procedure AddImage(x,y,img,alphatest=0) ==>
Procedure AddImage(x,y,img,alphatest=255)
     
      ElseIf GetAsyncKeyState_(#VK_CONTROL) = 0
        .....
        ElseIf key = 107
          If Images()\alphatest < 255
            Images()\alphatest + 1  
          EndIf
        ElseIf key = 109
          If Images()\alphatest > 0  
            Images()\alphatest - 1
          EndIf  
        EndIf
        DrawCanvas()
      EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: Merge & Position any no. of Images

Post by RASHAD »

Hi ChrisR
That is a good idea :)
Will be good to do Water Mark

Hi Mindphazer
I am not a Linux or Mac user and I do not have any
That is strange
Even the position of the menu is not quit right
Using ToolBar

Code: Select all

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

Structure canvasitem
  img.i : x.i : y.i : width.i : height.i : alphatest.i
EndStructure

Global isCurrentItem = #False
Global currentItemXOffset.i, currentItemYOffset.i ,hconstant

Global NewList Images.canvasitem()

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    hconstant = 30
  CompilerCase #PB_OS_MacOS
    hconstant = 0
CompilerEndSelect

Procedure DrawCanvas()
  If StartDrawing(CanvasOutput(0))
    Box(0,0,GadgetWidth(0),GadgetHeight(0),RGB(255,255,255))
    ;DrawingMode(#PB_2DDrawing_AlphaBlend)
    ForEach Images()
      DrawAlphaImage(ImageID(Images()\img),Images()\x,Images()\y,Images()\alphatest)
      ;DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ; draw all images with z-order
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure AddImage(x,y,img,alphatest=255)
  If AddElement(Images())
    Images()\img    = img
    Images()\x      = x
    Images()\y      = y
    Images()\width  = ImageWidth(img)
    Images()\height = ImageHeight(img)
    Images()\alphatest = alphatest
  EndIf
EndProcedure

Procedure DelImage()
  Index = ListIndex(Images())
  DeleteElement(Images(), Index)
  DrawCanvas()
EndProcedure

Procedure HitTest(x,y)
  isCurrentItem = #False
  If LastElement(Images()) ; search for hit, starting from end (z-order)
    Repeat
      If x >= Images()\x And x < Images()\x + Images()\width
        If y >= Images()\y And y < Images()\y + Images()\height
          alpha=255
          If Images()\alphatest And ImageDepth(Images()\img)>31
            If StartDrawing(ImageOutput(Images()\img))
              DrawingMode(#PB_2DDrawing_AlphaChannel)
              alpha = Alpha(Point(x-Images()\x,y-Images()\y)) ; get alpha
              StopDrawing()
            EndIf
          EndIf
          If alpha
            MoveElement(Images(), #PB_List_Last)
            isCurrentItem = #True
            currentItemXOffset = x - Images()\x
            currentItemYOffset = y - Images()\y
            Break
          EndIf
        EndIf
      EndIf
    Until PreviousElement(Images())=0
  EndIf
  ProcedureReturn isCurrentItem
EndProcedure

Procedure Bring2Top(index)
  SelectElement(Images(), index)
  MoveElement(Images(), #PB_List_Last)
  isCurrentItem = #True
  currentItemXOffset = x - Images()\x
  currentItemYOffset = y - Images()\y
  DrawCanvas()
EndProcedure

Procedure saveCB()
  StartDrawing(CanvasOutput(0))
    GrabDrawingImage(20,0,0,GadgetWidth(0)-5,GadgetHeight(0)-5)
  StopDrawing()
EndProcedure

Procedure printCB(file.s)
  If PrintRequester()
    If StartPrinting("Vector Print Test")   
      HDC = PrinterVectorOutput(#PB_Unit_Pixel)
      StartVectorDrawing(HDC)
        PageWidth  = PrinterPageWidth()
        PageHeight = PrinterPageHeight()       
        AddPathBox(50, 50, PageWidth-100 , PageHeight-100)
        StrokePath(10)
        If LoadImage(0,file)         
          MovePathCursor(100,100)
          scale.f = (PrinterPageWidth()-200)/ImageWidth(0)
          DrawVectorImage(ImageID(0),255,ImageWidth(0)*scale , ImageHeight(0)*scale)
        Else
          MessageRequester("Error","Can't load the image")
        EndIf
      StopVectorDrawing()   
    StopPrinting()
    EndIf
  EndIf
EndProcedure

Procedure sizeCB()
  ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-55)
  DrawCanvas()
EndProcedure

CatchImage(0,?new)
CatchImage(1,?add)
CatchImage(2,?b2t)
CatchImage(3,?del)
CatchImage(4,?save)
CatchImage(5,?print)

winflags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_Invisible
If OpenWindow(0, 0, 0, 400, 500, "Merge Images", winflags)
  WindowBounds(0,300,300,#PB_Default,#PB_Default)
  If CreateToolBar(0, WindowID(0),#PB_ToolBar_Large)
    ToolBarSeparator()
    ToolBarImageButton(0, ImageID(0))
    ToolBarToolTip(0, 0, "New Page")
    ToolBarSeparator()
    ToolBarImageButton(1, ImageID(1))
    ToolBarToolTip(0, 1, "Add Image")
    ToolBarImageButton(2, ImageID(2))
    ToolBarToolTip(0, 2, "Bring2Top")
    ToolBarImageButton(3, ImageID(3))
    ToolBarToolTip(0, 3, "Del Image")
    ToolBarSeparator()   
    ToolBarImageButton(4, ImageID(4))
    ToolBarToolTip(0, 4, "Save..")   
    ToolBarImageButton(5, ImageID(5))
    ToolBarToolTip(0, 5, "Print")   
    ;ToolBarSeparator()
  EndIf
 
  CanvasGadget(0, 10, 10+hconstant, 380, 465 ,#PB_Canvas_Border  | #PB_Canvas_Container) 
    SetGadgetAttribute(0, #PB_Canvas_Cursor , #PB_Cursor_Hand)
  CloseGadgetList()
 
items = 1 : itemy = 10
BindEvent(#PB_Event_SizeWindow,@sizeCB())

AddKeyboardShortcut(0,#PB_Shortcut_Left,6)
AddKeyboardShortcut(0,#PB_Shortcut_Right,7)
AddKeyboardShortcut(0,#PB_Shortcut_Up,8)
AddKeyboardShortcut(0,#PB_Shortcut_Down,9)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Left,10)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Right,11)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Up,12)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Down,13)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Subtract,14)
AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Add,15)
AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Subtract,16)
AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Add,17)

HideWindow(0,0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Quit = 1
     
    Case #PB_Event_Menu
      If EventMenu() > 9
        For index = 1 To items
          If Images()\img = index*100
            nimg = index*100
            CopyImage(index,nimg)
            Break
          EndIf
        Next
      EndIf
      Select EventMenu()       
      Case 0                        ;New page
        For i = 1 To 10
          If IsImage(i)
            FreeImage(i)
          EndIf
        Next
        ClearList(Images())
        StartDrawing(CanvasOutput(0))
          Box(0,0,GadgetWidth(0),GadgetHeight(0),$FFFFFF)
        StopDrawing()
       
      Case 1                       ;Add items
        File$ = OpenFileRequester("SELECT IMAGE","","All supported formats|*.*;*.bmp; *.jpg; *.jpeg; *.png;*.tif;*.tiff;*.tga|TGA image (*.tga)|*.tga|TIF image (*.tif)|*.tif|TIFF image (*.tiff)|*.tiff|PNG image (*.png)|*.png|BMP image (*.bmp)|*.bmp|JPEG image (*.jpg;*.jpeg)|*.jpg;*.jpeg",0)
        If FileSize(file$) > 0          
          result = LoadImage(items, file$)
          If result
            cimg = items*100            
            ResizeImage(items,595,595*ImageHeight(items)/ImageWidth(items))
            CopyImage(items,cimg)
            AddImage(10,itemy,cimg)
            itemy + 40
            DrawCanvas()               
            items + 1
          Else
            MessageRequester("Error","Format not supported !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
          EndIf
        Else
          MessageRequester("Error","No File loaded !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
        EndIf
       
      Case 2                   ;Bring item 2 top
        If ListSize(Images()) > 0
          Bring2Top(0)
        EndIf
   
      Case 3
        If ListSize(Images()) > 0
          DelImage()
        EndIf 
       
      Case 4                    ;Save page
        If ListSize(Images()) > 0
          sFile$ = SaveFileRequester("Please choose file to save",""," All supported formats|*.bmp; *.jpg; *.png | BMP image (*.bmp)| *.bmp| JPEG image (*.jpg;*.jpeg)|*.jpg| PNG image (*.png)| *.png",0)
          If sFile$
            saveCB()
            If GetExtensionPart(sFile$) = ""
              If SelectedFilePattern() = 1
                sFile$ + ".bmp"
              ElseIf SelectedFilePattern() = 2
                sFile$ + ".jpg"
              ElseIf SelectedFilePattern() = 0 Or SelectedFilePattern() = 3
                sFile$ + ".png"
              EndIf
            EndIf               
            If GetExtensionPart(sFile$) = "bmp"
              SaveImage(20, sfile$ ,#PB_ImagePlugin_BMP)
            ElseIf GetExtensionPart(sFile$) = "jpg"
              SaveImage(20, sfile$ ,#PB_ImagePlugin_JPEG)
            ElseIf GetExtensionPart(sFile$) = "png"
              SaveImage(20, sfile$ ,#PB_ImagePlugin_PNG)
            EndIf             
            FreeImage(20)
            MessageRequester("Info","File saved successfully", #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
          Else
            MessageRequester("Error","Process failed !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
          EndIf
        EndIf
       
      Case 5    ;Print
        If ListSize(Images()) > 0
          saveCB()
          SaveImage(20, GetTemporaryDirectory()+"print.png" ,#PB_ImagePlugin_PNG)
          FreeImage(20)
          printCB(GetTemporaryDirectory()+"print.png")
          DeleteFile(GetTemporaryDirectory()+"print.png")
          MessageRequester("Info","File printed successfully", #PB_MessageRequester_Ok | #PB_MessageRequester_Info  )
        Else
          MessageRequester("Error","No Page to Print !", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
        EndIf
       
      Case 6
        Images()\x - 1
        If ListSize(Images()) > 0 And Images()\x < 0
           Images()\x + 5
        EndIf
        DrawCanvas()
         
      Case 7
        Images()\x + 1
        DrawCanvas()
                 
      Case 8
        Images()\y - 1
        If ListSize(Images()) > 0 And Images()\y < 0
          Images()\y + 5
        EndIf
        DrawCanvas()
         
      Case 9
        Images()\y + 1
        DrawCanvas()
         
      Case 10
        ResizeImage(nimg,Images()\width-1,Images()\height)
        
      Case 11
        ResizeImage(nimg,Images()\width+1,Images()\height)
        
      Case 12
        ResizeImage(nimg,Images()\width,Images()\height-1)
        
      Case 13
        ResizeImage(nimg,Images()\width,Images()\height+1)
        
      Case 14
        ResizeImage(nimg,Images()\width/1.01,Images()\height/1.01)
        
      Case 15
        ResizeImage(nimg,Images()\width*1.01,Images()\height*1.01)
        
      Case 16
        ResizeImage(nimg,Images()\width,Images()\height)
        If Images()\alphatest > 0
          Images()\alphatest - 1
        EndIf
        
      Case 17
        ResizeImage(nimg,Images()\width,Images()\height)
        If Images()\alphatest < 255
          Images()\alphatest + 1
        EndIf
                 
      EndSelect       
      If EventMenu() > 9
        images()\img = nimg
        Images()\width = ImageWidth(nimg)
        Images()\height = ImageHeight(nimg)
        DrawCanvas()
      EndIf     

    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              If HitTest(x,y)
                DrawCanvas()
              EndIf
              Drag = #True
             
            Case #PB_EventType_LeftButtonUp
              Drag = #False
             
            Case #PB_EventType_MouseMove
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              If ListSize(Images()) > 0 And Images()\x < 0
                Drag = #False
                Images()\x + 5
              ElseIf ListSize(Images()) > 0 And Images()\y < 0
                Drag = #False
                Images()\y + 5
              EndIf
              If Drag = #True
                If isCurrentItem
                  x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                  y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                  If LastElement(Images())
                    Images()\x = x - currentItemXOffset
                    Images()\y = y - currentItemYOffset
                    DrawCanvas()
                  EndIf
                EndIf
              EndIf
             
            Case #PB_EventType_MouseWheel
              Value.f = GetGadgetAttribute(0,#PB_Canvas_WheelDelta )
              For index = 1 To items
                If Images()\img = index*100
                  nimg = index*100
                  CopyImage(index,nimg)
                  Break
                EndIf
              Next
              If value > 0
                ResizeImage(nimg,Images()\width/1.05,Images()\height/1.05)
              Else
                ResizeImage(nimg,Images()\width*1.05,Images()\height*1.05)
              EndIf
              images()\img = nimg
              Images()\width = ImageWidth(nimg)
              Images()\height = ImageHeight(nimg)               
              DrawCanvas()             
          EndSelect
        EndSelect
      EndSelect
 
Until Quit = 1
EndIf

DataSection
new:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$4E527406000000AF
   Data.q $37FF00FF00FF0053,$70090000007D1B58,$00120B0000735948,$FC7EDDD201120B00,$5441444953040000
   Data.q $655B4C5F558DDA78,$71696636404CBF14,$2052F6EFDED2F7B4,$47B2F65F37B25933,$828B08159FC8204D
   Data.q $336C267F296D1BFC,$C4D4D907519C514E,$0C1F4DD4C9FE64C5,$B68DF38C1EC3E6C9,$5650958560D850B7
   Data.q $DC1D018302A2B610,$EE00B8183BBE78EF,$5F9DFBE77CE6E4E6,$E44F76C1CAFF3DCF,$3D420EA702D8FC16
   Data.q $C3CDB8D11E0A8261,$9C0D62E0070B616D,$82C79635D60D083C,$E89FFE0215E23447,$4E02995008703697
   Data.q $11A23C126F767333,$15CE889DB08010AF,$80CE6825B8327940,$0CBFA270251A0906,$C466123408382B2E
   Data.q $E1135BC10C20042B,$D408B816735AFE05,$1B168452A04B5048,$F0B3270F484031DC,$B08A117515D96B48
   Data.q $ABA89D6B89BA14CA,$6F08A71630F7CA1D,$E3A1139C3217C065,$EBEE0E1869D09825,$25CF80C8E87EFCE0
   Data.q $0BA265368C21B568,$CF1D45AC220DC745,$1375C2B4DFE0C602,$5006048038802EC0,$E214F10A04C86135
   Data.q $2268242A569BAF16,$2758191A47425EB4,$8D0C83547D96BAFA,$0728052FA15B5422,$4D222D6E537B1C2B
   Data.q $85FDC9FD3FE33557,$7454331A05B725E6,$5159044D11AB58BC,$B5A161C040D0E99D,$E15D1CABA06E30D9
   Data.q $AE89F1D99D04CAA8,$29ED6C5BCEA8B172,$ADAB32E089D5CE32,$82B6E02DCBA23407,$30106DC70887045B
   Data.q $94A11B628B5B8D02,$053C41BCF6A40D9B,$FB5E833B058D68A6,$EE1963965DEB5B94,$617180D99496A8E9
   Data.q $DE341B9A67DB30D4,$190FCF337F4496FD,$4B548D0FB4307F51,$777375E7AEB8E2D9,$730E67A82E522991
   Data.q $44835912E049D75A,$750A4AFE140D5593,$8C86FB1B64FC4C66,$B217C318F6FFEA74,$BF53990BD1E56743
   Data.q $0F7472DCAB50585A,$B37F3B5E4C472912,$04D5027F6F5B9D2C,$7539D3012C69933E,$FDA5C8E5E2783ACD
   Data.q $118BF3EF4309767F,$7F0F21D23CA748DD,$EAA34FC3A820F990,$97F797278B59D0AE,$1B702C57DE12FEF2
   Data.q $803A9B6A8168D963,$925FA3ACBB26E239,$96D43267E26D9B60,$FF1E5C70389D3CBA,$3CFFBE5AC8EFD6DE
   Data.q $5FD142BEF5842D12,$AB74DD9F798A546A,$3D69386D6C9690E9,$466E22F7274C98F6,$38BFBFA39287CC31
   Data.q $206E617F6E1FAFDB,$7530D87E6E86FA71,$AFEC40439EC6A0D5,$4A526EC516E5BDDD,$FCBD68F95C4F7C78
   Data.q $E76963F4231C332E,$DCA86AACA8ECB17A,$AD38A579F37BC53E,$D0A55643537B22B7,$C5F6051F909E997A
   Data.q $6EACEF59ADB11316,$E258D45D1D13CEF4,$B3129412A81F5F8C,$233FF2B3A4692727,$796A95927512DD42
   Data.q $A8B837E07F8521CC,$50212EC9F88E9A26,$52BC457DD2F27A25,$3E6F4617520AF82A,$887522DD0E6CB43D
   Data.q $E7FAEF677B34BB61,$6F7A6387F4C269C4,$FE4D4BFA37CDE89E,$EF4B91F12BF752A3,$8B9046B6A846BD3D
   Data.q $A5C5E78B231EE8E2,$E6D3C1691FE8A4C9,$F7CB8C37D30B6FDB,$7F78D7DECDDA8692,$E6EF82927258CF19
   Data.q $CE32455718D8BD6E,$88EA6692EC038AB4,$F3E5F78F3BBD2F37,$88E574D1CF733CDE,$ABF7422528B32FE0
   Data.q $AA5AAD3BB9D3C1F1,$A5BB18E1A18A5AAD,$612DEF195F4B4E87,$393CD3D8A32D878D,$E77BBF77A9857DBB
   Data.q $6F86E28058FF9619,$4ECB8BD4DCE2A03D,$267BD8ED78265032,$F7A842C56748F4AC,$063D36871E45FED9
   Data.q $FA7B8C3C3F513F57,$7CBF1A1F360C8B91,$015FFE1DBC2A6966,$00F9435167817027,$AE444E4549000000
   Data.q $826042
newend:

add:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$59487009000000F4
   Data.q $0B0000120B000073,$0000FC7EDDD20112,$DA78544144497509,$3E15D754546B57C5,$D368AED559A131A2
   Data.q $F2E595DAD58356D8,$18C51150145151AD,$7E6365C566351A8D,$B8403EB5B4AA6974,$E031E51101AF0E22
   Data.q $3DE60186054513E0,$3C30CC2A2BE20303,$DA26318AB1405404,$19DCE7DD7E07D6A5,$EF8FC9FCAE8DA634
   Data.q $7B7CEFECF73DC79E,$09CFD80065F6739F,$DB9C66CFE9F3A4F6,$C6B2B0EF378B9516,$62F2AC9BC5C4ECEB
   Data.q $47FB525DC9713B07,$26D678EF510DC971,$7EB55F1CF9EFA71C,$21D71A0DD37B4A2D,$C9DFEB85D6C9D9C6
   Data.q $D53DED90FFB9DC0A,$3B1736C3391CD6CC,$B0722E6D9AB69858,$597968257CB922F0,$7F811859AB8BC2CD
   Data.q $4336F6A08AE7C1CB,$B8C4AB6984268B0D,$C20B8A8CB15F63D0,$AD4B4A655CD5D336,$8216F163AD649818
   Data.q $71F032F9502596B9,$AC58B9338CBCB19E,$2573489952C586B1,$2B3364E7BA371F50,$58D256D4B1656AA8
   Data.q $FF2CDB70C621C4A9,$EA48B3D5B24B2B7C,$60DA51DC8ED4B44C,$EB2A5AC631ECC9A7,$1117CA2B54CE3D44
   Data.q $F1A2E1C8DB5746E7,$AE609ECEB5BC7B2E,$AD3DAF34EDCAD3B7,$84892B27734EC1BC,$ACDB0AD685A4E254
   Data.q $BABF8134B6705884,$8350C283312F69B2,$A1925CB30CAD5358,$13AA6319EDB17867,$5422A86B11393788
   Data.q $96C4E0C620766943,$9486C95AB933EA12,$ACDB718AE1F3A968,$249BC7DDAA5C1E98,$2EF5A20F240DA3AD
   Data.q $B58245A48035B76C,$E7F53D2BAA0E4A1E,$724BCB189D7F44FB,$045AD850CDAD6227,$12266D2A482DADA2
   Data.q $936577636E6E6235,$63D1159B6E0B8F3F,$CA59B27BDB035967,$0446D835E3256AAF,$049C7100B900C912
   Data.q $BC226E42658C4A4D,$E9F9238F705D7DE4,$271D8ABF1D24469B,$0837DE8976C621AE,$1D50ADD505DCF955
   Data.q $A101325D1857F26F,$5F94A378E323F900,$2EBA81381850132D,$A9A265403211B2A3,$E7DE5A42F3C6890A
   Data.q $B450C8DB9334A021,$4C0F97097CE615B5,$434FF69A004E5B47,$30B46D4CC22A617E,$7FA340885AAA0A27
   Data.q $0110AF391596A98C,$4946F2D49B10C47A,$60502E8C0508F243,$E206409D5679158A,$FB16C0EB2A880D2C
   Data.q $E1D42320AB6F24D7,$AA223730A1AA98AA,$6812078DF6DA16FC,$5DCD9C312424EF9B,$146A81136F9BBF8E
   Data.q $96808BA0524C8112,$2E24AC463AE6091E,$A04DC7F93D5A36CF,$2326D48C1E3ABDCE,$CBB14A9B6452C659
   Data.q $FA9C648BE6D11A74,$500B963178112ECD,$57DC5ADE64E3B594,$83F666EE183205F5,$D79A76A68D87134E
   Data.q $E02E73C541770D09,$80AC85464D89E22C,$5CC92380467C6020,$6E133A190D76C90D,$93385ECEC1E007AB
   Data.q $34B0A1B7651102BB,$1A578F271A0E1293,$DE2C9C5BF2A621CF,$2B636495E433A402,$DD534C2C5E7F4C57
   Data.q $8784B7C1FC027DF6,$15F43B1EA0630FC0,$B12E655D87BF2B08,$542BF997B8676C2A,$2DA2395D14825E1D
   Data.q $1AB182439F36482D,$5401FCA9B1D7AD9B,$EADB912417E432A6,$BE4B6D1C40EF6D11,$AB7FC1A2A3236E38
   Data.q $F805645A3AD33CFE,$8082767129914649,$7B2489EFDC05DE51,$D4A89CD87606ED84,$F547FC2F6641E384
   Data.q $0E2DDB32098BB026,$697A4786216EDB84,$C7CE2EEC449AB41B,$A3389910445DDB3A,$0BBDD6BC6E16C913
   Data.q $5F34AFE6D95D905A,$18E40543F6BBF8A6,$E27CF60AD6B420A0,$0E52FB1E4E1B5B18,$533A37A661F5922A
   Data.q $8B18E41BFD5770BD,$58D07157AC975EC4,$E45104B43F9D4828,$4EE372B449EECF32,$2EE015C031C9D56C
   Data.q $620A026FFE6EBA30,$EF57CC4F8CDB4C9B,$9A78DE69478059CC,$649E1BAAA9FAAF2E,$F465EE17BA674774
   Data.q $7B8CC1950B5EB641,$7738DEE98264B7AA,$571CD06F598463E8,$073A51020A756290,$BFEBD86E10371C8A
   Data.q $9E7CE5563B0470EC,$1C1AC40E7C817700,$550D9D2EC65DB588,$C32A401EF4E3D134,$37048CFE320F5513
   Data.q $F6DA2C6FB2B955C6,$AC9AF998796E178F,$FD7482103FEA0ED4,$B48D0C9226F05229,$741B1F7350C2AF55
   Data.q $7F22B65F2A89FF4A,$E50DBE0189E02735,$C78AC6C69FD04818,$B52C646900563548,$2F2A9D12FD67EE1B
   Data.q $A139D45DD2227742,$CCA3C70C62DE5947,$2383DFFB5BD105D7,$D1E3605FCC8E0FC7,$1B3F26B1314E7C48
   Data.q $4D8DFE6A9856B5EB,$C367F67703FEED96,$417205C0AF3D86D3,$65245D3D0A2AD8AB,$3D558F187F447157
   Data.q $CCE87FFF2B3CCAC5,$D5C81BDA41E3E390,$7CE4045EF342C2AE,$066723308207A98A,$8CFF7BD98999ECA6
   Data.q $06D793CB22117B14,$02F81D9C99F74EE6,$06F0C41DE9107E01,$5629EB493C489A6C,$A489D97012F69024
   Data.q $FBC72CE5A6056F32,$7646630753F07E99,$0077602267AA6630,$521F9544C24E6526,$3BCD285F5342A54E
   Data.q $CBF21057417640B4,$BA2382DCD2250288,$045E530D5DCF1C1C,$640A13BE7491F98C,$1798C136E423F298
   Data.q $9022C7CC2C414B0E,$886297074104B39D,$752B30A3D55317CA,$DE13FE8E19CF8626,$64DF793023D5B0C5
   Data.q $02F92CAC27F5D90C,$DDA365A8D22D9A91,$031C9541409BA127,$C9B1DB4A2B8F7431,$E97360DFA5E1177E
   Data.q $B0237D9445EA712D,$A280EB6611C7DDD9,$3738232E59D631FC,$17DFB01063E9BE0A,$BC52E651605FAD4B
   Data.q $1F3E0C7E250FBBD5,$7C148462C37CC20C,$D7C13E3093D5F784,$A780B84960F3F33E,$6C75C5083B808252
   Data.q $D2918714EFD9D171,$BA46F1EA7826D10D,$4EBAEDA14E18E911,$0EA010427B198B9B,$D9825F19085A7040
   Data.q $75837BAFD7A0E79B,$16A91F0834141863,$C3F2EEF862F66162,$5D0DB155117343EC,$3CAE3A141768B204
   Data.q $EAC137EB8BD49097,$2721CC75F2AC344E,$5874969C4E412E20,$F274E0F02064D6AD,$7E9F448C85861079
   Data.q $EEEB742F6FABD17D,$77EDE06F9BFAF025,$08A298E1C0B0C6DE,$18FDC82C03E6B044,$43EC4D2139E22D22
   Data.q $3BF8C94B1FDACA99,$44DE2B0BA18F5E0E,$62DFA5691DA584F7,$520807285307368D,$8E764281B8C06107
   Data.q $ED5D5E1EAF7AB46E,$CC40E8D4C3F48677,$3CB03F54DF0B9C2A,$943EA527211A5277,$5408E51213144A38
   Data.q $BAC655D4293A89D6,$AD273866DA5C64EB,$95A44A6BD6962E2F,$BFE042FB69F689B9,$B9C0C70D5743103B
   Data.q $BF7A7A3078383183,$05DDE378FB7B0C26,$7E2E30E3D5E8C07F,$30C60D887C8E4202,$BD4FDFE5A5978159
   Data.q $858972DDB90E446B,$763642D0F82C8CE9,$542933FB2CB628FB,$F558C7F2CE4C4FF7,$F3E4F9827D322C04
   Data.q $DD9BBF020B7AFDDE,$1E70A730F3C5211F,$5A4BC3C2C68CA786,$7E15EEFB3B264D0D,$9E1586547D3DC24C
   Data.q $8168599B8AA2EF17,$0EC506C45C1D059E,$5357B55524B15260,$A1F07D13EFC0CE10,$A186D3A1B8088166
   Data.q $C58CBFA8C5BF7BDF,$95218F508C3CCD1C,$B6C22950BAAFE3A6,$F74AF53CCD7ED5E5,$4BA9D8BFD37956EF
   Data.q $5BCF2D91BEB199B7,$FD1C9F668F2586C5,$33F4DACF6BB767CC,$93D5E302B85E5819,$61A62AA62A752931
   Data.q $C4622729C600544A,$E5374E9ACFF0B1CE,$4ED27CF36B47B5B6,$8F37CF539FD4FC67,$3E7FB39B3559D658
   Data.q $F409CBF323F949F3,$48B70B22902BAFC9,$C5CCE767DA2612E3,$E8F2A5A598B982EC,$3290FFF4DFFB215C
   Data.q $71584A1A8A7DAACF,$A7CEDABFA4FD8E83,$4D6CED3BF6F55D9D,$D94D943C921B2849,$74FC8C4C51E6C813
   Data.q $8F2A8A53395A0B0C,$62A6D29318B6ADA6,$4C7B7A8D741371BD,$9836CA1752FB1C45,$975FF626F37AD8C3
   Data.q $0079DA57ADBE6D33,$AE444E4549000000,$826042
addend:

b2t:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1E0000001E000000,$3952B40000000208,$4E527406000000F5
   Data.q $C240004400440053,$7009000000949D9A,$00120B0000735948,$FC7EDDD201120B00,$544144498D020000
   Data.q $11A071717063DA78,$435DA3249A351862,$282831892AB24212,$FDE3031DA3348F25,$BF5EEDEDD73AEA32
   Data.q $340E9BBD4562480F,$807248531AEEDD2E,$F2FFFFFF5EB41684,$C9ECA0207117FFFF,$3A3649F3229DFF9F
   Data.q $BEC77FF7C4FDA8BC,$F2745637F9F239FC,$91473B3EAF3DFFC7,$D5C95346311B7463,$8FFFEF89D1017E9F
   Data.q $491D5D406403FD7D,$D7E9FC3AFD3FABB9,$E271F87D0FFFDFE9,$900E12FEDFE3FFC7,$A0BB2A8CF0F6EA82
   Data.q $CB0E72206CD0A70C,$35E7078A02C90C76,$FFC2F7360D1B849D,$C8CC0AB4BE1EDBFF,$7FB3FFFFE97598EA
   Data.q $BA6BAC284979EFFE,$E7E3C1EAF67E3CE7,$3831753B1F640410,$81A3103F97E8E9B7,$67FDCB7FF7FF9EE6
   Data.q $81D6B9E10E65F16E,$FF642980735DD919,$35FCF27AC2046FDB,$F2422F67B3C151FF,$F3FD3E8C4286809A
   Data.q $673303AD8F3BC6DF,$23DCD171385D3FEF,$0267DA32FAAAE317,$FF7467C02E8974AD,$9000C0FEE34095EC
   Data.q $5730D19023DEF77D,$33BBC5C577F9FA9F,$ED427FFFF3BE9DF6,$DBEFFDFEE7D1A004,$7D1A948FF3D7607C
   Data.q $A2038D003D2823F8,$86029EF6D389BAC4,$2042FC68C0FF95FB,$7041E77DBE8D3040,$02EBA301CB30335E
   Data.q $694FFFFFB7B9010C,$FFFF5BE5F8FF3A9A,$231C54981FFFFB5F,$2F7FBFDFFA3048F2,$BB9D2C2E8A76BE5E
   Data.q $AA9B45EAE6F166AE,$D36FADB6586A6E17,$17D564070F3BC9C1,$5B09E1C7693C5C4E,$469FE963D9ADB70F
   Data.q $AE7E3A1F8710D182,$68818B69BEBCC27D,$C5107DB545A58CC2,$16C4F15EE6F11EC6,$34B40306FF4668AA
   Data.q $EF73628833D1EF73,$EDC3574C6BCA1244,$8F6763FEDAF17D38,$628816C57734BE9E,$F7FBFE8D4A549F33
   Data.q $24E77A1BBF5FAFEF,$36E4C4F75766B715,$D1BA327412247B1A,$7FBFDFF57760E613,$2A725DFAF17201E0
   Data.q $2E0427FF56F389B0,$651951D1B247B8DD,$9A4B934D45CDF971,$0A62534DC542E0A7,$37DB21383A3648DA
   Data.q $068D24321DB4733A,$39A36491BF184800,$4E45490000000073,$826042AE44
b2tend:

del:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1700000018000000,$18439E0000000208,$4E5274060000007A
   Data.q $07F700F700F70053,$70090000003689E0,$00120B0000735948,$FC7EDDD201120B00,$544144491D050000
   Data.q $77134C0B9485DA78,$5ED2C52D77FFC71C,$5296D7B6BD1C7D7B,$595F0D8F9AF82D0A,$E6D9817B0973265C
   Data.q $3E731CCBA9BA1842,$4E1C437515F36E70,$730A0555B2882B04,$2DB0F2832A09CE9A,$44452280F42C5B48
   Data.q $E889334471985528,$6F97730C19D16BBA,$FFEFDF3FFFFBBF2E,$AEC9FDC0FFFBBB9F,$B4A1AC543709E581
   Data.q $770DA723D975B765,$E6B4339F99FD94CF,$49A5F137AE68FE83,$8DED7361E799E02D,$EE670E6F2983F9C4
   Data.q $77A57D2FB5F5DA18,$69B5CDD25A60D245,$6FA777B1FC6476B7,$67957C736BDF7265,$2699E45C5834179E
   Data.q $7B8FBAC0E1F67EF1,$76289EA2D1EA9E5F,$DB156E90A8F10AB7,$9A7C0F53CCF6E6A3,$8189D36BEAC3737A
   Data.q $EE2E7EF907935983,$0E85E579E71460D2,$9DE1253B471DB422,$62A9AEF1D3ABF0EA,$11ADDC74D77134F7
   Data.q $481DA05D5CA7C874,$7FEDD7EF0DA5D95F,$7A88D485B5B86836,$B045DC8663B57EDE,$B77953ADF5945F3A
   Data.q $C98B136CAA5D5CC7,$970211B58B190118,$6325129770E3231A,$B7F8ABB696CB3D45,$D897BE750427AB6A
   Data.q $D9CA70A19B6E2B16,$F7FAF3F59ED159CE,$37817E4792AC466A,$B3D4085B0A17614F,$DAF246752B9AE942
   Data.q $93158D6D123398B4,$F20D3FE613DA2233,$398343A670D954D5,$6E1D45BF24475C94,$D89626DC799BF397
   Data.q $3882DE43F7E2487B,$215DBD243DED5687,$C512D204EDF0626F,$E8C36E0D0EB82873,$ABE9DC838F25E503
   Data.q $E08E682916C8511A,$1ED408E6D02928D9,$FAD0BE78E12CBFCD,$E22CFB110F878CFD,$A97CF594977798B2
   Data.q $929B518936562E76,$B7FDF234F89A5947,$A16334CC17D9071E,$51CAB5CE459E08D6,$5D9C66A0556B8C8B
   Data.q $C162BEE5E2D88617,$1CC2D6806AB01FF5,$25BD1B0FEFDC22FB,$E0AAC4522DC28C68,$68207958A6B0F199
   Data.q $58513A886AB16AC8,$4550E25297ADC13D,$4AD727259D65889D,$EB1D9994D6CC15C8,$FD8E46F76CD5C8A3
   Data.q $A236B87C94F06275,$097AC80597AFCD86,$BBA0B5F57D408972,$66185DFD089CFCAC,$6B7384D73126A092
   Data.q $F48B73A40C0BDCA4,$73F7EA08E8E8DFE1,$06BFB4FDFA45F5EE,$DF44E697F8F70789,$DB2E2AF1E2595369
   Data.q $70C22CE4706B4524,$2649D97977038FEB,$E39E85669D0C24F3,$92A4125558C79D87,$74A53FEB08FD6AC1
   Data.q $3D5135B8DC474BA5,$0A423B44B8D7877A,$59B0D146E479422A,$3A528C234E73A46E,$59F4027E3C8007AC
   Data.q $418FC0045A2825CC,$8D037429D2E1871D,$4E5C4D57DC28BD5E,$47CAEF2C2971DE95,$6249A86C249659BA
   Data.q $BCF18C30A6196108,$6F5007A2DC68209F,$23989A0DB2F0298D,$55C60051F0411400,$A920DBD31149C000
   Data.q $CB9717655A0CE24A,$856F786A4D684DFA,$2C7000A0C7C00F34,$3C102138010A8160,$3F28F25252176AFE
   Data.q $0E04744F8571530C,$63DF837B9D93AFE9,$734245ED12A55654,$1A48A1C888BDB086,$800439650C028428
   Data.q $F9E2E8FF93C96131,$4BDC105410176A5C,$AD7680838102953E,$AEA25ED844FEAB02,$D1745BC6C8E5175B
   Data.q $6016966A01D8EDD6,$D7A9C0041F0C1802,$114C5E2CBF223D3F,$0C3E528003A410F9,$E31B18A396C803F6
   Data.q $1B1C2FB83D603D8F,$4E4152E331F91F45,$8E2F96A61070F670,$1CB66D7AD6709B8B,$845A882172829326
   Data.q $A2161B60275AA822,$94E0AA42C31C0586,$71D9A842437273C4,$755DC821B3861720,$0277EBD76236D9F1
   Data.q $DD4594107D8017B0,$1C6A0ACA899EF583,$1BC9BED643400ED8,$56FA746DC2D1E35B,$086EF0C376D303CA
   Data.q $C6A6082ED04F0DDA,$CCCCA6000DF001B7,$D981FD43775AB5E7,$06B7A41CD80033B3,$29B50B6460513D04
   Data.q $3D9E9FFC68C38C4D,$EE77377D65F7197E,$CF5ABFC000D90426,$F6969F7C46566C60,$0DCCDB352F5FD9DB
   Data.q $FFDDBB715CAE570D,$6DEF5D74EADAD419,$6D3607A5A5E55D24,$8CC4C4D6CEFC95DC,$DBEAFAACD7CFE4E4
   Data.q $82FEF6765D3A993D,$2B2B2BCBCACB87C3,$FF5CA4E9D3B366CD,$E3C39AE33BA96D00,$4E454900000000F7
   Data.q $826042AE44
delend:

save:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$3D77E00000000608,$59487009000000F8
   Data.q $0E0000C40E000073,$00001B0E2B9501C4,$894854414449F902,$C610471C6BCB95B5,$1B4965E8ED6DAD7F
   Data.q $E49B18BA41099156,$92164E8086419014,$E44FF2053E8F83AD,$261E4C7FD5F18212,$9318395B025AD10E
   Data.q $1A3E0921F0407944,$CF479D9E9DD932C7,$2419DD9A30FB774C,$EA9A87307C86CCAD,$9CE12EEAEBEAAFAE
   Data.q $0EFBC2100484FFE3,$1D3FEFBFCFE59BD2,$F7E6AAD75BA5D82B,$6F4849CC4291DCD0,$9CF5FE7F13FA793E
   Data.q $D440F69C8DB93F4F,$FDC4A94016118B37,$FBB9DFB7F5F90F07,$0130919D203767C5,$007074784F070FC0
   Data.q $F000556347E6EAC0,$6972E2F170DF57E5,$F12E57CB9D32CACE,$FB7B7BC5B567B3C7,$C8310844113EA9A4
   Data.q $167EBEBEB36EDDBA,$324E43400B04B4DF,$C7D79B9BBCD468D1,$BBBBBCA39484A42D,$AD5A2A82B27D68BB
   Data.q $90C5B9671B1B1B16,$F6F6ECB7ADAC59C0,$4C7689071A29B9F6,$091C5ABAD66C8579,$36D7124939679185
   Data.q $30491924921D3A77,$F2998FB5DACF3737,$19ECAE8C4924009A,$9B6A8C3F4A75A054,$D3A0DCC9CEB6B6B7
   Data.q $5144461FB8C9571C,$357DF424131DC08D,$CB23A9D00E12DB32,$BEFA2F786262000C,$145D1412A85F9C22
   Data.q $008115BFEA9E9A27,$F4552CB1CCC13C66,$1241593820859F54,$379388022FDF28C7,$556C309F7CA16DF5
   Data.q $62C502A35AC40A09,$04502A00E0EC757B,$F4D69944818950C1,$C345112F053FF083,$8EB939A694481966
   Data.q $166346B97D181C81,$3FB8E58B53694FAD,$BF87870019738900,$985AB5D5EAE39CE0,$49E754B5AC1D9D9D
   Data.q $1BAE1D9C7201D3A7,$FC7E3C26EEBC54F9,$F31AE1FCB8492488,$B16B5879E79F4333,$0C6A7318C18C62D6
   Data.q $04C20BF68A39A709,$130454A3EFBE14A5,$C25A5A582985C305,$B2C9CF3C86318739,$F1FE7E10E2822CEC
   Data.q $86A11E9B34907290,$A52847474715AF57,$160A2F3880DFE7F8,$D3CC832B2B2B26ED,$BDFDFD8060491D34
   Data.q $21BAF44B5B17D787,$DBA42F6E823F4108,$7AC611F9418C62ED,$529224D64ECE2C00,$D277C9ED7C296D62
   Data.q $BAFE21B71084E739,$9643BE68D1B97DD7,$F9565707C34DCC66,$D2EF5A16003DCEFC,$BC5E5A526FD31468
   Data.q $CF5F5721C5738978,$83EC81D8C15FDEF7,$0040B7C0CB00682E,$10110317C6364024,$084CDB28B2C0BB02
   Data.q $4C00B81160598121,$4C98EE1F3F74DA72,$AC277D759B37DD01,$4900000000A11A95,$826042AE444E45
saveend:

print:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1000000010000000,$FFF31F0000000608,$4D41670400000061
   Data.q $8A0537C8AF000041,$58457419000000E9,$72617774666F5374,$2065626F64410065,$6165526567616D49
   Data.q $00003C65C9717964,$CB38544144496D02,$C71861534BDF938D,$FFC46F3877F85DCF,$8281AD2AD9984820
   Data.q $78818DE587610BCC,$BA182AD81B06C1A1,$1685A14BD4B1B041,$0FD9DCAC8640B441,$AB4B5886D5BA2275
   Data.q $B779DB9B3CE5CB39,$3307335BCF7B7DB3,$3E7DF3EF38B9F03A,$CEAE001C385E79E7,$4F88A9ADFD3BF355
   Data.q $4A47B5A051A91D3B,$BB582DAF52D5E9DA,$7869D6CF9E704F7C,$FC25891F2848F1B9,$4A24737FE6C8482C
   Data.q $F0C3ED5F9845A448,$174BEBEEE578A778,$C129C9E2A16D7A0A,$C133E441529917C6,$5A46C552A904AECA
   Data.q $4FFD1B50FB3783C6,$B0452542D8F4142F,$95EDAC655F9B0549,$4CA0161D48247C21,$A54ACB6E8A7C7876
   Data.q $16C7A5B2727260A9,$762D7E8C4102B924,$A70FBE194533FD50,$DDAED5D1C8F3C6F0,$A020D2DF5EBD100F
   Data.q $A98E165E9E4A06CD,$A6D82A7BC3507120,$53BCB1AD855EE8A2,$0E0C055BAE32B5A4,$404C0DFBFBFBE60E
   Data.q $468D11676767BB1B,$3324152C8C2A7B71,$D16C556FB1282435,$4B255D008A74C255,$30040811861F3705
   Data.q $08ADD3468D0E3E3E,$D9B303264C83E9B6,$3030104159285FFC,$50CB2C8808ABB030,$24FF8A28875F5F58
   Data.q $AB1B1B1F9EA10A14,$E2C61084058B1671,$43351314A95222E2,$9E79E59FCFCFCDA9,$1824489099326707
   Data.q $BF7E1264C91BB76E,$E59C70E1C64A29BF,$C04C4C4DC13B3B3B,$F1E23B76EC31F3E7,$C58B129A96969638
   Data.q $EDEDEDF2CF5AB560,$970CBD7AF01EE8E0,$88D1A30C277A05CB,$1F5F5F663651D1D1,$59D9AB56A0BABABA
   Data.q $64646E06D6D6DF3D,$B8D281D878F1EAA4,$F29B06DF9625FCF0,$76583A3A3A05E16C,$0CE0ADADAD0E6E6E
   Data.q $4EB6D0D0D0CCC306,$382258A30AEF03A7,$4849CC3941F8213A,$8CA7C05EFBD84B67,$A5430CEF0654A288
   Data.q $BFC353145BCD2952,$186B27E1D522BBC0,$D4A195630EE5FF76,$BB17E7BE7AA46778,$008D5BFEACC80412
   Data.q $AE444E4549000000,$826042
printend:
EndDataSection
Edit : Code modified
1- Added transparency effect as per infratec suggestion
2- Fixed some bugs as per davido and Mindphazer remarks
Edit 2 :Bug fixed
Last edited by RASHAD on Sun Mar 08, 2020 6:28 pm, edited 6 times in total.
Egypt my love
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 341
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: Merge & Position any no. of Images

Post by Mindphazer »

Hi Rashad
Works fine now :
Image

Thanks a lot !
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
infratec
Always Here
Always Here
Posts: 6871
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Merge & Position any no. of Images

Post by infratec »

To keep the transparency effect:

Code: Select all

AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Subtract,16)
AddKeyboardShortcut(0,#PB_Shortcut_Alt|#PB_Shortcut_Add,17)

Code: Select all

Case 16
  If Images()\alphatest > 0
    Images()\alphatest - 1
  EndIf
Case 17
  If Images()\alphatest < 255
    Images()\alphatest + 1 
  EndIf
And the other changes from above.
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Merge & Position any no. of Images

Post by davido »

@RASHAD,
It is possible to move images past the window edges. If they are released they cannot be retrieved.
Could you introduce code to prevent images being moved out of bounds?

Looks very nice so far.
DE AA EB
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: Merge & Position any no. of Images

Post by RASHAD »

Hi Bernd
I am a little confused about transparency, everything is fine here without any additions PB 5.71 x86 Windows 10 x64
If you have any evidence ,Please explain more thoroughly
Thanks mate

Hi davido
If you maximized the window and played with Bring2Top
Do the missed image still disappeared?
If so then I will add some code to solve the problem
Please check and report
Thanks mate
Egypt my love
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Merge & Position any no. of Images

Post by davido »

Hi RASHAD,
My previous post was on a Windows 10 machine.

The following was done on a MacBook Pro.

1. The Buttons which were a problem, are still a problem on the MacBook - just like the image on Mindphazer's post.
2. The buttons still work - trial and error! So I could load pictures.
2a. The pictures can be lost in all four directions.
2b. You are right they can be seen on the maximised screen - nice one.
2c. Sorry to be a 'vandal', but the pictures can be lost on the maximised window.
2d. If they are lost on the left or top sides they can be retrieved by using the mouse wheel to zoom them. No such luck on the right and bottom sides.

My personal view is that pictures should be bound by the current window internal edges; Or give users the choice.
DE AA EB
infratec
Always Here
Always Here
Posts: 6871
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Merge & Position any no. of Images

Post by infratec »

With these modifications:

Image
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5353
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Merge & Position any no. of Images

Post by Kwai chang caine »

Very nice :D thanks a lot RASHAD for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply