croptool

Image cropping tool
git clone git://lumidify.org/croptool.git
Log | Files | Refs | README

commit 0eccd55570f34853180ebda08d28dc18f5ddbdaa
parent 3c5129b4e685e8e098026434ea5e5807050dc18e
Author: lumidify <nobody@lumidify.org>
Date:   Tue,  5 May 2020 18:06:09 +0200

Allow to resize the image with space bar

Diffstat:
MREADME | 29++++++++++++++++-------------
Mcroptool.c | 27++++++++++++++++++++++-----
2 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/README b/README @@ -20,21 +20,24 @@ in the middle, you can move it. Clicking outside creates a new box. I don't know if all of the collision logic is entirely correct, so tell me if you notice any problems. -Four keys are recognized: enter/return, delete, right arrow, and left arrow. -Enter and right arrow both go to the next image, but enter copies the -selection box from the current image and uses it for the next picture, -while right arrow just goes to the next image and only displays a -selection box if it already had one. This is so that lots of pages -of a digitized book can be cropped quickly since the selection box -needs to be tweaked occasionally (since my digitizing equipment, if it -can be called that, isn't exactly very professional). Left arrow -just goes to the last picture. Delete removes the selection for the -current image (this is then also not printed out at the end). +Several keys are recognized: +* Enter and right arrow both go to the next image, but enter copies the + selection box from the current image and uses it for the next picture, + while right arrow just goes to the next image and only displays a + selection box if it already had one. This is so that lots of pages + of a digitized book can be cropped quickly since the selection box + needs to be tweaked occasionally (my digitizing equipment, if it + can be called that, isn't exactly very professional). +* Left arrow just goes to the previous picture. +* Delete removes the selection for the current image (this is then + also not printed out at the end). +* Space bar resizes the image if the window was resized. Note that resizing the window currently does not resize the images. -It will only take effect if you move to another image. There may be -bugs lurking here as well since the actual cropping box needs to be -scaled according to how much the image was scaled for display. +It will only take effect if you move to another image or press +space bar. There may be bugs lurking here as well since the actual +cropping box needs to be rescaled according to how much the image +was scaled for display. When the window is closed, the ImageMagick command (mogrify -crop...) for cropping each of the pictures that had a selection box defined diff --git a/croptool.c b/croptool.c @@ -91,6 +91,7 @@ static void last_picture(GtkWidget *area, struct State *state); static GdkPixbuf *load_pixbuf(char *filename, int w, int h, int *actual_w, int *actual_h); static void print_selection(struct Selection *sel, const char *filename); static void clear_selection(GtkWidget *area, struct State *state); +static void resize_manual(GtkWidget *area, struct State *state); int main(int argc, char *argv[]) { GtkWidget *window; @@ -456,18 +457,18 @@ change_picture( } else if (!sel) { /* Just fill it with -200 so we can check later if it has been used yet */ sel = create_selection(-200, -200, -200, -200, orig_w, orig_h, actual_w, actual_h); - } else if (sel->rect.x0 != -200) { + } else if (sel->rect.x0 != -200 && actual_w != sel->scaled_w) { /* If there is a selection, we need to convert it to the new scale. - * This only takes width into account because the - * aspect ratio should have been preserved anyways */ + * This only takes width into account because the aspect ratio + * should have been preserved anyways */ double scale = (double)actual_w / sel->scaled_w; sel->rect.x0 = round(sel->rect.x0 * scale); sel->rect.y0 = round(sel->rect.y0 * scale); sel->rect.x1 = round(sel->rect.x1 * scale); sel->rect.y1 = round(sel->rect.y1 * scale); - sel->scaled_w = actual_w; - sel->scaled_h = actual_h; } + sel->scaled_w = actual_w; + sel->scaled_h = actual_h; state->selections[state->cur_selection] = sel; gtk_widget_queue_draw(area); } @@ -520,6 +521,19 @@ clear_selection(GtkWidget *area, struct State *state) { gtk_widget_queue_draw(area); } +static void +resize_manual(GtkWidget *area, struct State *state) { + if (state->cur_selection < 0 || !state->selections[state->cur_selection]) + return; + int orig_w, orig_h; + GdkPixbuf *tmp_pixbuf = load_pixbuf( + state->filenames[state->cur_selection], + state->window_w, state->window_h, &orig_w, &orig_h); + if (!tmp_pixbuf) + return; + change_picture(area, tmp_pixbuf, state->cur_selection, orig_w, orig_h, state, FALSE); +} + static gboolean key_press(GtkWidget *area, GdkEventKey *event, gpointer data) { struct State *state = (struct State *)data; @@ -536,6 +550,9 @@ key_press(GtkWidget *area, GdkEventKey *event, gpointer data) { case GDK_KEY_Delete: clear_selection(area, state); break; + case GDK_KEY_space: + resize_manual(area, state); + break; } return FALSE; }