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
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.

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

+ 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.
Werde den Code eingehend studieren.
Aber nur schnell probiert. Einfach super.
Kann leider erst morgen wieder daran.
Danke, danke noch mal.

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
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