Ah I see you want to blend them together in the same data. In your examples 
you are still overwriting the image data. If you have a red channel that's 
at 100 bytes and you replace the data with another pixel that's 100 bytes, 
it's still 100. If you are looking to blend two images together you have a 
few options:

1) Create separate ImageData, put them into pyglet.sprite.Sprite objects 
and draw them where you want. By default Sprites should blend, and it 
should be easier to keep track of things/move them when they are separate. 
I'm curious why the need to combine the data instead of treating them 
separate but move them where you want?

2) If you actually *need *them combined into one image data for some 
reason, then you can combine the pixels together with math based on 
blending formulas. https://learnopengl.com/Advanced-OpenGL/Blending Here is 
the formula and an example.


On Thursday, March 12, 2020 at 7:49:36 AM UTC-5, Jonathon Parker wrote:
>
> I tried that and it did not work.  I have verified that if I draw a 
> smaller image on top of the new, I can see that.  But even with using RGBA, 
> I only see the last image if the sizes are the same.  Here is a more 
> expanded example of what I am trying to do.
>
> ---
>
> import pyglet
> import pyglet.gl
> import ctypes
> import itertools
> import numpy as np
> import cv2
>
> pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
>
> pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
>
> image = np.zeros((50, 50, 4), np.uint8) # type(image) = numpy.ndarray
>
> pt1 = (12, 1)
> pt2 = (48, 24)
> pt3 = (12, 48)
> pt4 = (1, 24)
> pt5 = (1, 26)
> pt6 = (48, 26)
> pt7 = (48, 24)
>
> triangle_cnt = np.array([pt1, pt2, pt3])
> cv2.drawContours(image, [triangle_cnt], 0, (100, 255, 100, 255), -1)
> image = image.tolist()
> px = list(itertools.chain(*list(itertools.chain(*image))))
>
> rawData = (ctypes.c_ubyte * len(px))(*px)
> player_image = pyglet.image.ImageData(50, 50, 'RGBA', 
> rawData).get_texture()
>
> image2 = np.zeros((50, 50, 4), np.uint8)
> rect_cnt = np.array([pt4, pt5, pt6, pt7])
> cv2.drawContours(image2, [rect_cnt], 0, (100, 255, 100, 255), -1)
> image2 = image2.tolist()
> px2 = list(itertools.chain(*list(itertools.chain(*image2))))
>
> rawData2 = (ctypes.c_ubyte * len(px2))(*px2)
> rect = pyglet.image.ImageData(50, 50, 'RGBA', rawData2) 
>
> player_image.blit_into(rect, 0, 0, 0)
>
> ---
>
> When I display player_image, I only see the thin rectangle.  What am I 
> doing wrong?
>
> My goal is to change images for sprites during a simulation depending on 
> simulation events.  If you know a better way to accomplish this, I would 
> like to hear it.
>
> On Wednesday, March 11, 2020 at 7:49:46 PM UTC-4, Charles M wrote:
>>
>> Your images have no transparency (RGB). You need will need to specify an 
>> alpha channel to do transparency: RGBA and a fourth value for each pixel.
>>
>>
>> On Wednesday, March 11, 2020 at 5:57:27 PM UTC-5, Jonathon Parker wrote:
>>>
>>> In my test the images are the same size, but I thought the background 
>>> was transparent.  Any way to specify a background color is transparent?  Or 
>>> is there a better way to layer images?
>>>
>>> On Wednesday, March 11, 2020 at 6:44:00 PM UTC-4, Charles M wrote:
>>>>
>>>> This is normal behavior, blit overwrites the pixel data with new data 
>>>> you are providing. Which in this case is an entirely new image.
>>>>
>>>> On Wednesday, March 11, 2020 at 2:34:15 PM UTC-5, Jonathon Parker wrote:
>>>>>
>>>>> A minimal example
>>>>>
>>>>> # rawdata1 and rawdata2 are a list of c_ubytes
>>>>>
>>>>> my_texture_region = pyglet.image.ImageData(x, y, 'RGB', 
>>>>> rawdata1).get_texture()
>>>>> my_image = pyglet.image.ImageData(x, y, 'RGB', rawdata2)
>>>>> my_texture_region.blit_into(my_image, 0, 0, 0)
>>>>>
>>>>> When I create a sprite using my_texture region, I only see my_image.  
>>>>> What I want is my_image on top of my_texture_region.
>>>>>
>>>>> What am I doing wrong?
>>>>>
>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pyglet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyglet-users/c4de7ce4-6107-46a4-9ed3-b2b3636f7dd4%40googlegroups.com.

Reply via email to