Compare commits

...
Author SHA1 Message Date
ae9b3e2b07
docs: add readme 2026-08-03 11:00:15 -07:00
e57c1c9322
fix: jxls being rotated twice 2026-08-01 10:22:41 -07:00
2 changed files with 52 additions and 2 deletions

39
README.md Normal file
View file

@ -0,0 +1,39 @@
# imagey
image viewer and maybe editor; inspired by mpv's simplicity
name is subject to change, suggestions welcome :)
## usage
```sh
# try it out!
nix run git+https://git.federated.nexus/electria/imagey
# install it imperatively
nix profile install git+https://git.federated.nexus/electria/imagey
```
## known issues
### JXL
1. encoding is not implemented (jxl-oxide is decoding-only)
2. oreintation is incorrect in some cases
if the image has metadata oreintation AND
it's a jxl without the right extension OR
it's a jpeg with the jxl extension
this is due to the JXL decoder automatically rotating the image,
while the JPEG decoder (for instance) requires the extra step.
my workaround is to check the path of the input file,
not changing the oreintation if it has the jxl extension;
causing these caveats for cases where the extension is wrong.
### clipboard
1. large images (eg photos) don't seem to copy on linux/wayland,
(despite set_image not returning any error)

View file

@ -1,5 +1,6 @@
use std::{
borrow::Cow,
ffi::OsStr,
path::{Path, PathBuf},
};
@ -11,7 +12,7 @@ pub fn load_image(path: impl AsRef<Path>) -> Result<RgbaImage, String> {
load_image_impl(path).map_err(|e| e.to_string())
}
fn load_image_impl(path: impl AsRef<Path>) -> ImageResult<RgbaImage> {
let mut decoder = ImageReader::open(path)?
let mut decoder = ImageReader::open(&path)?
.with_guessed_format()?
.into_decoder()?;
@ -19,7 +20,17 @@ fn load_image_impl(path: impl AsRef<Path>) -> ImageResult<RgbaImage> {
let mut decoded_image = DynamicImage::from_decoder(decoder)?;
decoded_image.apply_orientation(oreintation);
// the condition is a workaround to not rotate JXL images twice;
// since they are already rotated by the decoder
// (while jpegs for instance aren't)
if !path
.as_ref()
.extension()
.map(OsStr::to_string_lossy)
.is_some_and(|s| s == "jxl")
{
decoded_image.apply_orientation(oreintation);
}
Ok(decoded_image.into_rgba8())
}