Bilder verkleinern und vergroessern
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Weise weiß, dass er ein Narr ist.
Ich habe Gnade. Es ist der gleiche Code nur stark überarbeitet. Hier meine Änderungen:
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.
- 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
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
Open Suse 11.2: PB 4.4
- 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
@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
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Leerzeichen vor und hinter Operatoren wären auch nicht übel. 

Windows 10 Pro, 64-Bit / Outtakes | Derek
- 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
+ 1Fluid Byte hat geschrieben:Leerzeichen vor und hinter Operatoren wären auch nicht übel.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

....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
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
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9