Recently, I had to base64-encode an image::ImageBuffer
to send it as a data URL like
data:image/png;base64,iVBORw0KGgoAAAANSUhEU...
Initially, I tried this:
// Cargo.toml
image = "0.24.7"
base64 = "0.21.5"
use base64::{engine::general_purpose, Engine as _};
use image::ImageBuffer;
// WRONG: doesn't base64-encode image as PNG
let image: ImageBuffer<Rgba<u8>, Vec<u8>> = ...;
let b64 = general_purpose::STANDARD.encode(bytes);
println!("b64: {:?}", b64);
But the ImageBuffer
doesn’t store its pixels in PNG format, so the base64 string it returns won’t work inside a data URL.
Instead, we first need to create a separate buffer to write the image pixels as PNG, and then encode those bytes as base64:
use std::Cursor;
let image: ImageBuffer<Rgba<u8>, Vec<u8>> = ...;
let mut bytes: Vec<u8> = Vec::new();
image
.write_to(&mut Cursor::new(&mut bytes), image::ImageOutputFormat::Png)
.expect("Couldn't write image to bytes.");
let b64 = general_purpose::STANDARD.encode(bytes);
println!("b64: {:?}", b64);