diff --git a/src/main.rs b/src/main.rs index 3e65e8d..9ac79ed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,6 @@ enum Message { #[derive(Clone, Debug, Default)] struct State { - image: Option, image_display: Option, image_filter: widget::image::FilterMethod, @@ -168,8 +167,7 @@ impl State { if image.dimensions() < (100, 100) { self.image_filter = widget::image::FilterMethod::Nearest; } - self.image = Some(image); - self.allocate_image() + self.allocate_image(image) }) } fn pick_and_load_image(&mut self) -> Result, String> { @@ -180,16 +178,11 @@ impl State { self.error = utils::save_image(self.image.as_ref()).err(); } - fn allocate_image(&self) -> Task { - let Some(image) = self.image.as_ref() else { - eprintln!("no image to allocate"); - return Task::none(); - }; - + fn allocate_image(&self, image: RgbaImage) -> Task { widget::image::allocate(widget::image::Handle::from_rgba( image.width(), image.height(), - unsafe { std::mem::transmute::<&[u8], &'static [u8]>(image.as_bytes()) }, + image.into_vec(), )) .map(Message::ImageDisplayReady) } diff --git a/src/utils.rs b/src/utils.rs index dafd1f2..c59c7e7 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -4,6 +4,18 @@ use iced::widget; use image::{DynamicImage, ImageDecoder, ImageReader, ImageResult, RgbaImage}; use rfd::FileDialog; +pub fn image_from_handle(handle: widget::image::Handle) -> RgbaImage { + match handle { + widget::image::Handle::Rgba { + id, + width, + height, + pixels, + } => RgbaImage::from_raw(width, height, pixels.as_ref()).unwrap(), + _ => panic!("handle should always hold rgba data"), + } +} + pub fn load_image(path: impl AsRef) -> Result { _load_image(path).map_err(|e| e.to_string()) }