From 442662e65c9e27e669a549197c08f2e40b5025df Mon Sep 17 00:00:00 2001 From: Thomas Sullivan Date: Wed, 17 Aug 2016 21:15:24 -0400 Subject: [PATCH] Fix bug where splitting pages resulted in out-of-order and over-written pages, rename imageFlags variables to be more intuitive --- mangle/convert.py | 40 +++++++++++++++++++++++----------------- mangle/image.py | 41 +++++++++++++++++------------------------ mangle/options.py | 4 ++-- 3 files changed, 42 insertions(+), 43 deletions(-) diff --git a/mangle/convert.py b/mangle/convert.py index 6366daa..8c9c92e 100644 --- a/mangle/convert.py +++ b/mangle/convert.py @@ -36,6 +36,7 @@ class DialogConvert(QtGui.QProgressDialog): self.setWindowTitle('Exporting book...') self.setMaximum(len(self.book.images)) self.setValue(0) + self.increment = 0 self.archive = None if 'CBZ' in self.book.outputFormat: @@ -79,7 +80,8 @@ class DialogConvert(QtGui.QProgressDialog): def onTimer(self): index = self.value() - target = os.path.join(self.bookPath, '%05d.png' % index) + pages_split = self.increment + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split)) source = unicode(self.book.images[index]) if index == 0: @@ -121,30 +123,34 @@ class DialogConvert(QtGui.QProgressDialog): archive = self.archive pdf = self.pdf - # Maybe the user ask for a split, but the picture is not a large one, so skip - # it but only for this picture - if (flags & ImageFlags.Split) or (flags & ImageFlags.SplitInverse): + # Check if page wide enough to split + if (flags & ImageFlags.SplitRightLeft) or (flags & ImageFlags.SplitLeftRight): if not image.isSplitable(source): # remove split flags - splitFlags= [ImageFlags.Split, ImageFlags.SplitInverse, ImageFlags.SplitRight, ImageFlags.SplitLeft] + splitFlags = [ImageFlags.SplitRightLeft, ImageFlags.SplitLeftRight, ImageFlags.SplitRight, + ImageFlags.SplitLeft] for f in splitFlags: flags &= ~f # For right page (if requested in options and need for this image) - if (flags & ImageFlags.Split): - # New path based on modified index - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0)) - self.convertAndSave(source, target, device, flags ^ ImageFlags.Split | ImageFlags.SplitRight, archive, pdf) - # Change target once again for left page - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1)) + if flags & ImageFlags.SplitRightLeft: + self.convertAndSave(source, target, device, + flags ^ ImageFlags.SplitRightLeft | ImageFlags.SplitRight, + archive, pdf) + + # Change target for left page + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1)) + self.increment += 1 # For right page (if requested), but in inverted mode - if (flags & ImageFlags.SplitInverse): - # New path based on modified index - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0)) - self.convertAndSave(source, target, device, flags ^ ImageFlags.SplitInverse | ImageFlags.SplitLeft, archive, pdf) - # Change target once again for left page - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1)) + if flags & ImageFlags.SplitLeftRight: + self.convertAndSave(source, target, device, + flags ^ ImageFlags.SplitLeftRight | ImageFlags.SplitLeft, + archive, pdf) + + # Change target for left page + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1)) + self.increment += 1 # Convert page self.convertAndSave(source, target, device, flags, archive, pdf) diff --git a/mangle/image.py b/mangle/image.py index d1069d2..b9ba9e5 100644 --- a/mangle/image.py +++ b/mangle/image.py @@ -20,16 +20,16 @@ from PIL import Image, ImageDraw, ImageStat, ImageChops class ImageFlags: - Orient = 1 << 0 - Resize = 1 << 1 - Frame = 1 << 2 - Quantize = 1 << 3 - Stretch = 1 << 4 - Split = 1 << 5 # split right then left - SplitRight = 1 << 6 # split only the right page - SplitLeft = 1 << 7 # split only the left page - SplitInverse = 1 << 8 # split left then right page - AutoCrop = 1 << 9 # split left then right page + Orient = 1 << 0 + Resize = 1 << 1 + Frame = 1 << 2 + Quantize = 1 << 3 + Stretch = 1 << 4 + SplitRightLeft = 1 << 5 # split right then left + SplitRight = 1 << 6 # split only the right page + SplitLeft = 1 << 7 # split only the left page + SplitLeftRight = 1 << 8 # split left then right page + AutoCrop = 1 << 9 class KindleData: @@ -103,12 +103,14 @@ def protect_bad_image(func): return func(*args, **kwargs) except IOError: # Exception from PIL about bad image return args[0] + return func_wrapper @protect_bad_image def splitLeft(image): widthImg, heightImg = image.size + return image.crop((0, 0, widthImg / 2, heightImg)) @@ -189,6 +191,7 @@ def autoCropImage(image): except TypeError: # bad image, specific to chops return image image = image.crop((x0, y0, xend, yend)) + return image @@ -254,29 +257,22 @@ def convertImage(source, target, device, flags): # Load image from source path image = loadImage(source) - - # Format according to palette image = formatImage(image) - # Apply flag transforms - # Second pass of first split + # Apply flag transforms if flags & ImageFlags.SplitRight: image = splitRight(image) - # First pass of first split option - if (flags & ImageFlags.Split): + if flags & ImageFlags.SplitRightLeft: image = splitLeft(image) - # First pass of second splitting option if flags & ImageFlags.SplitLeft: image = splitLeft(image) - # second pass of second splitting option - if (flags & ImageFlags.SplitInverse): + if flags & ImageFlags.SplitLeftRight: image = splitRight(image) # Auto crop the image, but before manage size and co, clean the source so if flags & ImageFlags.AutoCrop: image = autoCropImage(image) - if flags & ImageFlags.Orient: image = orientImage(image, size) if flags & ImageFlags.Resize: @@ -285,10 +281,7 @@ def convertImage(source, target, device, flags): image = stretchImage(image, size) if flags & ImageFlags.Frame: image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size) - - - if flags & ImageFlags.Quantize: image = quantizeImage(image, palette) - saveImage(image, target) \ No newline at end of file + saveImage(image, target) diff --git a/mangle/options.py b/mangle/options.py index 08a29dd..c2437bc 100644 --- a/mangle/options.py +++ b/mangle/options.py @@ -69,9 +69,9 @@ class DialogOptions(QtGui.QDialog): if self.checkboxFrame.isChecked(): imageFlags |= ImageFlags.Frame if self.checkboxSplit.isChecked(): - imageFlags |= ImageFlags.Split + imageFlags |= ImageFlags.SplitRightLeft if self.checkboxSplitInverse.isChecked(): - imageFlags |= ImageFlags.SplitInverse + imageFlags |= ImageFlags.SplitLeftRight if self.checkboxAutoCrop.isChecked(): imageFlags |= ImageFlags.AutoCrop