我如何从 image::ImageBuffer 变成 actix_web::HttpResponse

How do I get from an image::ImageBuffer to a actix_web::HttpResponse

目标是使用 crate qrcode 生成二维码并立即将其作为 png 文件发送以供使用 actix-web

下载

到目前为止我有:

let qr = QrCode::new(&format!("http://example.com/{}", &link_id)).unwrap();
let png: ImageBuffer<Luma<u8>, Vec<u8>> = qr.render::<Luma<u8>>().build();

其中包含二维码。我可以使用它的 .save() 方法将其保存到文件中。但理想情况下,我不会承担这些开销,而是立即发送文件。但是我未能将正确的数据传递给 actix-web.

我尝试了以下编译但确实只发送了无法查看的错误图像:

HttpResponse::Ok()
                .set(ContentType::png())
                .body(Bytes::from(png.into_raw()))

像这样:

    let qr = QrCode::new("http://example.com/xyz").unwrap();
    let png: ImageBuffer<Luma<u8>, Vec<u8>> = qr.render::<Luma<u8>>().build();
    let mut w = Cursor::new(Vec::new());
    DynamicImage::ImageLuma8(png)
        .write_to(&mut w, ImageOutputFormat::Png)
        .unwrap();
    let vec = w.into_inner();
    // vec now contains the PNG bytes