Bilder schnell auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Bilder schnell auslesen

Beitrag von benpicco »

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.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Man greift einfach per DrawingBuffer() direkt auf das Bild zu, vorrausgesetzt natürlich das ist ein Sprite und kein Image.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag 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?
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.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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()
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Danke!
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.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag 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")
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.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

[EDIT] Ok, jetzt hat mich doch einer erwischt... ^^

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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Jap. Das führt dann das Standard-Bildvorschau Programm aus und übergibt das Bild mit.

EDIT: :? Du hast dein Post edited :?
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag 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()?
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.
Antworten