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 },

Reply via email to