Seite 1 von 1

Bild spiegeln?

Verfasst: 05.02.2009 18:34
von Tompazi
Hallo, ich versuche gerade eine Prozedur zum spiegeln eines Images zu schreiben.
und ich blicke nicht ganz durch warum mein Lösungsansatz nicht funktioniert ...

Keine Fehlermeldung .. Bild bleibt gleich

Code: Alles auswählen

Procedure Mirror(ImageID,Mode) ;;   Mode: 0 = Vertical;  1 = Horizontal
 Structure Pix
  x.w
  y.w
  color.l
 EndStructure
 NewList Pixel.Pix()
  StartDrawing(ImageOutput(0))
 If Mode = 1
   FirstElement(Pixel())
  For y = ImageHeight(0) - 1 To 0 Step -1
   For x = 0 To ImageWidth(0) - 1
    AddElement(Pixel())
    Pixel()\x = x
    Pixel()\y = y
    Pixel()\color = Point(x,y)
   Next x
  Next y 
  
 Else
  FirstElement(Pixel())
   For y = 0 To ImageHeight(0) - 1 
   For x = ImageWidth(0) - 1 To 0 Step -1
    AddElement(Pixel())
    Pixel()\x = x
    Pixel()\y = y
    Pixel()\color = Point(x,y)
   Next x
  Next y 
 EndIf
 
 FirstElement(Pixel())
 ForEach Pixel()
  Plot(Pixel()\x,Pixel()\y,Pixel()\color)
 Next
 StopDrawing()
 ClearList(Pixel())
EndProcedure
MfG Tompazi

Verfasst: 05.02.2009 18:45
von kswb73
AUA (sorry falls ich so schrei, du wirst es aber auch gleich tun)

Code: Alles auswählen

Plot(Pixel()\x,Pixel()\y,Pixel()\color)
Du speicherst die Position der Pixel und malst sie an ihrer alten Stelle wieder neu. Da nutzt es auch nichts die Pixel gespiegelt auszulesen.

So gehts übrings einfach:

Code: Alles auswählen

ResetList(Pixel())
  For y=0 To ImageHeight(0) - 1
    For x=0 To ImageWidth(0) - 1
    NextElement(Pixel())
    Plot(x,y,Pixel()\color)
    Next x
  Next y

Verfasst: 05.02.2009 18:47
von STARGÅTE
du spiegelst nix

du ließt ja nur dein Bild von unten nach oben aus und plottest die Pixel aber an der selben stellen

bei Pixel()\y = y
muss dein Spiegeln rein:
Pixel()\y = ImageHeight(0)-y

PS: ein Array eignet sich besser

Verfasst: 05.02.2009 18:50
von PMV

Code: Alles auswählen

StartDrawing(ImageOutput(0))
Da würd ich auch mal die ImageID übergeben :D
Genau so wie bei den anderen Imagebefehlen.

Du läufst wie die anderen gesagt haben nur beim erstellen der Liste
"spiegelverkehrt durch. Intern speicherst du aber die Originalpositionen
und nutzt diese. Du musst also nicht beim erstellen der Liste "spiegeln",
sondern beim malen. Ein Array ist hier allerdings wirklich zu raten.

... und wo es mir auffällt. ForEach läuft immer die komplete Liste vom
ersten bis zum letzten Element. Ein FirstElement() direkt davor ist also
überflüssig.

MFG PMV

Verfasst: 05.02.2009 18:53
von Kaeru Gaman
> ein Array eignet sich besser

definif!

1. ImageWidth und ImageHeigth in Variablen auslesen
2. Array in dieser Größe dimensionieren
3. Bild in einer Richtung ins Array auslesen
4. in der anderen Richtung aus dem Array aufs Bild plotten


... aber generell würde ich mir eher ansehen, wie ein Image aufgebaut ist,
das wurde irgendwo schon mal gepostet, dann direkt mit pointern auf die Bitmap zugreifen.
solche geschichten über 2DDrawing sind extrem langsam...

Verfasst: 05.02.2009 19:00
von Tompazi
ich bin ja wirklich zu dumm...

Danke ..

MfG Tompazi

Verfasst: 05.02.2009 19:10
von Kaeru Gaman
ach, noch ne idee...
du brauchst auch nicht unbedingt ein array, nur einen einzigen kleinen buffer.

in der selben schleife auslesen und plotten, allerdings musst du mindestens einen wert zwischenspeichern.

1. linkes pixel zwischenspeichern
2. rechtes pixel links hinplotten
3. zwischengespeichertes pixel rechts hinplotten