Seite 1 von 2

Bilder schnell auslesen

Verfasst: 31.08.2005 21:49
von benpicco
Gibt es eine Schnellere möglichkeit, alle Farbwerte einen Bildes zu ermitteln, als das gesamte bild mit Point() abzufahren?

Verfasst: 31.08.2005 22:43
von Deeem2031
Man greift einfach per DrawingBuffer() direkt auf das Bild zu, vorrausgesetzt natürlich das ist ein Sprite und kein Image.

Verfasst: 31.08.2005 22:57
von benpicco
Danke! Und wie genau? Mit PeekL() oder PeekB() oder anders?
dann sowas wie

Code: Alles auswählen

InitSprite()
sprite$=OpenFileRequester("Bild auswählen","c:\","BMP|*.bmp;",-1)
OpenScreen(640,480,16,"Test")
LoadSprite(1,sprite$)
StartDrawing(SpriteOutput(1))
buffer=DrawingBuffer()
Dim image.l(SpriteWidth(1),SpriteHeight(1))
For y=1 To SpriteHeight(1)
  For x=1 To SpriteWidth(1)
    z+1
    image(x,y)=PeekL(*buffer+4*z)
  Next
Next
CloseScreen()
For y=1 To SpriteHeight(1)
  For x=1 To SpriteWidth(1)
    Debug image(x,y)
  Next
Next
kanns wohl nicht sein, oder?

Verfasst: 31.08.2005 23:15
von Deeem2031
Immerhin fast:
1. StopDrawing() fehlt
2. Man fängt in einem Buffer immer bei 0 an -> "z+1" nach dem auslesen
3. Die Zeilen des Sprites liegen nicht direkt hintereinander, wodurch man "DrawingBufferPitch()" braucht.

So das die Schleife dann so aussieht:

Code: Alles auswählen

Dim image.l(SpriteWidth(1),SpriteHeight(1))
For y=1 To SpriteHeight(1)
  For x=1 To SpriteWidth(1)
    image(x,y)=PeekL(*buffer+4*z+z2)
    z+1
  Next
  z = 0
  z2 + DrawingBufferPitch()
Next
StopDrawing()

Verfasst: 01.09.2005 09:28
von benpicco
Danke!
Ich wahr gestern wohl etwas müde...
Mal schauen, wie schnell das ist, ich hab gard kein PB zur hand..

Verfasst: 01.09.2005 18:17
von benpicco
Die Geschwindigkeit ist wirklich gut, aber was kann man gegen diese Farbverschiebung tun?

Code: Alles auswählen

InitSprite()
sprite$=OpenFileRequester("Bild auswählen","c:\","BMP|*.bmp;",-1)
OpenScreen(640,480,32,"Test")
LoadSprite(1,sprite$)
StartDrawing(SpriteOutput(1))
*buffer=DrawingBuffer()
Height=SpriteHeight(1)
Width=SpriteWidth(1)
Dim image.l(Width,Height)
For y=1 To Height
  For x=1 To Width
   image(x,y)=PeekL(*buffer+4*z+z2) 
   z+1 
   Next 
   z = 0 
  z2 + DrawingBufferPitch() 
Next
StopDrawing()
CloseScreen()
CreateImage(1,Width,Height)
StartDrawing(ImageOutput())
For y=0 To Height
  For x=0 To Width
    Plot(x,y,image(x,y))
  Next
Next
StopDrawing()
SaveImage(1,"Testbild-buffer.bmp")
RunProgram("Testbild-buffer.bmp")

Verfasst: 01.09.2005 18:30
von hardfalcon
//EDIT: Vorheriges Posting gelöscht, hab was besseres rausgefunden... :mrgreen:

Ich hab grad rausgefunden, dass es von deiner ScreenDepth abhängt. Schau dir mal an, was passiert, wenn du die auf 16 Bit runterstellst... Das Problem ist, dass Plot() nur 24bit-Farbwerte schluckt, und keine 32bit-Werte. Also folgende Situation:
- du hast ein 24bit-BMP.
- wenn du es bei einem 32Bit-Screen lädtst, wird es auf 32Bit aufgepustet, wenn du es auf einem 16Bit-Screen lädtst, wird es auf 16Bit runtergerechnet.
- wenn du dein Bild wieder mit dem Plot-Befehl auf ein Image/Sprite zeichnest, nimmt der den 32/16-Bit Farbwert als 24Bit-Wert, wodurch es u.a. zu Farbverfälschungen kommt.

Verfasst: 01.09.2005 20:00
von Deeem2031
[EDIT] Ok, jetzt hat mich doch einer erwischt... ^^

Hier nochma der orginal Post:

"RunProgram("Testbild-buffer.bmp")" :?

Verfasst: 01.09.2005 20:01
von AndyX
Jap. Das führt dann das Standard-Bildvorschau Programm aus und übergibt das Bild mit.

EDIT: :? Du hast dein Post edited :?

Verfasst: 02.09.2005 17:55
von benpicco
Und was lösst sich da machen? Einen 24 Bit screen gibt´s ja nicht (mehr)...
Das Bild wird ja korrekt angezeigt, aber warum werden dann die Farbwerte falsch ausgelesen?

Code: Alles auswählen

InitSprite()
sprite$=OpenFileRequester("Bild auswählen","c:\","BMP|*.bmp;",-1)
OpenScreen(640,480,32,"Test")
LoadSprite(1,sprite$)
DisplaySprite(1,0,0)
FlipBuffers()
StartDrawing(SpriteOutput(1))
*buffer=DrawingBuffer()
Height=SpriteHeight(1)
Width=SpriteWidth(1)
Dim image.l(Width,Height)
For y=1 To Height
  For x=1 To Width
   image(x,y)=PeekL(*buffer+4*z+z2) 
   z+1 
   Next 
   z = 0 
  z2 + DrawingBufferPitch() 
Next
StopDrawing()
CreateImage(1,Width,Height)
StartDrawing(ImageOutput())
For y=0 To Height
  For x=0 To Width
    Plot(x,y,image(x,y))
  Next
Next
StopDrawing()
ClearScreen(0,0,255)
StartDrawing(ScreenOutput())
DrawImage(UseImage(1),0,0)
StopDrawing()
FlipBuffers()
Delay(3000)
CloseScreen()
SaveImage(1,"Testbild-buffer.bmp")
RunProgram("Testbild-buffer.bmp")
End
Ist das ein Fehler in point()?