1个不稳定版本

0.1.0 2024年7月31日

131数据格式

Download history 115/week @ 2024-07-28 4/week @ 2024-08-04

119每月下载次数

MIT许可协议

56KB
1K SLoC

goo

Build Latest Version Downloads

用于编码和解码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