Party Tool - Mosaik Effekt

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

Party Tool - Mosaik Effekt

Beitrag von dige »

Ein kleines Tools, dass ich eben für einen Kindergeburtstag gebraucht habe. Wir hatten viel Spaß, vielleicht kann es ja noch jemand gebrauchen..

Code: Alles auswählen

; Images advise. Who first recognizes the image?
; Dige 11/2014

OpenWindow(0, 0, 0, 100, 100, "", #PB_Window_BorderLess|#PB_Window_Maximize|#PB_Window_ScreenCentered)

Enumeration
#CG_IMAGE
#TB_SLIDER
#B_Next
#B_Prev
EndEnumeration

Enumeration
  #IMG_ORIG
  #IMG_VIEW
EndEnumeration

UseJPEGImageDecoder()
UsePNGImageDecoder()

#IMGEXT = ".JPG.JPEG.PNG.BMP"

Global NewList Images.s(), merke.s

Procedure OpenMainWindow()

  CanvasGadget(#CG_IMAGE, 0, 0, WindowWidth(0), WindowHeight(0) - 50)
  ButtonGadget(#B_Prev, 0, WindowHeight(0) - 50, 50, 50, "<")
  TrackBarGadget(#TB_SLIDER, 50, WindowHeight(0) - 50, WindowWidth(0) -100, 50, 1, 50, #TBS_FIXEDLENGTH)
  SendMessage_(GadgetID(#TB_SLIDER), #TBM_SETTHUMBLENGTH, 50, 0) 
  ButtonGadget(#B_Next, WindowWidth(0)-50, WindowHeight(0) - 50, 50, 50, ">")

EndProcedure

Procedure LoadImageList()
  Protected Directory.s
  
  Directory = PathRequester("Bilder Verzeichnis auswählen", "")
  
  If Directory = "" Or FileSize(Directory) <> -2
    ProcedureReturn
  EndIf
  
  ClearList( Images())
  If ExamineDirectory(0, Directory, "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        If FindString( #IMGEXT, UCase(GetExtensionPart(DirectoryEntryName(0))))
          AddElement(Images())
          Images() = Directory + DirectoryEntryName(0)
        EndIf
      EndIf
    Wend
    FinishDirectory(0)
  EndIf
  
  If ListSize(Images()) > 0
    FirstElement(Images())
  EndIf
EndProcedure
Procedure RenderImage()
  Protected w, h, f.f
  
  If StartDrawing(CanvasOutput(#CG_IMAGE))
      
    w = OutputWidth()
    h = OutputHeight()
      
    If IsImage(#IMG_ORIG) = 0
      If LoadImage(#IMG_ORIG, Images())
        f = ImageWidth(#IMG_ORIG) / ImageHeight(#IMG_ORIG)
        If f > 0 ; breiter als hoch -> Höhe voll, Breite anpassen
          ResizeImage(#IMG_ORIG, h*f, h, #PB_Image_Smooth)
        Else
          ResizeImage(#IMG_ORIG, w, w/f, #PB_Image_Smooth)
        EndIf
      EndIf
      Box (0, 0, w, h, #White)  
    EndIf
  
    If IsImage(#IMG_ORIG)
      CopyImage(#IMG_ORIG, #IMG_VIEW)
      
      If GetGadgetState(#TB_SLIDER) < 50
      
        ResizeImage(#IMG_VIEW, ImageWidth(#IMG_ORIG) * GetGadgetState(#TB_SLIDER)/100, ImageHeight(#IMG_ORIG)*GetGadgetState(#TB_SLIDER)/100, #PB_Image_Smooth)
        ResizeImage(#IMG_VIEW, ImageWidth(#IMG_ORIG), ImageHeight(#IMG_ORIG), #PB_Image_Raw)
      EndIf
    EndIf
    
    DrawImage(ImageID(#IMG_VIEW), w/2- ImageWidth(#IMG_VIEW)/2, h/2-ImageHeight(#IMG_VIEW)/2)
    
    StopDrawing()
    
  EndIf
  
  
  
EndProcedure


OpenMainWindow()

Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    If ListSize(Images()) <= 0
      Event = 0
      LoadImageList()
    Else 
      Select EventGadget()
        Case #B_Prev : PreviousElement(Images())
        Case #B_Next : NextElement(Images())
        Case #TB_SLIDER : RenderImage()  
      EndSelect
    EndIf
  EndIf

  If ListIndex(Images()) >= 0 And merke <> Images()
    If IsImage(#IMG_ORIG)
      FreeImage(#IMG_ORIG)
    EndIf
    If IsImage(#IMG_VIEW)
      FreeImage(#IMG_VIEW)
    EndIf
    
    merke = Images()
    SetGadgetState(#TB_SLIDER, 1)
    
    RenderImage()
  EndIf
  
Until Event = #PB_Event_CloseWindow
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Party Tool - Mosaik Effekt

Beitrag von NicTheQuick »

Ich hab einfach mal alles Windows-spezifische raus gelöscht. Aber irgendwie funktioniert's trotzdem nicht oder auch gerade deswegen. Ich bin soweit gekommen, dass oben in der linken Ecke die Bilder aus dem Verzeichnis durchzappen konnte, das ich geladen hatte. Aber weiter eben nicht.
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Party Tool - Mosaik Effekt

Beitrag von Sicro »

So funktioniert es bei mir unter Linux:

Code: Alles auswählen

; Images advise. Who first recognizes the image?
; Dige 11/2014

OpenWindow(0, 0, 0, 100, 100, "", #PB_Window_BorderLess|#PB_Window_Maximize|#PB_Window_ScreenCentered)

Enumeration
  #CG_IMAGE
  #TB_SLIDER
  #B_Next
  #B_Prev
EndEnumeration

Enumeration
  #IMG_ORIG
  #IMG_VIEW
EndEnumeration

UseJPEGImageDecoder()
UsePNGImageDecoder()

#IMGEXT = ".JPG.JPEG.PNG.BMP"

Global NewList Images.s(), merke.s

Procedure OpenMainWindow()

  CanvasGadget(#CG_IMAGE, 0, 0, WindowWidth(0), WindowHeight(0) - 50)
  ButtonGadget(#B_Prev, 0, WindowHeight(0) - 50, 50, 50, "<")
  TrackBarGadget(#TB_SLIDER, 50, WindowHeight(0) - 50, WindowWidth(0) -100, 50, 1, 50)
  ButtonGadget(#B_Next, WindowWidth(0)-50, WindowHeight(0) - 50, 50, 50, ">")

EndProcedure

Procedure LoadImageList()
  
  Protected Directory.s
 
  Directory = PathRequester("Bilder Verzeichnis auswählen", "")
 
  If Directory = "" Or FileSize(Directory) <> -2
    ProcedureReturn
  EndIf
 
  ClearList( Images())
  If ExamineDirectory(0, Directory, "*.*")
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        If FindString( #IMGEXT, UCase(GetExtensionPart(DirectoryEntryName(0))))
          AddElement(Images())
          Images() = Directory + DirectoryEntryName(0)
        EndIf
      EndIf
    Wend
    FinishDirectory(0)
  EndIf
 
  If ListSize(Images()) > 0
    FirstElement(Images())
  EndIf
  
EndProcedure

Procedure RenderImage()
  
  Protected w, h, f.f
 
  If StartDrawing(CanvasOutput(#CG_IMAGE))
     
    w = OutputWidth()
    h = OutputHeight()
     
    If IsImage(#IMG_ORIG) = 0
      If LoadImage(#IMG_ORIG, Images())
        f = ImageWidth(#IMG_ORIG) / ImageHeight(#IMG_ORIG)
        If f > 0 ; breiter als hoch -> Höhe voll, Breite anpassen
          ResizeImage(#IMG_ORIG, h*f, h, #PB_Image_Smooth)
        Else
          ResizeImage(#IMG_ORIG, w, w/f, #PB_Image_Smooth)
        EndIf
      EndIf
      Box (0, 0, w, h, RGB(255,255,255)) 
    EndIf
 
    If IsImage(#IMG_ORIG)
      CopyImage(#IMG_ORIG, #IMG_VIEW)
     
      If GetGadgetState(#TB_SLIDER) < 50
     
        ResizeImage(#IMG_VIEW, ImageWidth(#IMG_ORIG) * GetGadgetState(#TB_SLIDER)/100, ImageHeight(#IMG_ORIG)*GetGadgetState(#TB_SLIDER)/100, #PB_Image_Smooth)
        ResizeImage(#IMG_VIEW, ImageWidth(#IMG_ORIG), ImageHeight(#IMG_ORIG), #PB_Image_Raw)
      EndIf
    EndIf
   
    DrawImage(ImageID(#IMG_VIEW), w/2- ImageWidth(#IMG_VIEW)/2, h/2-ImageHeight(#IMG_VIEW)/2)
   
    StopDrawing()
   
  EndIf
  
EndProcedure

OpenMainWindow()

Repeat
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget
    If ListSize(Images()) <= 0
      Event = 0
      LoadImageList()
    Else
      Select EventGadget()
        Case #B_Prev : PreviousElement(Images())
        Case #B_Next : NextElement(Images())
        Case #TB_SLIDER : RenderImage() 
      EndSelect
    EndIf
  EndIf

  If ListIndex(Images()) >= 0 And merke <> Images()
    If IsImage(#IMG_ORIG)
      FreeImage(#IMG_ORIG)
    EndIf
    If IsImage(#IMG_VIEW)
      FreeImage(#IMG_VIEW)
    EndIf
   
    merke = Images()
    SetGadgetState(#TB_SLIDER, 1)
   
    RenderImage()
  EndIf
Until Event = #PB_Event_CloseWindow
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Party Tool - Mosaik Effekt

Beitrag von NicTheQuick »

Ach, jetzt verstehe ich. das 20x20-Pixel Bild oben links wird dann als Mosaik-Bild dargestellt. Ich dachte da kommt noch irgendwas im Fullscreen und oben links das soll nur die Auswahl sein.
Das Problem ist hier, dass beim Aufruf der Funktion "OpenMainWindow()" die Größe des Fenster laut 'WindowWidth()' und 'WindowHeight()' immer noch 100x100 ist. Und manchmal kommt auch der "OpenPathRequester()' nicht.
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Party Tool - Mosaik Effekt

Beitrag von Sicro »

NicTheQuick hat geschrieben:Ach, jetzt verstehe ich. das 20x20-Pixel Bild oben links wird dann als Mosaik-Bild dargestellt. Ich dachte da kommt noch irgendwas im Fullscreen und oben links das soll nur die Auswahl sein.
Also oben links ist bei mir nichts.
Bei mir wird das Fenster maximiert geöffnet und sieht so aus: http://s14.directupload.net/images/141115/89wtkodm.png
Schiebt man den Schieber der TrackBar nach rechts, wird die Verpixelung verringert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Party Tool - Mosaik Effekt

Beitrag von NicTheQuick »

Ja, ich weiß wie es aussehen soll. Bei mir sieht es allerdings so aus: https://dl.dropboxusercontent.com/u/283 ... Fehler.png
Könnte ein Bug von PB sein.
Bild
Antworten