首页 > 解决方案 > 如何对 Rust Piston 图像进行编码并在内存中获取结果?

问题描述

我正在使用Pistonimage生成图像。

fn get_image() -> image::DynamicImage {
    image::DynamicImage::ImageRgba8(image::ImageBuffer::new(512, 512))
}

我有一个hyper网络服务器,我想从中提供动态生成的图像。

基于如何在 Rust 中创建可用作 Reader 或 Writer 的内存对象的答案?,我想我也许可以使用 aCursor<Vec<u8>>作为目的地。但是,image似乎只提供了一种写入文件名的方法,而不是Writer像我的光标。

在查看了image的文档后,我希望可能有一些方法可以直接使用image::png::PNGEncoder结构。它提供了一个公共方法encode(self, data: &[u8], width: u32, height: u32, color: ColorType) -> Result<()>。但是,我不确定该data论点应该是什么,并且我找不到ColorType. 使用的 s 的任何公开声明ImageBuffer

(&Get, "/image.png") => {
    let v = {
        let generated = get_image();
        let mut encoded_image = Cursor::new(Vec::new());
        let (width, heigth) = generated.dimensions();
        {
            let encoder = image::png::PNGEncoder::new(&encoded_image);
            encoder.encode(unimplemented!("what goes here?"));
        }
        encoded_image.get_mut()
    };

    Box::new(futures::future::ok(
        Response::new()
            .with_header(ContentLength(v.len() as u64))
            .with_body(v.clone()),
    ))
}

如何将活塞编码为GenericImagePNG 等格式并将结果存储在内存中?

标签: imagerustrust-piston

解决方案


fn getImage() -> image::DynamicImage 

你有一个DynamicImage.

图像似乎只提供了一种写入文件名的方法

我假设你的意思是DynamicImage::save

之前的方法savewrite_to

pub fn write_to<W: Write, F: Into<ImageOutputFormat>>(
    &self, 
    w: &mut W, 
    format: F
) -> ImageResult<()>

这接受任何通用作家:

let mut buf = Vec::new();

get_image()
    .write_to(&mut buf, image::ImageOutputFormat::PNG)
    .expect("Unable to write");

不需要Cursor.


如何将活塞编码为GenericImagePNG 等格式?

我不知道最好的方法来做到这一点。我可能会将通用图像复制到 a 中DynamicImage,然后按照上述说明进行操作。


推荐阅读