Bilder verkleinern und vergroessern

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

bei mitgeschleiften Größen wäre es besser, ständig in Double zu rechnen,
aber generell wäre es besser, von Anfangsgrößen auszugehen und nur einen Faktor zu verändern.

also, einen Prozentwert mitzuschleifen, den kann man erhöhen und erniedrigen,
und bei jedem resize-vorgang wird vom Ursprungsbild eine Kopie erstellt
und diese um diesen Prozentwert vergrößert oder verkleinert.

ein Prozentwert hätte gleichzeitig den vorteil, dass man bei diesem mit Integer arbeiten kann.
die berechnung ist dann nbreite = breite * prozent / 100, wobei "breite" stets den beim Laden ermittelten wert behält.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Ich habe Gnade. Es ist der gleiche Code nur stark überarbeitet. Hier meine Änderungen:
  • Einrückungen korrigiert (obwohl es Geschmackssache ist)
  • Richtige Fehlermeldung beim Fehlerhaften Laden des Bildes
  • merfachzoomen ohne Bildverluste (durch abspeichern des Originalbildes)
  • verhindern eines negativen Zoomes
  • weglassen des Gosubs
  • Zoomen ohne verzerrung
  • kürzeren Code
  • Verwendung von Konstanten für ImageIDs
  • streichen des nie verwendeten EventTyps
  • Gadget wird nicht immer wieder neu erstellt
Alle Änderungen sind Kommentiert.
Versuch ihn lieber selber noch einmal nachzuprogrammieren, als ihn direkt einzubauen, da ich vielleicht einen etwas anderen Stil als du habe (ich verwende z. B. immer englische Variablen) und du sonst später probleme kriegst.

Code: Alles auswählen

#Name="Bilder anzeigen";Falls du den Namen mal verändern willst musst du nicht die ganzen Namen im Programm suchen.
#Zoom=0.1 ;Zoomgeschwindigkeit
#MinZoom=0.1;Minimaler Zoom 1/10 vom Original
#MaxZoom=2 ;Maximaler Zoom 2-fache vom Original

UseJPEGImageDecoder()
Global breite
Global hoehe
Global neueLaenge

Define BildZoom.f;Variable für den Zoomfaktor

Enumeration 0
#Img_original
#Img_Zoom
EndEnumeration

OpenWindow(0, 0, 0, 800, 600, "Bilder anzeigen", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  ButtonGadget(10, 5, 5, 80, 25, "Laden")
  ButtonGadget(11, 90, 5, 80, 25, "Verkleinern")
  ButtonGadget(12, 170, 5, 80, 25, "Vergrößern")
       
  If LoadImage(#Img_Original,"foto1.jpg")
  breite = ImageWidth(#Img_Original)
  hoehe = ImageHeight(#Img_Original)
  
  ;speichern der originalen Größe
  OBreite=breite
  Ohoehe=hoehe
  
  BildZoom=1;Zoomfaktor auf 1 setzen
  
  CopyImage(#Img_Original,#Img_Zoom)
  
  ;neueLaenge=breite ;Zeile ist jettz unütz
  
  ScrollAreaGadget(2, 0, 50, 700, 500 , breite, hoehe, 10,#PB_ScrollArea_Flat)
  ImageGadget(1, 0, 0, breite, hoehe, ImageID(#Img_Zoom))
  Else
  ;Lass das Programm nie ohne Fehlermeldung beenden, wenn du es wegen eines Fehlers beendest
  MessageRequester(#Name,"Das Bild foto1.jpg konnte nicht geladen werden")
  End;und dann auch wirklich beenden und nicht einfach ein Teil weglassen
  EndIf
 
  Repeat
  Event = WaitWindowEvent()
  
  EventType = EventType()
  
    Select Event
      Case #PB_Event_Gadget
     
        Select EventGadget()
          Case 11,12 ;ich hab Beide Gadgets zusammengefasst, da sie abgesehen von + und - das gleiche egleiche gemacht haben
            If EventGadget()=11 ;rein zoomen
            BildZoom-0.1
              If BildZoom<0.1
              BildZoom=0.1
              EndIf
            Else ;raus zoomen
            BildZoom+0.1
              If BildZoom>2
              BildZoom=2
              EndIf
            EndIf
          
          ;Hier verändern wir dann die Werte
          breite=OBreite*BildZoom 
          hoehe=OHoehe*BildZoom
          CopyImage(#Img_original,#img_Zoom);Wir Kopieren das Original Image, da hier noch keine Verluste entstanden sind
          ResizeImage(#IMG_Zoom, breite, hoehe, #PB_Image_Raw);Und Zoomen unser neues Bild
          
          
          
          SetGadgetState(1,ImageID(#Img_Zoom));Hier reicht SetGadgetState(1,ImageId(4)), föllig aus.
          ResizeGadget(1, #PB_Ignore, #PB_Ignore, breite, hoehe)
          SetGadgetAttribute(2, #PB_ScrollArea_InnerWidth, breite)
          SetGadgetAttribute(2, #PB_ScrollArea_InnerHeight, hoehe)
        EndSelect
    
    EndSelect
  Until Event = #PB_Event_CloseWindow
;Der Code der hier stand ist komplett umgeschrieben und direkt eingefügt (kommt jetzt nur noch einmal vor.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@kswb73

So ist es ja langsam lesbar :allright:

Im oberen Teil wurde If Else EndIf nicht eingerückt und Globale Variablen
mach in diesem Code keinen Sinn.

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Leerzeichen vor und hinter Operatoren wären auch nicht übel. :mrgreen:
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Fluid Byte hat geschrieben:Leerzeichen vor und hinter Operatoren wären auch nicht übel. :mrgreen:
+ 1
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Indeed!

... und wie gesagt, ich würde ein Integer wert für Prozentgröße vorziehen.
wobei bei dieser minimalen Veränderbarkeit, 0.1 ≤ x ≤ 2, ± 0.1
so ungenau kann selbst eine float nicht sein...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

tssoft,
i am very happy. :mrgreen: :mrgreen: :mrgreen:

Werde den Code eingehend studieren.
Aber nur schnell probiert. Einfach super.
Kann leider erst morgen wieder daran. :|

Danke, danke noch mal. :allright:
Ich war wirklich am Ende.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

schön wenn du happy bist, aber den dank reiche ich weiter an kswb73
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

....also da kann man sehen wie fertig ich schon war.
Nicht mal gemerkt das es @kswb73 war, der den Code geändert hatte.
Wenn ich mir meinen Code heute anschaue: oh Gott :oops: :oops: :oops:
Was habe ich da verbrochen!!!!
Wie ist es immer, an das Einfachste denkt man nicht.
Dank an alle hier die trotz allem geholfen haben, insbesondere @kswb73, der einen Verzweifelten gerettet hat.
Gruß
Dysti
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten