Trim padding from artist logos
Diff
shalom/src/subscriptions.rs | 7 +++----
shalom/src/theme.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
shalom/src/pages/room/listen.rs | 8 ++++++--
3 files changed, 60 insertions(+), 7 deletions(-)
@@ -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 @@
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();
@@ -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},
@@ -201,4 +201,54 @@
}
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()
}
@@ -12,7 +12,7 @@
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 @@
};
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()
};