使用Pyglet将GIF缩放至全屏时仅半屏显示另一半空白问题求助
问题修复方案
核心问题原因
- 缩放比例计算逻辑错误:原有
max(值1,值2)/min(值1,值2)的计算方式只能得到两个值的倍数差,无法正确区分原图大于/小于屏幕的场景,会导致缩放后动图尺寸不符合预期。 - 缺少动图居中偏移逻辑:Pyglet的Sprite默认锚点为左下角,默认绘制位置为坐标原点(0,0),缩放后的动图如果尺寸小于屏幕,就会在右侧和上侧留出空白区域。
- 可选检查:如果你只有1台显示器,
screen[1]会取到不存在的第二屏参数,也可能导致尺寸计算错误。
修复后代码
import pyglet # 加载动图 animation = pyglet.image.load_animation('Goober#13427G.gif') animSprite = pyglet.sprite.Sprite(animation) # 获取屏幕参数 display = pyglet.canvas.Display() screens = display.get_screens() # 单显示器请把下方的screens[1]改为screens[0] target_screen = screens[1] # 正确计算等比适配比例,保证动图不超出屏幕 scale_w = target_screen.width / animSprite.width scale_h = target_screen.height / animSprite.height animSprite.scale = min(scale_w, scale_h) # 创建全屏窗口 window = pyglet.window.Window(width=target_screen.width, height=target_screen.height, fullscreen=True, screen=target_screen) # 调整动图位置到屏幕居中 animSprite.x = (window.width - animSprite.width) / 2 animSprite.y = (window.height - animSprite.height) / 2 # 设置背景为白色 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()
额外注意事项
如果你的设备开启了系统级显示缩放(比如Windows的125%缩放、Mac的HiDPI模式),需要额外获取屏幕的缩放系数调整比例,避免出现模糊或者尺寸不对的问题。
内容的提问来源于stack exchange,提问作者Daniel Morales
相关产品推荐
相关产品推荐

