Opengl 使用pyglet使部分图像透明

Opengl 使用pyglet使部分图像透明,opengl,pyglet,Opengl,Pyglet,我有两张图片,“沙漠”图片和“冬天”图片: 结果是: 我想在沙漠图像上画一个“透明”的正方形(冬季图像应该在这个正方形中可见)。可能吗?怎么做 我发现了很多问题,谁允许图像本身透明(png、alpha…但不是我想要的)。基于扭曲的建议,在我们想要透明的地方,用透明字节替换图像内容: import io from PIL import Image import pyglet from PIL.PngImagePlugin import PngImageFile def replace_cont

我有两张图片,“沙漠”图片和“冬天”图片:

结果是:

我想在沙漠图像上画一个“透明”的正方形(冬季图像应该在这个正方形中可见)。可能吗?怎么做


我发现了很多问题,谁允许图像本身透明(png、alpha…但不是我想要的)。

基于扭曲的建议,在我们想要透明的地方,用透明字节替换图像内容:

import io
from PIL import Image
import pyglet
from PIL.PngImagePlugin import PngImageFile


def replace_content_with_transparency(img: PngImageFile, x, y, width, height):
    pixels = img.load()
    for i in range(x, width):
        for j in range(y, height):
            pixels[i, j] = (0, 0, 0, 0)


desert_png = Image.open('assets/desert.png')
replace_content_with_transparency(desert_png, 32, 32, 123, 123)

fake_file = io.BytesIO()
desert_png.save(fake_file, format='PNG')

desert_img = pyglet.image.load('img.png', file=fake_file)
desert = pyglet.sprite.Sprite(desert_img, x=50, y=50)

winter_img = pyglet.image.load('assets/winter.jpg')
winter = pyglet.sprite.Sprite(winter_img, x=0, y=0)

window = pyglet.window.Window()


@window.event
def on_draw():
    winter.draw()
    desert.draw()

pyglet.app.run()

当然,这是可能的:)
data=deset.get\u image\u data();数据=b'\x00\x00\x00\x00'+数据[4:];deset.image=数据
。将第一个像素替换为透明的黑色像素。(每个像素有4个字节长,RGB和一个Alpha字节。
\x00
==0,这意味着在Alpha land中它是透明的。)因此,我们的想法是在需要透明的地方更新沙漠图像。好主意!我会处理它。@Torxed EDIT:请原谅此评论:图像不包含alpha通道(添加了gimp)Hm,只需将字节替换为
x00
在我的脚本中不工作(结果)缺少什么?
import io
from PIL import Image
import pyglet
from PIL.PngImagePlugin import PngImageFile


def replace_content_with_transparency(img: PngImageFile, x, y, width, height):
    pixels = img.load()
    for i in range(x, width):
        for j in range(y, height):
            pixels[i, j] = (0, 0, 0, 0)


desert_png = Image.open('assets/desert.png')
replace_content_with_transparency(desert_png, 32, 32, 123, 123)

fake_file = io.BytesIO()
desert_png.save(fake_file, format='PNG')

desert_img = pyglet.image.load('img.png', file=fake_file)
desert = pyglet.sprite.Sprite(desert_img, x=50, y=50)

winter_img = pyglet.image.load('assets/winter.jpg')
winter = pyglet.sprite.Sprite(winter_img, x=0, y=0)

window = pyglet.window.Window()


@window.event
def on_draw():
    winter.draw()
    desert.draw()

pyglet.app.run()