Я использую пакет Piston image
для генерации изображений.
fn get_image() -> image::DynamicImage {
image::DynamicImage::ImageRgba8(image::ImageBuffer::new(512, 512))
}
У меня есть hyper
веб-сервер , с которого я бынравится обслуживать динамически генерируемые изображения.
Основано на ответе на Как создать объект в памяти, который можно использовать для чтения или записи в Rust? , Я думал, что смогу использовать Cursor<Vec<u8>>
в качестве пункта назначения.Однако image
, по-видимому, предоставляет только способ записи в имя файла, а не Writer
, как мой курсор.
После просмотра документации image
я надеялся, что может быть какой-то способиспользуйте image::png::PNGEncoder
struct напрямую.Предоставляет публичный метод encode(self, data: &[u8], width: u32, height: u32, color: ColorType) -> Result<()>
.Однако я не был уверен, каким должен быть аргумент data
, и я не смог найти никаких публичных объявлений ColorType
, используемых 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()),
))
}
КакЯ кодирую поршень GenericImage
в формат, подобный PNG, и получаю результат в памяти?