tor 2023-08-17 10:19:01 skrev Max Schillinger: > On Tue Jul 4, 2023 at 3:51 PM CEST, NRK wrote: > > sx4 > > === > > > > This one is a selection tool. It outputs the selection rectangle to > > stdout which can then be used for other purposes, such as screenshoting > > or screen-recording a specific area. > > All these tools are great! Thanks for sharing. > > I don't do much image processing but when I do, it's most often cropping > images. Of course, GIMP can do this. But it's huge. I usually use nomacs > instead. But now the nomacs package for Arch Linux is broken because of > dependencies. Now I use gThumb as a replacement but it's also big. > > When I heard about sx4, I was wondering if it's somehow possible to > connect sxiv, sx4 and ImageMagick. I could open an image with sxiv (or > feh or something simple) without any zoom, then I could select a region > with sx4 and pass it to ImageMagick. For this I would have to correct > the coordinates by the offset of the canvas relative to the screen. This > seems to be the missing link. > > Any ideas how to achieve this?
I think this can be done with (image|graphics)magick import, simply `import cropped.png` and select the region you want. I do a lot of cropping using some ugly hacks, attached diff is for nsxiv master and uses ctrl-q to crop the active image to what is currenly visible, regardless of zoom (a 100x100 window at 400% zoom will give a 25x25 image). (Replace 'mogrify -crop' with some wrapper script if you don't want to accidentally destroy images..) > > Regards, > Max > diff --git a/commands.c b/commands.c index 97cadf2..ff80201 100644 --- a/commands.c +++ b/commands.c @@ -253,6 +253,24 @@ bool cg_change_contrast(arg_t d) return change_color_modifier(d, &img.contrast); } +bool ci_crop(arg_t _) +{ + char geo[64]; + char *argv[5]; + int x, y, w, h; + + x = MAX(0, -img.x / img.zoom); + y = MAX(0, -img.y / img.zoom); + w = MIN(img.w, win.w / img.zoom); + h = MIN(img.h, win.h / img.zoom); + if (x == 0 && y == 0 && w == img.w && h == img.h) + return false; + construct_argv(argv, ARRLEN(argv), "mogrify", "-crop", geo, files[fileidx].path, NULL); + waitpid(spawn(NULL, NULL, argv), NULL, 0); + img.dirty = true; + return true; +} + bool ci_navigate(arg_t n) { if (prefix > 0) diff --git a/commands.h b/commands.h index 4e694f0..530c363 100644 --- a/commands.h +++ b/commands.h @@ -25,6 +25,7 @@ bool cg_unmark_all(arg_t); bool cg_zoom(arg_t); /* image mode */ bool ci_alternate(arg_t); +bool ci_crop(arg_t); bool ci_cursor_navigate(arg_t); bool ci_drag(arg_t); bool ci_fit_to_win(arg_t); @@ -72,6 +73,7 @@ bool ct_select(arg_t); /* image mode */ #define i_alternate { ci_alternate, MODE_IMAGE } +#define i_crop { ci_crop, MODE_IMAGE } #define i_cursor_navigate { ci_cursor_navigate, MODE_IMAGE } #define i_drag { ci_drag, MODE_IMAGE } #define i_fit_to_win { ci_fit_to_win, MODE_IMAGE } diff --git a/config.def.h b/config.def.h index 7fbfb17..c530e8a 100644 --- a/config.def.h +++ b/config.def.h @@ -137,6 +137,7 @@ static const keymap_t keys[] = { { 0, XK_Right, t_move_sel, DIR_RIGHT }, { 0, XK_R, t_reload_all, None }, + { ControlMask, XK_q, i_crop, None }, { 0, XK_n, i_navigate, +1 }, { 0, XK_n, i_scroll_to_edge, DIR_LEFT | DIR_UP }, { 0, XK_space, i_navigate, +1 },