Load from Bank
BlitzPlus Forums/BlitzPlus Programming/Load from Bank
| ||
Is possible (with or without custom dll) to load image, video and audio directly from a memory bank ? exist some external module to do this ? Thanks. |
| ||
No, currently it can't be done by any means. Its been asked for many times before though, so, fingers crossed it will be possible one day. |
| ||
Well.. as regards images can be possible using a trick. You create an image buffer (CreateImage) , then you copy all the bytes from the bank to the image buffer. Here it is some code I found (with B+ , you can do further optimitazions) : Graphics 640,480 SetBuffer BackBuffer() bBank = CreateBank(5) iImage = LoadImage("testin.png") ImageToBank(bBank, iImage) newImage = BankToImage(bBank) DrawImage newImage, 0,0 Flip WaitKey() FreeBank bBank FreeImage newImage FreeImage iImage End ;;;;;;;;;;;;;;;;;;;;;;;; ; Function ImageToBank ; ;;;;;;;;;;;;;;;;;;;;;;;; ;Accepts a bank which will be resized to store the data, and an image to store, ;optional parameter is the AlphaFlag (currently irrelevant) ;Returns the error code. Function ImageToBank(bankImage, bufferImage, iAlphaFlag=0) bufOldBuffer = GraphicsBuffer();get the handle for the current buffer Error = 0; Error 0 = no error, error 1 = image size invalid ;Check the image dimensions, if invalid then exit function with errorcode 1 If (ImageWidth(bufferImage)<1) Or (ImageHeight(bufferImage)<1) Then Error = 1 Goto EndBufferToBank EndIf ;get the total number of bytes the image makes up SizeOfImage = ImageWidth(bufferImage)*ImageHeight(bufferImage) ResizeBank bankImage, (SizeOfImage*4) + 9 ;(4 bytes per int for the image info + 9 extra bytes for header) PokeInt bankImage,0,ImageWidth(bufferImage);store the width in the bank PokeInt bankImage,4,ImageHeight(bufferImage);store the height ;store other info in byte 8 (the ninth byte) iByte8 = %00000000 If iAlphaFlag Then iByte8 = iByte8 Or %00000001 ; OR the first bit to 1 if it has an alpha mask PokeByte bankImage,8,iByte8 ;store iByte8 ;DebugLog "Byte 8: " + iByte8 iBankPointer = 9 SetBuffer ImageBuffer(bufferImage) LockBuffer ImageBuffer(bufferImage) For iLoopX = 0 To ImageWidth(bufferImage)-1 For iLoopY = 0 To ImageHeight(bufferImage)-1 PokeInt bankImage,ibankPointer, ReadPixelFast(iLoopX,iLoopY) iBankPointer = iBankPointer + 4;increment by 4 each time since it is an int we are poking Next Next UnlockBuffer ImageBuffer(bufferImage) SetBuffer bufOldBuffer ; restore the buffer .EndBufferToBank Return Error End Function ;;;;;;;;;;;;;;;;;;;;;;;; ; Function BankToImage ; ;;;;;;;;;;;;;;;;;;;;;;;; ; Accepts a bank that has previously had its' data set with ImageToBank ; Returns an image Function BankToImage(bankImage) bufOldBuffer = GraphicsBuffer() iWidth = PeekInt(bankImage,0) iHeight = PeekInt(bankImage,4) iiByte8 = PeekByte(bankImage,5) ;get the length of the data block SizeOfData = iWidth*iHeight imgReturn = CreateImage(iWidth,iHeight) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Insert code To process iByte8 ; NOTE FOR ALPHA: if ((BIT0) And %00000001) = 1 then (process alpha info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iBankPointer = 9 SetBuffer ImageBuffer(imgReturn) LockBuffer ImageBuffer(imgReturn) For iLoopX = 0 To ImageWidth(imgReturn)-1 For iLoopY = 0 To ImageHeight(imgReturn)-1 WritePixelFast(iLoopX,iLoopY,PeekInt(bankImage,iBankPointer)) iBankPointer = iBankPointer + 4;increment by 4 each time since it is an int we are peekin Next Next UnlockBuffer ImageBuffer(imgReturn) SetBuffer bufOldBuffer Return imgReturn End Function ; The following is a description of the format in which the information is stored in the bank ; ------------------------------------------------------------------------------------------- ; ; Bytes 0-3 contains the width of the image (4-byte integer) must not be less than 1 ; Bytes 4-7 contains the height of the image (4-byte integer) must not be less than 1 ; Bit 0 of Byte 8 describes whether the image has an alpha mask (0=no, 1=yes) ; may contain more information at a later date ; ; NOTE FOR ALPHA: if ((BIT0) And %00000001) = 1 then (process alpha info) ; ; Bytes onward from 9 descrive the image as integers, because the length of this can be calculated ; by multiplying the width by the height, there is no need for a terminator |
| ||
Seldon, I think the point in doing this is that you can generate images on the fly by peeking data on a bank, and then load the image passing the bank address. Another use is to prevent the media for your game to be accesible to undesired hands, because you can store the media encrypted in one PAK, and then load chunks of that PAK, decrypt them into a bank, and load it from a bank, without the need of a temp file in the hard disk. So it's a different thing to what you're explaining. |