Image from a buffer

Blitz3D Forums/Blitz3D Programming/Image from a buffer

Hi Guys,
I'm trying to load an image from a bitmap buffer instead of a file.
The basic idea is that I will link to a DLL (this I know how to do already) and the dll function read the bitmap from a file and then return it.
In the Blitz env I take the buffer and create an image from this buffer.
The question is how do I take the buffer and create the image from it's data?
Any code snippest would be great!

Thanks in advance
Yiftah

ok, you don't have to use a dll to do this, i would only use a dll if i really had to personally.... but onto the task. ok, this is from something i just wrote a few days ago actually, i got the information from the read/writepixelfast examples i think, the docs can cover this stuff if you can pay attention for long enough that is! heh

this is how to load a bmp and read the pixels into a pixel array for writing to later, comments below.

xdim=256 : ydim=256 ;the image dimension vars
Dim Imagedata(xdim,ydim) ;size pixel array
mypic=LoadImage(filename$) ;load a bmp

DrawImage mypic,0,0 ;draw image to screen
LockBuffer ;must have for ReadPixelFast
 For y=0 To ydim ;x/y loop
  For x=0 To xdim
   Imagedata(x,y)=ReadPixelFast(x,y) ;read to array
  Next
 Next
UnlockBuffer
Cls ;clear image from screen


now you've got all pixels in the array, you want to, ehh...
create the image from the data now. ok, this writes the pixel array to a new image.

 mynewpic=CreateImage(xdim,ydim) ;size new image
 SetBuffer ImageBuffer(mynewpic) ;put image in buffer

LockBuffer ;must have for WritePixelFast
 For y=0 To ydim ;draw new image
  For x=0 To xdim
   WritePixelFast x,y,Imagedata(x,y) ;write to image
  Next
 Next
UnlockBuffer

 SetBuffer BackBuffer() ;reset to screen buffer


I cant garantee this code is 100% perfect, as i havent tested, but it should be. One thing id like to mention is that i found writepixelfast doesn't work in fullscreen 16bit!? but plot does, its a little slower and more complex but at least it works, i guess.

Hope that helps some anyway.

It really depends on the way you want to fill the buffer with image data. If blitz will fill the buffer (read the data from somewhere, eg. using RTLMemoryMove with a Pointer given by the DLL) then it's pretty simple, all you need to do is writing them to the image, as muk suggested.

If the DLL will fill the buffer using a pointer sent by Blitz, you need to send a banks physical adress to the dll. you may send the bank handle to the DLL, as usual, but there's something faster that will let the DLL draw directly to a blitz image. See here:
http://www.blitzbasic.com/codearcs/codearcs.php?code=1518

i just want to add this bit of information. in my post above i was saying that writepixelfast doesn't work in fullscreen 16-bit. this is wrong as i checked, well, spotted what the reason is.

in the Blitz3d version.txt file it says that a pixel by default has its alpha as full by default, which is why in 16-bit it wasn't working for me. the solution is to mask out the alpha channel with $FFFFFF. So the above code for reading pixels should be:

xdim=256 : ydim=256 ;image dimension vars
Dim Imagedata(xdim,ydim) ;size pixel array
mypic=LoadImage(filename$) ;load a bmp

DrawImage mypic,0,0 ;draw image
LockBuffer
 For y=0 To ydim ;read x/y loop
  For x=0 To xdim
   Imagedata(x,y)=ReadPixelFast(x,y) And $FFFFFF ;<- mask out alpha value
  Next
 Next
UnlockBuffer
Cls ;clear image from screen


I think he might be reading the image using a .dll for speed reasons.

Thanks for your help.
I managed through the posts on userlibs forum.

Coppercircle was searching for a similar solution, could you show use how you did it?

I used the method described in this thread :
http://www.blitzbasic.com/Community/posts.php?topic=44333

I blit the Image buffer onto the DD surface using StrechDib or DrawDibDraw GDI functions.