Seite 2 von 2

Verfasst: 05.05.2009 16:13
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.

Verfasst: 05.05.2009 16:24
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.

Verfasst: 05.05.2009 16:29
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

Verfasst: 05.05.2009 16:31
von Fluid Byte
Leerzeichen vor und hinter Operatoren wären auch nicht übel. :mrgreen:

Verfasst: 05.05.2009 16:32
von ts-soft
Fluid Byte hat geschrieben:Leerzeichen vor und hinter Operatoren wären auch nicht übel. :mrgreen:
+ 1

Verfasst: 05.05.2009 16:34
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...

Verfasst: 05.05.2009 16:38
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.

Verfasst: 05.05.2009 16:55
von ts-soft
schön wenn du happy bist, aber den dank reiche ich weiter an kswb73

Verfasst: 06.05.2009 06:41
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