Bild spiegeln?

Anfängerfragen zum Programmieren mit PureBasic.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Bild spiegeln?

Beitrag 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
Bild
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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
Zuletzt geändert von kswb73 am 05.02.2009 18:50, insgesamt 2-mal geändert.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

ich bin ja wirklich zu dumm...

Danke ..

MfG Tompazi
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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