ReadPixelFast

Blitz3D Forums/Blitz3D Programming/ReadPixelFast

FBEpyon(Posted 2004) [#1]
Hello, im having problems reading a pixel color using readpixel fast :(

Im not sure if there is a problem with blitz3d being able to do this or am I doing it wrong..


Function ColorImage(x%,y%,scolor)

	Local oldimage = LoadImage ("gfx/player.png")
	Local newimage = CreateImage(48,64)
	Local ob = ImageBuffer(oldimage) : LockBuffer ob
	Local nb = ImageBuffer(newimage) : LockBuffer nb
	Local ix,iy
	
	For ix = 0 To 48 - 1
		For iy = 0 To 64 - 1
			Local rbgc = ReadPixelFast(ix+x,iy+y,ob)
			Select scolor
				Case red
					If rbgc = $FF404040
						WritePixelFast ix,iy,($FF400000),nb
					ElseIf rbgc = $FF808080
						WritePixelFast ix,iy,($FF800000),nb
					ElseIf rbgc = $FFC0C0C0
						WritePixelFast ix,iy,($FFC00000),nb
					ElseIf rbgc = GetRGB(232,232,232)
						WritePixelFast ix,iy,($FFFF4040),nb
					Else
						WritePixelFast ix,iy,(rbgc),nb
					EndIf			
				Case blue
				Case green
				Case yellow
			End Select
		Next
	Next
	UnlockBuffer ob : UnlockBuffer nb

	MaskImage newimage,255,0,255
	Return newimage
	
End Function



here is my code please let me know if im doing somethign wrong and also this is very slow :(


AntonyWells(Posted 2004) [#2]
Be more specific. I've used writepixel/readpixel etc countless times, it works. It's slow when reading though, it'll be a lot better to cache the pixel colors in a bank or similar, that'll speed it up alot.


Floyd(Posted 2004) [#3]
The first two lines already look like trouble:
Function ColorImage(x%,y%,scolor)

	Local oldimage = LoadImage ("gfx/player.png")

It looks likes this function will be called many times for different values of x,y.
But oldimage is being reloaded with every function call. That would explain most of the slowness.
And the previously loaded copy is simply forgotten, which is a memory leak.


FBEpyon(Posted 2004) [#4]
ahh okay thanks Floyd I forgot to unload the image :(


Otacon: can you show me a example of using a bank to do this game process??

:EDIT: I got it fixed and it really fast now :P


AntonyWells(Posted 2004) [#5]
Sure, something simple would be like,

type img

end type


AntonyWells(Posted 2004) [#6]
Sure, something simple would be like,

type img
     field pix,w,h
end type

function createFast(x,y,w,h)
   o.img=new img
   bank=createBank( w*h*3)
lockbuffer
   for gy=x to y+h
   for gx=x to x+w
        pokeint bank,bo,readpixelfast(gx,gy)
        bo=bo+4
   next
   next
unlockbuffer
o\pix=bank
return handle(o)
end function

and then pass the returned handle to this func to retrieve pixel color very fastly.

function readPixelFastest( img,x,y)
     in.img=object.img(img)
     return peekint(in\pix,(y*in\w+x)*4)
end function




Although I strongly suggest accessing the bank directly using the same method as readpixel fastest above does, rather calling a function to do it, as that adds a lot of unneded overhead.