使用 Pyglet 将 gif 缩放到屏幕

Posted

技术标签:

【中文标题】使用 Pyglet 将 gif 缩放到屏幕【英文标题】:Using Pyglet to scale gif to screen 【发布时间】:2021-12-21 09:26:51 【问题描述】:

任何人都可以清楚地说明我的代码,为什么当我尝试将我的 gif 缩放到全屏时,一半的屏幕是白色的,而另一个是 gif(动画)?这是使用 Pyglet python 模块。

这是我的代码以及问题的图片:

'Load animation'
animation = pyglet.image.load_animation('Goober#13427G.gif')
animSprite = pyglet.sprite.Sprite(animation)

# 'Scale image to screen *harcoded*'
# animSprite.scale_x = 3.2
# animSprite.scale_y = 1.71

' Get display and create a fullscreen window while scaling gif to screen'
display = pyglet.canvas.Display()
screen = display.get_screens()

H_ratio = max(animSprite.height, screen[1].height) / min(animSprite.height, screen[1].height)
W_ratio = max(animSprite.width, screen[1].width) / min(animSprite.width, screen[1].width)

animSprite.scale = min(H_ratio, W_ratio) 

window = pyglet.window.Window(width=screen[1].width, height=screen[1].height, fullscreen=True, screen=screen[1])

r, g, b, alpha = 1, 1, 1, .5
pyglet.gl.glClearColor(r, g, b, alpha)


@window.event
def on_draw():
    window.clear()
    animSprite.draw()


pyglet.app.run()
```[Gif with second half of screen to the right is white][1]


  [1]: https://i.stack.imgur.com/JsbJy.jpg

【问题讨论】:

您好! gif应该与屏幕具有相同的格式? (16/9) 你希望 gif 被拉伸到屏幕格式还是切到顶部/底部? 我希望 gif 会根据显示器尺寸进行拉伸,比如说我使用 27" 显示器,它应该相应地成比例。我尝试将我用来显示 gif 的显示器放在纵向上模式,但它会导致相同的问题,即一半屏幕是白色的。 【参考方案1】:

尝试缩放每个轴。

animSprite.scale_x = W_ratio
animSprite.scale_y = H_ratio

【讨论】:

我在上面尝试了这个 sn-p,虽然它起作用了,但它确实造成了一些失真,目前我决定只保留一个合适的纵横比,而不是动画的角到角全屏拉伸. 您必须根据图像而不是窗口缩放比例,然后根据窗口定位和缩放比例。仅使用固定分辨率的组合可能更简单。查看此示例:github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/… 这似乎是我一直在寻找的答案!比我实际认为的更深入,但我试图弄清楚我现在将动画实际加载到其中的位置并替换给定的实际矩形动画 基本上你可以将rectangle.draw()替换为你的精灵/blitting图像/无论哪个。 我做了,但它仍然失真或被切断。一直在试图弄清楚影响是如何完成的,但我想用我的动画替换rectangle.draw( ),虽然它确实替换了它,但结果却非常不成比例

以上是关于使用 Pyglet 将 gif 缩放到屏幕的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的 pyglet 应用程序和所有资源编译到一个 exe 文件中?

如何使用pyglet保存当前视图矩阵

如何使用 opengl 和 pyglet 设置剪切平面

python-tkinter如何打开动图(.gif)?

Pyglet:全屏时如何更改分辨率?

IOS - 将背景图像缩放到不同的屏幕尺寸并将标签放在固定位置上