Seite 1 von 2
Bilder verkleinern und vergroessern
Verfasst: 05.05.2009 10:28
von dysti
Hallo,
ich möchte meine Fotos in einem Imagegadget verkleinern und vergrößern.
Mit einem Webgadget ging es gut. Aber er ist abhängig von der Installation des Internetexplorers.
Desweiteren kam hier im Forum der Hinweis auf das Imagegadget.
Also habe ich es mit dem Imagegadget, Resizegadget und Setgadgetstate probiert.
Leider mit einem kläglichen Ergebnis:
Wenn ich die Fotos verkleinere, habe ich Klötzchenbildung oder Schnee (#PB_Image_Smooth) je nach Flag in der Anzeige.
Wie kann ich die Fotos verkleinert darstellen ohne Klötzchenbildung?
Hinweis: Art Zoomfunktion
Verfasst: 05.05.2009 11:40
von STARGÅTE
wenn ich bilder/Images mit der Procedure
ResizeImage(#Image, Breite, Höhe [, Modus])
und Kantanglättung verkleinere habe ich kein "Klötzer"
Ich kann mir darunter auch gerade nix vorstellen.
Kannst du mal ein Beispiel zeigen ?
Ich meine wenn du Landschaftsbilder auf 64*64 oder noch keiner Zooms musst du dich nicht wundern wenn du "nix" mehr erkennst.
Aber mit #PB_Image_Smooth bei Resize sollte es wenigsten geglättet sein.
Hinweis:
Es gibt ubrigens keinen verlustfreien zoom in kleinere, denn die Pixel werden ja nicht kleiner, sondern viele Pixel werden zu wenigen zusammen gezogen, das da dann einige Pixel auf der strecke bleiben ist nun mal so, dafür gibs ja die besagte Kantenglättung.
Verfasst: 05.05.2009 12:19
von dysti
Hallo,
hier sind die Beispiele.
Dieses wurde mit Imagegadget und resizegadget angezeigt:
und dieses wurde verkleinert mit dem Webgadget dargestellt:
Wie man einwandfrei erkennt, ist trotz der kleineren Darstellung im Webgadget die Darstellung um vieles besser.
Aber es müßte doch auch mit dem Imagegadget funktionieren oder?
Verfasst: 05.05.2009 12:23
von STARGÅTE
okee, kannst du bitte noch den Codeausschnitt dazu posten...
sonst kann ich nicht auf mögliche Fehler eingehen ...
Verfasst: 05.05.2009 12:24
von Kaeru Gaman
yup... das obere ist wahrscheinlich vergrößert worden ohne smooth.
beim alleinigen verkleinern kann sowas nicht passieren.
... mich wunderte sowieso das wort "verkleinern" im ersten posting.
Verfasst: 05.05.2009 12:47
von dysti
hey @Kaeru Gaman, es ist genau anders herum, das obere ist nicht vergrößert worden, sondern in der Darstellung verkleinert.
Nun noch ein Beispielcode:
Code: Alles auswählen
UseJPEGImageDecoder()
Global breite
Global hoehe
Global neueLaenge
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(3,"foto1.jpg")
breite = ImageWidth(3)
hoehe = ImageHeight(3)
neueLaenge=breite
ScrollAreaGadget(2, 0, 50, 700, 500 , breite, hoehe, 10,#PB_ScrollArea_Flat)
ImageGadget(1, 0, 0, breite, hoehe, ImageID(3))
EndIf
Repeat
Event = WaitWindowEvent()
EventType = EventType()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 11
;FreeGadget(1)
neueLaenge=neueLaenge-100
Gosub berechnen
ResizeImage(3, breite, hoehe, #PB_Image_Raw)
;ResizeImage(3, breite, hoehe, #PB_Image_Smooth)
ImageGadget(1, 0, 0, breite, hoehe, ImageID(3))
ResizeGadget(1, #PB_Ignore, #PB_Ignore, breite, hoehe)
SetGadgetState(1, ImageID(3))
SetGadgetAttribute(2, #PB_ScrollArea_InnerWidth, breite)
SetGadgetAttribute(2, #PB_ScrollArea_InnerHeight, hoehe)
Case 12
neueLaenge=neueLaenge+100
Gosub berechnen
ResizeImage(3, breite, hoehe, #PB_Image_Raw)
;ResizeImage(3, breite, hoehe, #PB_Image_Smooth)
ResizeGadget(1, #PB_Ignore, #PB_Ignore, breite, hoehe)
SetGadgetState(1, ImageID(3))
SetGadgetAttribute(2, #PB_ScrollArea_InnerWidth, breite)
SetGadgetAttribute(2, #PB_ScrollArea_InnerHeight, hoehe)
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
berechnen:
If breite < hoehe
Swap breite, hoehe
wechsel.l = #True
Else
wechsel.l = #False
EndIf
; wir wollen das Bildverhältnis breite zu hoehe behalten, also
verhaeltnis.f = 1.0 * hoehe / breite
nbreite = neueLaenge
nhoehe = nbreite * verhaeltnis ; hier kann gerundet werden
; wir müssen nun ggf. beidemale W mit H vertauschen
If wechsel
Swap breite, hoehe
Swap nbreite, nhoehe
EndIf
breite=nbreite
hoehe=nhoehe
Return
Hier das Originalfoto:
www.matthiesen.bplaced.net/foto1.JPG
Verfasst: 05.05.2009 15:07
von ts-soft
Wie soll denn das funktionieren?
Ohne das irgendeine Resizeereignis aufgetreten ist, resizede immer wieder das resizede Bild?
Ausserdem ist da Code in Deinem Eventloop, an einer Stelle wo kein Code
hingehört, nämlich ausserhalb der Ereignisse
Ändere das Resizen also darauf ab, das es nur resized wird, wenn sie was an
der Fenstergröße geändert hat und nimm immer das orginal zum resizen.
Bei Deinem Codestil vergeht mir aber jede Lust das da exemplarisch
einzubauen, Du weiß was ich mein
Gruß
Thomas
Verfasst: 05.05.2009 15:36
von Kaeru Gaman
also, ich finde auch dass eine subroutine ohne
End davor bestenfalls unsauber ist,
und das man sowieso lieber ne procedure verwenden sollte.
Auch das resizen von Ursprungsbild aus durchzuführen halte ich für eine gute idee.
es ist tatsächlich möglich, dass das wiederholte verkleinern des bereits verkleinerten Images diese Artefakte erzeugt.
interessant auch der effekt, wenn man von einer gewissen verkleinerung wieder vergrößert, dann werden mosaik-kacheln draus...
... und wenn du descriptiv benamste Konstanten verwendet hättest statt abstrakte Nummern,
wäre ts vielleicht auch drauf gekommen, dass das zwei buttons zum vergrößern und verkleinern sind...

Verfasst: 05.05.2009 15:44
von ts-soft
> wäre ts vielleicht auch drauf gekommen
So genau guck ich mir das dann nicht mehr an
Gosub finde ich lustig, erinnert mich an meine Jugend
Warum das berechnen am ende des Programmes, wenn alles vorbei ist,
nochmal durchgeführt wird entzieht sich natürlich meiner Kenntnis. Habe
mit sowas seit 30 Jahren nichts mehr zu tun gehabt
Die Umwandlung und Berechnung in Float ist auch total überflüssig (machen
aber viele). Nur beachten das erst multipliziert wird und dann dividiert.
Verfasst: 05.05.2009 16:09
von dysti
Hey,
gosub hin, gosub her. Code nur aus dem Codearchiv genommen.
Mir geht es nur im Prinzip darum, ob es überhaupt geht mit einem Imagegadget.
Habe trotz mehrwöchigen Suchen in Foren keinen Code gefunden,
der ein Bild verkleinert.
Jetzt stehe ich total auf den Schlauch.
Bitte, bitte, ich weiß nicht mehr weiter.