Bild im Uhrzeigersinn drehen

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

Bild im Uhrzeigersinn drehen

Beitrag 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
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 30.05.2009 19:44, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

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

Beitrag 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")
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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 (?)
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PS: Dein Code malt das Bild Schwarz an (?)
öhm... ja :|

weiß jetz auch nich warum, war nur runtergehäckt...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hm... also das Array enthält nur Nuller... irgendwas scheint da nicht zu funktionieren mit dem Point() :roll:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

und woran liegt das?

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

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