准备并处理图片文件

  1. 选定一张图片,将其大小的长、宽调整为 16 的倍数,且格式为 .png。打印完成后每个方块都是 16x16 像素大小,所以要保证图片长、宽为完整的方块。
  2. http://phychi.com/gt/3d/printer.exe (可执行文件)或 http://phychi.com/gt/3d/printer.java (源码)处获取转换工具 printer.exe
  3. 将图片命名为 toprint.png,并和转换工具 printer.exe 共同放在桌面上(经实验,其它路径可能无效),双击启动转换工具 printer.exe
  4. 转码后的图片信息已经在剪贴板中,可以将其粘贴到任意文件。

准备 OC 系统及程序

  1. 在存档中建立一个能够运行的 OC 电脑,测试在全 T3 组件可以运行,其它配置未测试。需要连接一台充足变色材料和墨盒的 3D 打印机。视情况添加因特网卡以从网上获取相关资源。
  2. http://phychi.com/gt/3d/printer.lua 处获得程序代码 printer.lua,或者从本文中拷贝程序代码。本文中的代码较原作者做了部分修改。

打印像素画

  1. 将待处理图片文件 example.txt 保存到 OC 中,并与 printer.lua 放在同一目录下。此处 example.txt 名称可以任意选取。
  2. 运行命令 printer example.txt 'example' 命令,其中 example.txt 替换为待处理的图片文件名,'example' 替换为希望打印出的像素画的物品名称。
  3. 等待 3D 打印机逐个打印出像素画。像素画的顺序是从上到下、从左到右。

打印效果

图 1 打印效果

提示

  1. 命令 edit example.txt 可以创建或打开文件 example.txtCTRL-W 为关闭,CTRL-S 为保存,鼠标中键将系统剪贴板中的内容粘贴进去。
  2. 如果转码后的图片过长,可能鼠标中键无法粘贴,可以考虑上传到网上然后在 OC 中下载下来。
  3. 在安装因特网卡的情况下,OC 中 wget https://solitairemiya.cn/oc-pixelart/gtnh.txt 即可下载网络上的文件。
  4. 打印出的像素画需要自己按顺序手拼,如果像素画很大会比较牢。
  5. 打印出的像素画要及时利用管道抽取,否则可能会漏打,少打。

现有资源

图 2 gtnh (64x64) 链接
图 3 miyabi (480x256) 链接

OC 代码

和原版代码相比,添加了打印计数并输出的功能,同时在相邻两次打印之间加入 5 秒延迟,让管道能及时将打印出的图片抽走。

local component = require("component")
local shell = require("shell")
local fs = require("filesystem")

local printer = component.printer3d
local args = shell.parse(...)

-- we re intelligent -> make big images from one command possible
-- a + = new file

file = fs.open(args[1], "rb")
if not file then
io.write("No file named " .. args[1])
end

count = 1
n = file:read(1)
while n do
printer.reset()
printer.setLabel(args[2])
printer.setTooltip(args[3])
printer.setLightLevel(15)
printer.setRedstoneEmitter(false)
printer.setButtonMode(false)

while n and n~='+' do
-- n is the next char
x = tonumber(n, 16)
y = file:read(1)
l = file:read(1)
y = tonumber(y, 16)
l = tonumber(l, 16) + 1
printer.addShape(x, y, 15, x+1, y+l, 16, "opencomputers:White", false, tonumber(file:read(6), 16))
n = file:read(1)
end

printer.commit(1)
n = file:read(1)

print("count: " .. count)
count = count + 1

os.sleep(5)
en

参考