Thanks Lenard. Your solution solves the mystery of image not coming up
during render, but there is small problem with setting the alpha to max
value.

I have 2 image one of which is a jpg and second one a png file. The png file
has transparency in certain regions.
When I use array2d the transparency is preserved and i can see the bottom
jpg file through the transparent regions of the png.
This would not be possible if i set alpha value to 255 for all pixels.

Is there a way out ?
 From what I presume all this should be automatically done when I blit /
copy whether i use array2d or array3d


-Abhinav

On Thu, Oct 23, 2008 at 1:38 AM, Lenard Lindstrom <[EMAIL PROTECTED]> wrote:

> Hi Abhinav,
>
> You have found some unexpected behavior in pygame.surfarrray. blit_array is
> improperly named. It is a straight copy, not a true blit. And when a 3d
> array is copied to a 32 bit source alpha surface the per-pixel alpha is 0.
> The destination surface is completely transparent. The only workaround I can
> find is to set alpha to 255 after the blit_array() call:
>
>       r_mysurface = storeObject.lib_get(o_id,"__render_surface")
>       pygame.surfarray.blit_array(r_mysurface, r_myarray)
>        pygame.surfarray.pixels_alpha(r_mysurface)[...] = 255
>
>
> In Pgame 1.9 this will also work:
>
>        r_mysurface.fill((0,0,0,255), None, pgyame.BLIT_RGBA_MAX)
>
>
> I don't know if the 0 alpha is a bug or simply a peculiarity. Elsewhere in
> Pygame a 3-element color has an alpha of 255. But blit_array has probably
> set alpha to 0 since it was first implemented. It has simply gone unnoticed
> until now. Should it be changed?
>
> Lenard
>
>
> Abhinav Lele wrote:
>
>> Hi,
>>
>> I am using surfarray to blit an image.
>> When i use array2d i see the image being renderer, but with array3d i
>> dont.
>>
>>
>> I use the following code to load image :
>>
>>            r_temp_surface = pygame.image.load(fpath).convert_alpha()
>>            salpha =  r_temp_surface.get_alpha()
>>            r_surface = pygame.Surface((o_w,o_h)).convert_alpha()
>>
>>  pygame.transform.smoothscale(r_temp_surface,(o_w,o_h),r_surface)
>>            #if salpha != None:
>>            #    r_surface.set_alpha(salpha)
>>            r_array = pygame.surfarray.array3d(r_surface)
>>            print "New Surface Alpha: " , r_surface.get_alpha()
>>            storeObject.lib_set(o_id,"__render_surface",r_surface)
>>            storeObject.lib_set(o_id,"__render_array",r_array)
>>
>>
>>
>> To render I use :
>>
>>        r_myarray = storeObject.lib_get(o_id,"__render_array")
>>        r_mysurface = storeObject.lib_get(o_id,"__render_surface")
>>        pygame.surfarray.blit_array(r_mysurface, r_myarray)
>>        surface.blit  (r_mysurface,(gx,gy))
>>
>>
>>
>> Plz help.
>>
>> -Abhinav
>>
>>
>
>
> --
> Lenard Lindstrom
> <[EMAIL PROTECTED]>
>
>


-- 

Gerald R. Ford  - "I know I am getting better at golf because I am hitting
fewer spectators."

Reply via email to