找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 43|回复: 0

[其它] 裁剪图片可能出现边缘错误

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1. 起因
我以前写过一个单图序列帧cdd。
[RenPy] 纯文本查看 复制代码
# 单图序列帧动画组件
class SquenceAnimator2(renpy.Displayable):

    def __init__(self, img, row, column, interval, loop=True, **kwargs):
        super(SquenceAnimator2, self).__init__(**kwargs)
        # im入参是字符串,需要转为Image对象,获取尺寸信息
        self.img = Image(img)
        self.size = renpy.image_size(self.img)
        # 行数
        self.row = row
        # 列数
        self.column = column
        # 单帧宽度
        self.frame_width = int(self.size[0] / column)
        # 单帧高度
        self.frame_height = int(self.size[1] / row)
        # 序列帧长度
        self.length = row * column

        self.sequence = []
        # 循环嵌套切割单帧图像
        for i in range(row):
            for j in range(column):
                self.sequence.append(Crop((self.frame_width*j, self.frame_height*i, self.frame_width, self.frame_height), self.img))

        self.current_index = 0
        self.show_timebase = 0

        self.interval = interval
        self.loop = loop

    def render(self, width, height, st, at):
        # st为0时,表示组件重新显示
        if st == 0:
            self.show_timebase = 0
            self.current_index = 0
        if (st >= (self.show_timebase + self.interval)):
            self.show_timebase = st
            self.current_index += 1
            if self.current_index >= self.length:
                if self.loop:
                    self.current_index = 0
                else:
                    self.current_index = self.length - 1

        render = renpy.render(self.sequence[self.current_index], width, height, st, at)
        renpy.redraw(self, 0)

        return render

发现某些帧的右侧和底部边缘可能异常显示其他帧的左侧和顶部。反复检查图片资源和剪裁坐标后没有发现问题,实际原因始终未找到。

2. Ren'Py issue
Ren'Py Issue #6376
提出该issue的网友指出,在“change screen size(应该指修改屏幕分辨率)时,几种Crop方案的显示效果不同。

我用issue中提供的图片进行验证后发现,完整分辨率显示都没问题,小于项目设置分辨率使用Crop()则可能出现显示错误。
例如,项目分辨率为1920×1080,以1920×1080或更高分辨率的窗口(或全屏)运行可以正确显示,以1744×981分辨率的窗口运行时白色方块边缘会出现黑色。
renpytom回复说,该问题由“GPU缩放图像的处理方式导致”。但他没有解释 im.Crop() 始终能正确显示的原因。

3. 解决方案
可以直接无视……反正完整分辨率下可以正确显示。

强迫症患者可以使用 im.Crop() 进行裁剪。但 im.Crop() 被标记为deprecated,未来的某个Ren'Py版本也许就不能正常运行了。

3种crop方法的结果

3种crop方法的结果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2025-6-14 05:24 , Processed in 0.069772 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表