1个不稳定版本
0.1.0 | 2024年7月31日 |
---|
131在数据格式中
119每月下载次数
56KB
1K SLoC
goo
用于编码和解码Elegoo的.goo
文件格式的库。这是从我的mslicer项目中提取的独立版本,它是一个开源的掩模立体光刻打印机切片器。
如果您想了解更多关于goo格式的信息,请确保您阅读了官方格式规范。规范中没有提到一些事情,比如所有内容都是大端字节序,校验和只是有效载荷中所有字节的负和,图像数据编码规范难以理解,因此请查看我的实现。此外,如果您使用ImHex,我创建了一个模式文件(goo.hexpat),这可能有助于。
示例
对于一些现实世界的示例,请查看以下链接到我的mslicer项目源代码
编码图像
由于成千上万的非常高的分辨率图像需要许多十吉字节来存储,goo文件使用运行长度编码机制作为简单的压缩形式。因此,要将图像编码到goo层中,您必须首先将其分离成运行。在这个例子中,我将只是添加黑白交替的行。
需要注意的是,您必须为每个像素定义一个值。这是因为在我打印机的至少一个例子中,每个层解码到的缓冲区是未初始化的内存。因此,如果最后一个运行没有填满缓冲区,打印机将只打印缓冲区中之前的内容,这只会造成巨大的混乱。
use goo::{LayerEncoder, LayerDecoder, Run};
let size = (11520, 5102);
let mut out = LayerEncoder::new();
for y in 0..size.1 {
let color = if y % 2 == 0 { 255 } else { 0 };
out.add_run(size.0, color);
}
let (bytes, checksum) = out.finish();
let decoder = LayerDecoder::new(&bytes);
assert_eq!(checksum, decoder.checksum());
for run in decoder {
println!("{:?}", run);
}
图像解码
此示例是包含示例的简化版本,用于检查切片 goo 文件。请注意,逐个设置每个像素并不很快,但对于调试工具来说已经足够了。
use std::fs;
use goo::{GooFile, LayerDecoder, Run};
use image::RgbImage;
let raw_goo = fs::read("input.goo")?;
let goo = GooFile::deserialize(&raw_goo)?;
println!("{:#?}", goo.header);
for (i, layer) in goo.layers.iter().enumerate() {
let decoder = LayerDecoder::new(&layer.data);
let mut pixel = 0;
if layer.checksum != decoder.checksum() {
eprintln!("WARN: Checksum mismatch for layer {}", i);
}
let mut image = RgbImage::new(
goo.header.x_resolution as u32,
goo.header.y_resolution as u32,
);
for Run { length, value } in decoder {
let color = image::Rgb([value, value, value]);
for _ in 0..length {
let x = pixel % goo.header.x_resolution as u32;
let y = pixel / goo.header.x_resolution as u32;
image.put_pixel(x, y, color);
pixel += 1;
}
}
image.save(format!("layer_{:03}.png", i))?;
}
依赖项
~0.1–0.9MB
~16K SLoC