From 6d04d3065e3e4c9a7d8befdb6ead797a9fba18de Mon Sep 17 00:00:00 2001 From: Jordan Doyle Date: Wed, 3 Jan 2024 19:49:29 +0000 Subject: [PATCH] Trim padding from artist logos --- shalom/src/pages/room/listen.rs | 8 ++++++-- shalom/src/subscriptions.rs | 7 +++---- shalom/src/theme.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/shalom/src/pages/room/listen.rs b/shalom/src/pages/room/listen.rs index 7f30573..4169f83 100644 --- a/shalom/src/pages/room/listen.rs +++ b/shalom/src/pages/room/listen.rs @@ -12,7 +12,7 @@ use crate::{ hass_client::MediaPlayerRepeat, oracle::{MediaPlayerSpeaker, MediaPlayerSpeakerState, Oracle, Room}, subscriptions::{download_image, find_fanart_urls, find_musicbrainz_artist, MaybePendingImage}, - theme::darken_image, + theme::{darken_image, trim_transparent_padding}, widgets, }; @@ -209,7 +209,11 @@ impl Listen { }; let logo_subscription = if let Some(MaybePendingImage::Loading(url)) = &self.artist_logo { - download_image(url.clone(), identity, Message::ArtistLogoDownloaded) + download_image( + url.clone(), + trim_transparent_padding, + Message::ArtistLogoDownloaded, + ) } else { Subscription::none() }; diff --git a/shalom/src/subscriptions.rs b/shalom/src/subscriptions.rs index 3a6c05a..222710f 100644 --- a/shalom/src/subscriptions.rs +++ b/shalom/src/subscriptions.rs @@ -1,6 +1,5 @@ use std::num::NonZeroUsize; -use ::image::GenericImageView; use iced::{futures::stream, subscription, widget::image, Subscription}; use lru::LruCache; use once_cell::sync::Lazy; @@ -51,10 +50,10 @@ pub fn download_image( let handle = tokio::task::spawn_blocking(move || { eprintln!("parsing image"); let img = ::image::load_from_memory(&bytes).unwrap(); - let (h, w) = img.dimensions(); eprintln!("post processing"); - let data = post_process(img.into_rgba8()).into_raw(); - image::Handle::from_pixels(h, w, data) + let data = post_process(img.into_rgba8()); + let (h, w) = data.dimensions(); + image::Handle::from_pixels(h, w, data.into_raw()) }) .await .unwrap(); diff --git a/shalom/src/theme.rs b/shalom/src/theme.rs index 12a6910..89fb405 100644 --- a/shalom/src/theme.rs +++ b/shalom/src/theme.rs @@ -1,4 +1,4 @@ -use ::image::{GenericImageView, Pixel, Rgba, RgbaImage}; +use ::image::{imageops, GenericImageView, Pixel, Rgba, RgbaImage}; use iced::{ advanced::svg::Handle, widget::{image, svg}, @@ -202,3 +202,53 @@ pub fn blur(img: &RgbaImage, radius: usize) -> RgbaImage { image } + +pub fn trim_transparent_padding(mut image: RgbaImage) -> RgbaImage { + let (width, height) = image.dimensions(); + let mut top = 0; + let mut bottom = height; + let mut left = 0; + let mut right = width; + + 'outer: for y in 0..height { + for x in 0..width { + let pixel = image.get_pixel(x, y); + if pixel[3] != 0 { + top = y; + break 'outer; + } + } + } + + 'outer: for y in (top..height).rev() { + for x in 0..width { + let pixel = image.get_pixel(x, y); + if pixel[3] != 0 { + bottom = y + 1; + break 'outer; + } + } + } + + 'outer: for x in 0..width { + for y in top..bottom { + let pixel = image.get_pixel(x, y); + if pixel[3] != 0 { + left = x; + break 'outer; + } + } + } + + 'outer: for x in (left..width).rev() { + for y in top..bottom { + let pixel = image.get_pixel(x, y); + if pixel[3] != 0 { + right = x + 1; + break 'outer; + } + } + } + + imageops::crop(&mut image, left, top, right - left, bottom - top).to_image() +} -- libgit2 1.7.2