Bilder verkleinern und vergroessern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Bilder verkleinern und vergroessern

Beitrag 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
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Hallo,
hier sind die Beispiele.
Dieses wurde mit Imagegadget und resizegadget angezeigt:

Bild

und dieses wurde verkleinert mit dem Webgadget dargestellt:

Bild

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?
Zuletzt geändert von dysti am 06.05.2009 06:20, insgesamt 1-mal geändert.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

okee, kannst du bitte noch den Codeausschnitt dazu posten...

sonst kann ich nicht auf mögliche Fehler eingehen ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

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
Zuletzt geändert von dysti am 06.05.2009 06:21, insgesamt 1-mal geändert.
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 »

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

Ä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 :wink:

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

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

... 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

> wäre ts vielleicht auch drauf gekommen
So genau guck ich mir das dann nicht mehr an :mrgreen:
Gosub finde ich lustig, erinnert mich an meine Jugend :mrgreen:
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 :mrgreen:

Die Umwandlung und Berechnung in Float ist auch total überflüssig (machen
aber viele). Nur beachten das erst multipliziert wird und dann dividiert.
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 »

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