I want to create a png file with alpha transparency. I've downloaded loadpng and it loads png files ok, but when I try to save a BITMAP, I get a rgba image with nothing in the channels. How should I create the BITMAP in my Allegro app and how should I use the save functions in loadpng to get what I want.
My application is an update of my Eggifyer, which reads an image and mapps it on an egg. Now I want a transparent surrounding for the egg and a semi-transparent shadow that fades to the edges. All that looks fine in the application on my screen, but I want it saved so that I could place the egg on a web site.
Have you made sure the image is 32-bit? I don't remember whether it works but it looks like I put in code to specifically deal with 32-bit BITMAPs.
Well I think it is 32 bit. I do set_color_depth(32), then I do set_gfx_mode(). After that each create_bitmap() should create a 32 bit bitmap, right? The saved png has four channels but the alpha is black. I managed to separate the channels, revealing the image in the rgb channels. I guess my problem is drawing the image in the first place. I've been RTFM, but I haven't figured out when the drawing functions actually change the alpha value for a pixel in the bitmap.
I draw the image pixel by pixel. For the background I imagine I could do:
a = 0; col = makeacol32(r, g, b, a); putpixel(bmp, x, y, col);
and for the object I have methods for calculating r, g, b and a. a is 255 except for the edge, where I interpolate to get rid of crispiness, kind of anti-aliasing.
But the result looks like if a would calculate to 0 for the whole image.
Allegro's alpha support is pretty... idiosyncratic. I managed to get the following program to work though. The trick was to set_color_depth(32); Otherwise you might look into set_write_alpha_blender().
| 1 | #include <allegro.h> |
| 2 | #include <loadpng.h> |
| 3 | |
| 4 | int main(void) |
| 5 | { |
| 6 | BITMAP *bmp; |
| 7 | int x, y; |
| 8 | allegro_init(); |
| 9 | set_color_depth(32); |
| 10 | set_color_conversion(COLORCONV_NONE); |
| 11 | bmp = create_bitmap_ex(32, 255, 255); |
| 12 | for (y = 0; y < 256; y++) { |
| 13 | for (x = 0; x < 256; x++) { |
| 14 | int r = x; |
| 15 | int g = y; |
| 16 | int b = x; |
| 17 | int a = y; |
| 18 | int c = makeacol(r, g, b, a); |
| 19 | putpixel(bmp, x, y, c); |
| 20 | } |
| 21 | } |
| 22 | save_png("test.png", bmp, NULL); |
| 23 | destroy_bitmap(bmp); |
| 24 | return 0; |
| 25 | } |
Thanks for that!