Bilder schnell auslesen
Bilder schnell auslesen
Gibt es eine Schnellere möglichkeit, alle Farbwerte einen Bildes zu ermitteln, als das gesamte bild mit Point() abzufahren?
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Danke! Und wie genau? Mit PeekL() oder PeekB() oder anders?
dann sowas wie
kanns wohl nicht sein, oder?
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
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
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:
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()

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Danke!
Ich wahr gestern wohl etwas müde...
Mal schauen, wie schnell das ist, ich hab gard kein PB zur hand..
Ich wahr gestern wohl etwas müde...
Mal schauen, wie schnell das ist, ich hab gard kein PB zur hand..
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
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")
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
//EDIT: Vorheriges Posting gelöscht, hab was besseres rausgefunden...
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.

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.
[EDIT] Ok, jetzt hat mich doch einer erwischt... ^^
Hier nochma der orginal Post:
"RunProgram("Testbild-buffer.bmp")"
Hier nochma der orginal Post:
"RunProgram("Testbild-buffer.bmp")"

Zuletzt geändert von Deeem2031 am 01.09.2005 20:04, insgesamt 1-mal geändert.

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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?
Ist das ein Fehler in point()?
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
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.