我如何从 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
目标是使用 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