use anyhow::{Error, Result}; use img_parts::{jpeg::Jpeg, Bytes, ImageEXIF}; use serde::{Deserialize, Serialize}; use sp_client::bitcoin::secp256k1::SecretKey; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BackUpImage(Vec); impl BackUpImage { pub fn new_recover(image: Vec, data: &[u8]) -> Result { // TODO: sanity check on data let img = write_exif(image, data)?; Ok(Self(img)) } pub fn new_revoke(image: Vec, data: &[u8]) -> Result { // TODO: sanity check on data let img = write_exif(image, data)?; Ok(Self(img)) } pub fn to_inner(&self) -> Vec { self.0.clone() } pub fn as_inner(&self) -> &[u8] { &self.0 } } fn write_exif(image: Vec, data: &[u8]) -> Result> { let mut jpeg = Jpeg::from_bytes(Bytes::from(image))?; let data_bytes = Bytes::from(data.to_owned()); jpeg.set_exif(Some(data_bytes)); let output_image_bytes = jpeg.encoder().bytes(); let output_image = output_image_bytes.to_vec(); Ok(output_image) }