使用pyglet使部分图像透明
Make part of image transparent with pyglet
我有两张图片,“沙漠”图片和“冬天”图片:
import pyglet
desert_img = pyglet.image.load('assets/desert.jpg')
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()
结果是:
我想在沙漠图像上画一个“透明”的正方形(冬季图像应该在这个正方形中可见)。可能吗 ?怎么做?
我发现很多问题允许对图像本身进行透明处理(png、alpha ...但不是我想要的)。
根据 Torxed 的建议,将图像内容替换为我们希望使其透明的透明字节:
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()
我有两张图片,“沙漠”图片和“冬天”图片:
import pyglet
desert_img = pyglet.image.load('assets/desert.jpg')
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()
结果是:
我想在沙漠图像上画一个“透明”的正方形(冬季图像应该在这个正方形中可见)。可能吗 ?怎么做?
我发现很多问题允许对图像本身进行透明处理(png、alpha ...但不是我想要的)。
根据 Torxed 的建议,将图像内容替换为我们希望使其透明的透明字节:
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()