基于可以本地部署的图片显示模块

使用时将图片显示模块代码保存并命名为 image2lua.py,置于本篇代码同目录下

开发环境:python3.11.8 + pillow

使用时可以手动更改path, w, h也可以在控制台输入

运行完成后同级目录下出现out-gif.lua 文件名可以在入口处更改。

如果遇到文件过大无法通过游戏内导入的情况,可以手动拷贝至

*\.minecraft\*\saves\{存档名}\computercraft\computer\{电脑编号}\

目录下。

测试图像:

可以本地部署的gif显示模块-第1张图片

连接显示器后在显示器上显示

(为了本地上传牺牲了画质的示例)

可以本地部署的gif显示模块-第2张图片

没剪的示例(图源GitHub,没加载出来属于正常现象)


可以本地部署的gif显示模块-第3张图片示例

如何获取图像宽和高:

在显示平台(外接显示器就是在显示器内)执行

term.getSize()

即可获取w, h (宽高)

完整代码:

from PIL import Image
import textwrap
from image2lua import main, list_sub, head, line


def open_gif(path, iw, ih, name):
    out : list[tuple[Image, int]] = []
    gif = Image.open(path)

    with open(f"{name}-gif.lua", 'w+') as file:

        for _ in range(gif.n_frames):
            line("处理图片", _+1, gif.n_frames)
            gif.seek(_)
            delay = gif.info['duration']
            img = Image.new("RGB", gif.size)
            img.paste(gif, (0, 0))
            # print(list(img.getdata()))
            file.write(f"function F{_}()\n")
            # '''
            f_co, b_co, te = main(img, iw, ih)
            for i in range(len(f_co)):
                f = f_co[i]
                b = b_co[i]
                t = te[i]
                t = textwrap.wrap(t, 2)
                file.write('term.scroll(-1)\nterm.setCursorPos(1,1)\n')
                file.write(f"term.blit('{list_sub([head + x for x in t])}', '{f}', '{b}')\n")
            file.write(f'os.sleep({delay/1000})\n')
            file.write("end\n")
            # '''
        file.write("while(0)\ndo\n")
        for _ in range(gif.n_frames):
            file.write(f"F{_}()\n")
        file.write("end\n")


path = None
w = None
h = None


if __name__ == "__main__":
    if path is None:
        path = input("输入图片完整路径")
    if w is None or h is None:
        w, h = int(*input("输入图片宽高,以空格分割").split(" "))
    open_gif(path, w, h, 'out')

PS:环境问题见原教程,不想多个文件可以手动替换模块