Mask after Load?
BlitzMax Forums/BlitzMax Programming/Mask after Load?
| ||
I managed to mask an image if I do it before I loading it but I can't manage to mask an image "on the fly" in the gameloop. The idea I had was to first pick a normal maskcolor(background), then I would pick another color as mask and then paint a rect or something behind my image(Tank). In this way I'll be able to create players/ships/etc with a wide selection of colors. But even thou I use SetBlend(AlphaBlend) or SetBlend(MaskBlend) nothing happens to the image.'Shouldn't this work? SetMaskColor 255,255,0 SetBlend(MASKBLEND) DrawImage Image,BX,BY |
| ||
I'd be very interested in the answer to this as well. From another topic it was stated that the maskcolor needs to be determined at loadtime or else a pixmap is required to alter the image (2 pixmaps? 1 of the image and another to mask?) If true then it's a step backwards. <edit> sorry, that's a bit harsh.. something that I'd like to see changed. |
| ||
Yea, I'll check out if pixmaps can change the problem |
| ||
This is what I came up with...Graphics 640,480,16 back = LoadImage("back.png") front = LoadImage("masked.png",dynamicimage) While Not KeyDown(key_escape) If Keydown(key_space) burb = 255 Else burb = 128 endif DrawImage back,100,100 tg_pixmap = LockImage(front) tg1_pixmap = MaskPixmap(tg_pixmap,burb,0,burb) UnlockImage(front) DrawPixmap tg1_pixmap,100,100 DrawText "burb : " + burb,0,120 Flip cls release tg_pixmap release tg1_pixmap flushmem wend end where back.png is 100*100 coloured rectangle (in my case 63,175,47) and masked.png is 100*100 coloured rec (223,0,0) with smaller rec of 255,0,255. If there is a way to copy tg1_pixmap back to a 'normal' image it might do the job. <edit> for better example. |
| ||
Great example! It really got me going =) I figured that you don't really need both tg_pixmap and tg1_pixmap, I used tg_pixmap at both places and it worked fine or am I missing something? And I have a question, why do you release the pixmap each frame? My tanks is now running around in different colors =) So it works fine, I used grabimage to get it all together into one image. It seems like BlitzMax new way to handle images require pixmaps in this way. Still feels a bit strange you can't change the maskcolor after you loaded the image. Anyway if this is the case then I think it should be added to the documentation. |
| ||
I found the memory increasing so release the pixmaps to keep it under control. Hmmm.. I get an unhandled exception if I try to use the same pixmap for the lockimage and maskpixmap. How exactly did you use the same pixmap for both? I agree that BMX needs to use pixmap as images can not be changed on the fly but it is a shame. B3D had maskimage done quite nicely. I'm assuming you had to draw the pximap then grabimage to get the new image... is that right? If you found a more elegant way I'd be interested. |
| ||
Yes I draw it all, then I copy that part to a new image with grabimage. Graphics 640,480,16 back = LoadImage("back.png") front = LoadImage("masked.png",dynamicimage) 'back.png is 100*100 coloured rectangle (in my Case 63,175,47) And masked.png is 100*100 coloured rec (223,0,0) with smaller rec of 255,0,255 While Not KeyDown(key_escape) If KeyDown(key_space) burb = 255 Else burb = 128 EndIf SetColor 0,0,255 DrawRect 50,50,200,200 'DrawImage back,100,100 SetColor 255,255,255 SetColor 0,0,255'color of this tank DrawRect 50,50,200,200 tg_pixmap = LockImage(front) tg_pixmap = MaskPixmap(tg_pixmap,burb,0,burb) UnlockImage(front) DrawPixmap tg_pixmap,100,100 DrawText "burb : " + burb,0,120 Flip Cls Release tg_pixmap FlushMem Wend End |