Canvas Gadget Resize mit Image ?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Canvas Gadget Resize mit Image ?

Beitrag von Andreas21 »

Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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: Canvas Gadget Resize mit Image ?

Beitrag von NicTheQuick »

Nein, das ist keine API. Vermutlich musst du nur einfach mal die neuste Version installieren.
Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Canvas Gadget Resize mit Image ?

Beitrag von silbersurfer »

erstmal wieder ein Danke an Euch für die schnellen Hilfestellungen :allright:

der Link Andreas21 war genau richtig danke
Komisch nur das er noch nicht in der internen Hilfe drinne ist.

Jetzt klappt es wunderbar, und auch relative zügig danke NicTheQuick.
Allerdings ist da noch ein kleiner Wermutsropfen, beim Scrollen sieht man leichtes flackern der Ränder.

Scheint so als wird nicht sauber Aktualisiert, aber sonst läuft es jetzt schon mal schnell

Edit: So habe jetzt noch mal alles umgebaut,und auf den Rat von Bisonte bezüglich das Gadtget nicht mit zu Skalieren gehört
Nun gibt es kein Flackern und alles ist schnell Danke nochmal Jungs für eure Hilfe.....

hier nochmal der Testcode mit den Änderungen damit andere auch sehen was gemeint ist

Code: Alles auswählen

;Globale Variabeln
Global MImage=CreateImage(#PB_Any, 1024, 768,32)
Global CanvasZoom=1,Canvas,SliderH,SliderV

;zufalls Grafik erstellen 
If StartDrawing(ImageOutput(MImage))
    For t= 0 To 50
       Circle(Random(1024),Random(768), Random(30), RGB(Random(255), Random(255), Random(255)))
    Next
    StopDrawing()
EndIf

;Fenster und deren Gadgets erstellen
If OpenWindow(0, 0 , 0, 1024, 768, "Scale Image Test !",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
	Canvas=CanvasGadget(#PB_Any, 0, 0, WindowWidth(0)-24, WindowHeight(0)-24,#PB_Canvas_Border)
	SetGadgetAttribute(Canvas,#PB_Canvas_Image ,ImageID(Mimage))
	SliderH=ScrollBarGadget(#PB_Any, 0,WindowHeight(0)-22, WindowWidth(0)-24, 20, 0, ImageWidth(MImage),GadgetWidth(Canvas))
	SliderV=ScrollBarGadget(#PB_Any, WindowWidth(0)-22,0, 20,WindowHeight(0)-24, 0, ImageHeight(MImage),GadgetHeight(Canvas),#PB_ScrollBar_Vertical)
EndIf

;fügt tastaturabfrage für + und - vom Zifferblock hinzu
AddKeyboardShortcut(0,#PB_Shortcut_Add,1000)
AddKeyboardShortcut(0,#PB_Shortcut_Subtract,1001)

;Skalieren des Image und den Canvas übergeben
Procedure ScaleImage(id,factor=1)
	Protected x,y,w=ImageWidth(id),h=ImageHeight(id),datei
	SetGadgetAttribute(SliderH,#PB_ScrollBar_Maximum,ImageWidth(id)*CanvasZoom)
	SetGadgetAttribute(SliderV,#PB_ScrollBar_Maximum,ImageHeight(id)*CanvasZoom)
   x=GetGadgetState(SliderH) : y=GetGadgetState(SliderV)
	Static BackupImage
	If BackupImage<>0 
		FreeImage(BackupImage)
	EndIf 	
	BackupImage = GrabImage(id, #PB_Any, x/factor, y/factor, w/factor, h/factor)
	Datei=ResizeImage(BackupImage,w,h,#PB_Image_Raw)
	SetGadgetAttribute(Canvas,#PB_Canvas_Image ,Datei)
EndProcedure   

; Echtzeitabfrage für die ScrollbarGadgets
Procedure SliderHandler()
    Select EventGadget()
    	Case SliderH
    		;Debug GetGadgetState(SliderH) 
			ScaleImage(MImage,CanvasZoom)
    	Case SliderV
    		;Debug GetGadgetState(SliderV)
    		ScaleImage(MImage,CanvasZoom)
    EndSelect	
EndProcedure
BindGadgetEvent(SliderH, @SliderHandler())
BindGadgetEvent(SliderV, @SliderHandler())

;Hauptschleife
Repeat
  event=WaitWindowEvent()
  Select event
     Case #PB_Event_CloseWindow
        quit=1
     Case #PB_Event_Menu
        Select EventMenu()
           Case 1000 ;Plus
              CanvasZoom=CanvasZoom+1
              ScaleImage(MImage,CanvasZoom)
           Case 1001 ;Minus
              If CanvasZoom>1
                 CanvasZoom=CanvasZoom-1
                 ScaleImage(MImage,CanvasZoom)
              EndIf    
        EndSelect
  EndSelect       
Until Quit=1
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Canvas Gadget Resize mit Image ?

Beitrag von mk-soft »

ResizeImage liefert nur den Erfolg zurück. Ging somit nicht unter Mac.

Code: Alles auswählen

;Skalieren des Image und den Canvas übergeben
Procedure ScaleImage(id,factor=1)
   Protected x,y,w=ImageWidth(id),h=ImageHeight(id),datei
   SetGadgetAttribute(SliderH,#PB_ScrollBar_Maximum,ImageWidth(id)*CanvasZoom)
   SetGadgetAttribute(SliderV,#PB_ScrollBar_Maximum,ImageHeight(id)*CanvasZoom)
   x=GetGadgetState(SliderH) : y=GetGadgetState(SliderV)
   Static BackupImage
   If BackupImage<>0 
      FreeImage(BackupImage)
   EndIf    
   BackupImage = GrabImage(id, #PB_Any, x/factor, y/factor, w/factor, h/factor)
   If ResizeImage(BackupImage,w,h,#PB_Image_Raw)
     SetGadgetAttribute(Canvas,#PB_Canvas_Image ,ImageID(BackupImage))
   EndIf
   
EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Canvas Gadget Resize mit Image ?

Beitrag von silbersurfer »

ResizeImage liefert nur den Erfolg zurück. Ging somit nicht unter Mac.
Das hatte mich anfangs auch in der Hilfe irritiert, so wie du das jetzt gemacht hast mk-soft finde Ich das auch viel Logischer.
Danke für den Tipp, bin ja auch noch ein Noob in PureBasic :lol:
werde deine änderung in mein Projekt übernehmen
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten