bookcrop

Miscellaneous tools for digitizing books
git clone git://lumidify.org/git/bookcrop.git
Log | Files | Refs

commit bfca4c3c38220fc2346f9db128d6e379dbcd8edf
Author: lumidify <nobody@lumidify.org>
Date:   Fri, 21 Feb 2020 14:18:51 +0100

Initial Commit

Diffstat:
A.lumidify_archive_cksums | 6++++++
A.lumidify_archive_cksums.cksum | 2++
A.lumidify_archive_dirs | 0
Acrop.py | 205+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aeverysecond.pl | 22++++++++++++++++++++++
Afehs.sh | 4++++
Afromto.pl | 20++++++++++++++++++++
Asort.pl | 15+++++++++++++++
Asort2.pl | 23+++++++++++++++++++++++
9 files changed, 297 insertions(+), 0 deletions(-)

diff --git a/.lumidify_archive_cksums b/.lumidify_archive_cksums @@ -0,0 +1,6 @@ +26771784 73 "fehs.sh" +2159480273 272 "sort.pl" +762405641 262 "fromto.pl" +4116778262 264 "everysecond.pl" +829533685 5185 "crop.py" +1461577717 468 "sort2.pl" diff --git a/.lumidify_archive_cksums.cksum b/.lumidify_archive_cksums.cksum @@ -0,0 +1,2 @@ +2885505858 156 ".lumidify_archive_cksums" +4294967295 0 ".lumidify_archive_dirs" diff --git a/.lumidify_archive_dirs b/.lumidify_archive_dirs diff --git a/crop.py b/crop.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python3 + +# WARNING: CRAP CODE!!! +# just generate list filled with None in beginning + +import sys +import tkinter +from PIL import ImageTk, Image + +if len(sys.argv) < 2: + print("No images specified") + sys.exit(1) + +cur_img = 1 + +dragging = False +dragging_rect = False +x_orig = 0 +y_orig = 0 +x_new = 0 +y_new = 0 +x_grab = 0 +y_grab = 0 +x_drag_offset = 0 +y_drag_offset = 0 + +# First None is ignored since cur_img is always one ahead (first arg is script name) +coords = [None, None] +img_sizes = [None] + +def rect_intersect(x1, y1, x2, y2, x_point, y_point): + if x1 > x2: + tmp = x1 + x1 = x2 + x2 = tmp + if y1 > y2: + tmp = y1 + y1 = y2 + y2 = tmp + return x1 <= x_point <= x2 and y1 <= y_point <= y2 + +def press(event): + global dragging, dragging_rect, x_orig, y_orig, x_grab, y_grab, x_new, y_new, x_drag_offset, y_drag_offset + if abs(x_orig - event.x) < 15 and abs(y_orig - event.y) < 15: + dragging = True + x_drag_offset = x_orig - event.x + y_drag_offset = y_orig - event.y + x_orig = x_new + y_orig = y_new + x_new = event.x + y_new = event.y + elif abs(x_new - event.x) < 15 and abs(y_new - event.y) < 15: + dragging = True + x_drag_offset = x_new - event.x + y_drag_offset = y_new - event.y + elif rect_intersect(x_orig, y_orig, x_new, y_new, event.x, event.y): + dragging_rect = True + x_grab = event.x + y_grab = event.y + else: + dragging = True + x_orig = event.x + y_orig = event.y + x_drag_offset = 0 + y_drag_offset = 0 + +def motion(event): + global dragging, dragging_rect, x_orig, y_orig, x_new, y_new, x_grab, y_grab + if dragging: + x_new = event.x + x_drag_offset + y_new = event.y + y_drag_offset + elif dragging_rect: + x_delta = event.x - x_grab + y_delta = event.y - y_grab + x_grab = event.x + y_grab = event.y + x_orig += x_delta + x_new += x_delta + y_orig += y_delta + y_new += y_delta + event.widget.create_rectangle(x_orig, y_orig, x_new, y_new) + +def release(event): + global dragging, dragging_rect, tkimg, x_orig, y_orig, x_new, y_new + if dragging: + dragging = False + x_new = event.x + x_drag_offset + y_new = event.y + y_drag_offset + elif dragging_rect: + dragging_rect = False + x_delta = event.x - x_grab + y_delta = event.y - y_grab + x_orig += x_delta + x_new += x_delta + y_orig += y_delta + y_new += y_delta + event.widget.create_image(0, 0, anchor=tkinter.NW, image=tkimg) + event.widget.create_rectangle(x_orig, y_orig, x_new, y_new) + +def print_exit(*args): + global cur_img + cur_img = -1 + for c in coords: + cur_img += 1 + if c == None: + continue + x_scale = img_sizes[cur_img][0] / img_sizes[cur_img][2] + y_scale = img_sizes[cur_img][1] / img_sizes[cur_img][3] + x1 = min(c[0], c[2]) + x2 = max(c[0], c[2]) + y1 = min(c[1], c[3]) + y2 = max(c[1], c[3]) + w_crop = x_scale * (x2 - x1); + h_crop = y_scale * (y2 - y1); + x_offset = x_scale * x1; + y_offset = y_scale * y1; + print("mogrify -crop " + str(round(w_crop)) + "x" + str(round(h_crop)) + "+" + str(round(x_offset)) + "+" + str(round(y_offset)) + " " + sys.argv[cur_img]); + root.destroy() + sys.exit(0) + +def left(event): + global cur_img, x_orig, y_orig, x_new, y_new + if cur_img <= 1: + return + cur_img -= 1 + load_img() + if coords[cur_img] != None: + x_orig, y_orig, x_new, y_new = coords[cur_img] + canvas.create_rectangle(*coords[cur_img]) + else: + x_orig = y_orig = x_new = y_new = 0 + +def right(event): + global cur_img, x_orig, y_orig, x_new, y_new + if cur_img >= len(sys.argv) - 1: + return + cur_img += 1 + load_img() + if cur_img >= len(coords): + coords.append(None) + if coords[cur_img] != None: + x_orig, y_orig, x_new, y_new = coords[cur_img] + canvas.create_rectangle(*coords[cur_img]) + else: + x_orig = y_orig = x_new = y_new = 0 + +def return_event(event): + global cur_img, x_orig, x_new, y_orig, y_new + if x_orig < 0: + x_orig = 0 + if x_new < 0: + x_new = 0 + if x_orig > w_scaled: + x_orig = w_scaled + if x_new > w_scaled: + x_new = w_scaled + if y_orig < 0: + y_orig = 0 + if y_new < 0: + y_new = 0 + if y_orig > h_scaled: + y_orig = h_scaled + if y_new > h_scaled: + y_new = h_scaled + if x_orig == x_new or y_orig == y_new: + return + coords[cur_img] = [x_orig, y_orig, x_new, y_new] + if cur_img >= len(sys.argv) - 1: + return + cur_img += 1 + load_img() + if cur_img >= len(coords): + coords.append(None) + if coords[cur_img] != None: + x_orig, y_orig, x_new, y_new = coords[cur_img] + canvas.create_rectangle(*coords[cur_img]) + else: + canvas.create_rectangle(*coords[cur_img-1]) + +def load_img(): + global img, w, h, w_scaled, h_scaled, tkimg + img = Image.open(sys.argv[cur_img]) + w, h = img.size + img.thumbnail((1278, 760), Image.ANTIALIAS) + w_scaled, h_scaled = img.size + if cur_img >= len(img_sizes): + img_sizes.append([w, h, w_scaled, h_scaled]) + tkimg = ImageTk.PhotoImage(img); + canvas.create_image(0, 0, anchor=tkinter.NW, image=tkimg) + root.title(sys.argv[cur_img]); + +root = tkinter.Tk() + +canvas = tkinter.Canvas(root, width=1278, height=760) +canvas.pack() +canvas.bind('<B1-Motion>', motion) +canvas.bind('<ButtonRelease-1>', release) +canvas.bind('<ButtonPress-1>', press) +img, w, h, w_scaled, h_scaled, tkimg = 0, 0, 0, 0, 0, 0 +load_img() +root.bind('<Return>', return_event) +root.bind('<Left>', left) +root.bind('<Right>', right) +root.bind('<Escape>', print_exit) +tkinter.mainloop() diff --git a/everysecond.pl b/everysecond.pl @@ -0,0 +1,22 @@ +#!/usr/bin/env perl + +# give every second file + +use strict; +use warnings; + +my $start = shift; +my $end = shift; + +while ($ARGV[0] ne $start) { + shift; +} + +foreach my $i (0..$#ARGV) { + if ($i % 2 == 0) { + print(" $ARGV[$i]"); + } + if ($ARGV[$i] eq $end) { + last; + } +} diff --git a/fehs.sh b/fehs.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +path=${1#file://} +feh -. --start-at "$path" `dirname "$path"` diff --git a/fromto.pl b/fromto.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl + +# give every file from first arg to second arg + +use strict; +use warnings; + +my $start = shift; +my $end = shift; + +while ($ARGV[0] ne $start) { + shift; +} + +foreach my $i (0..$#ARGV) { + print(" $ARGV[$i]"); + if ($ARGV[$i] eq $end) { + last; + } +} diff --git a/sort.pl b/sort.pl @@ -0,0 +1,15 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use File::Copy qw(copy); + +my $destdir = shift; +my $ext = shift; +my $i = 1; +my $digits = length(scalar(@ARGV)); +foreach my $file (@ARGV) { + my $dest = sprintf("%0${digits}d.$ext", $i); + copy($file, "$destdir/$dest"); + $i++; +} diff --git a/sort2.pl b/sort2.pl @@ -0,0 +1,23 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use File::Copy qw(copy); + +my $destdir = shift; +my $ext = shift; +my $i = shift; + +if (scalar(@ARGV) % 2) { + die "Uneven number of images.\n"; +} +my $digits = length(scalar(@ARGV)); +my $half = scalar(@ARGV) / 2; +foreach my $j (0..$half-1) { + my $dest = sprintf("%0${digits}d.$ext", $i); + copy($ARGV[$j], "$destdir/$dest"); + $i++; + $dest = sprintf("%0${digits}d.$ext", $i); + copy($ARGV[$#ARGV-$j], "$destdir/$dest"); + $i++; +}