Seite 1 von 3

Bild im Uhrzeigersinn drehen

Verfasst: 30.05.2009 19:33
von Tompazi
Ich blicke einfach nicht durch... Wenn das Bild quadratisch ist gehts...
Was ist da Falsch?

Code: Alles auswählen

 Structure Pix
  color.l
 EndStructure
 NewList Pixel.Pix()
 
 LoadImage(0,"Test.bmp")
 StartDrawing(ImageOutput(0))

  FirstElement(Pixel())
    For x = 0 To ImageWidth(0) - 1
     For y = ImageHeight(0) - 1  To 0 Step -1
      AddElement(Pixel())
      Pixel()\color = Point(x,y)
      Debug Hex(Pixel()\color) 
     Next y 
    Next x
    
    W = ImageWidth(0)
    H = ImageHeight(0)
   ResizeImage(0,H,W)

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
 StopDrawing()
 ClearList(Pixel())
 
 SaveImage(0,"Test.bmp")
MfG Tompazi

Verfasst: 30.05.2009 19:38
von Andesdaf
bitte in Zukunft irgendwelche Bilder aus dem PB-Verzeichnis nutzen, insofern
nicht spezielle Bilder benötigt werden. Die toten Bildpfade sind unangenehm
zu handhaben.

Im Bezug auf deine Frage, ich werde den Code mal weiterlesen.

Verfasst: 30.05.2009 19:40
von Kaeru Gaman
> Was ist da Falsch?

alles.

1) eine Liste???

2) wenn das Bild nicht quadratisch ist, musst du ein neues mit den umgekehrten Abmessungen erzeugen.

PS:
achso.. da ist ja das Resize...

ok, der Hauptfehler ist, dass du den Drawing-Kanal, erst mal schließen musst,
dann Resizen,
und dannerst kannst du ihn wieder öffnen also nochmal StartDrawing.

Verfasst: 30.05.2009 19:43
von Tompazi
Kaeru Gaman hat geschrieben:> Was ist da Falsch?

alles.

1) eine Liste???

2) wenn das Bild nicht quadratisch ist, musst du ein neues mit den umgekehrten Abmessungen erzeugen.
1) Ich verwende das gleich zum Spiegeln des Bildes da funktionierts mit der Liste einwandfrei.

2)

Code: Alles auswählen

W = ImageWidth(0)
    H = ImageHeight(0)
   ResizeImage(0,H,W) 
hm ?
MfG Tompazi

Verfasst: 30.05.2009 19:44
von Kaeru Gaman
PS:
achso.. da ist ja das Resize...

ok, der Hauptfehler ist, dass du den Drawing-Kanal, erst mal schließen musst,
dann Resizen,
und dann erst kannst du ihn wieder öffnen also nochmal StartDrawing.


aber eine Liste ist wirklich etwas... oversized...

du benötigst einen Integer Pointer fürs vorherige element und einen fürs nachfolgende,
um jeweils einen Long wert zu speichern, also du verbrätst DREIMAL soviel Speicher wie du bräuchtest,
auf einem 64bit system sogar FÜNF mal.

außerdem ist eine Liste Langsamer als ein Array.

Code: Alles auswählen

LoadImage(0,"Test_In.bmp")

Width  = ImageWidth(0)
Height = ImageHeight(0)

Dim Colors.l ( Width, Height )

 StartDrawing(ImageOutput(0))
  For x=0 To Width -1
    For y=0 To Heigth -1
      Colors( x,y ) = Point(x,y)
    Next
  Next
 StopDrawing()

ResizeImage(0, Height, Width)

 StartDrawing(ImageOutput(0))
  For x=0 To Height -1
    For y=0 To Width -1
      Plot( x,y , Colors( y, x ) )
    Next
  Next
 StopDrawing()
 
SaveImage(0,"Test_Out.bmp")

Verfasst: 30.05.2009 19:51
von Tompazi
Danke, das wars :allright:

und das mit den Arrays schau ich mir an :)

MfG Tompazi

PS: Dein Code malt das Bild Schwarz an (?)

Verfasst: 30.05.2009 20:01
von Kaeru Gaman
PS: Dein Code malt das Bild Schwarz an (?)
öhm... ja :|

weiß jetz auch nich warum, war nur runtergehäckt...

Verfasst: 30.05.2009 20:10
von Kaeru Gaman
hm... also das Array enthält nur Nuller... irgendwas scheint da nicht zu funktionieren mit dem Point() :roll:

Verfasst: 31.05.2009 13:23
von Tompazi
und woran liegt das?

MfG Tompazi

Verfasst: 31.05.2009 13:35
von Kaeru Gaman
nicht die geringste vorstellung :|

weiter als das bin ich nicht gekommen:

Code: Alles auswählen

OpenWindow(0, 0,0, 600,600, "test")

LoadImage(0,"Test_In.bmp")

Width  = ImageWidth(0)
Height = ImageHeight(0)

ImageGadget(0, 4,4, Width, Height, ImageID(0))
      While WindowEvent() :  Wend

Dim Col.l ( Width, Height )

  For x=0 To Width -1
   StartDrawing(ImageOutput(0))
      For y=0 To Heigth -1
        Col( x,y ) = Point(x,y)
        Plot( x,y, Col (x,y) & 255 )
      Next
   StopDrawing()
      SetWindowTitle(0, "Line: " + Str(x) )
      SetGadgetState(0, ImageID(0) )
      While WindowEvent() :  Wend
  Next

For n=0 To 99
  Debug Col( n, 50 )
Next

ResizeImage(0, Height, Width)

ResizeGadget(0, 4,4, Height, Width )
SetGadgetState(0, ImageID(0) )
While WindowEvent() :  Wend

  For y=0 To Width -1
   StartDrawing(ImageOutput(0))
      For x=0 To Height -1
        Plot( x,y , Col( y, x ) )
      Next
   StopDrawing()
      SetWindowTitle(0, "Line: " + Str(Y) )
      SetGadgetState(0, ImageID(0) )
      While WindowEvent() :  Wend
  Next


Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
SaveImage(0,"Test_Out.bmp")
der erste zugriff findet möglicher weise garnicht statt, weil sonst ja auch
das erste Plot() funktionieren müßte und sofort die pixel überschreiben.
Denn dass das Array erst befüllt wird und später plötzlich leer ist, kann einfach nicht sein.
... außer der pointer wird verhunzt, aber dafür gibt es keinen grund.

... vielleicht hab ich auch nur nen ganz blöden Typo reingehaun,
aber dann hab ich fünfmal dran vorbei geguckt... also, ich raffs nicht.