Add: autocrop option, and fix add image (not directory) crash regression

This commit is contained in:
Gabès Jean 2015-10-17 15:28:25 +02:00
parent 83251909b3
commit ca3b52df25
4 changed files with 53 additions and 16 deletions

View File

@ -30,9 +30,18 @@ import util
# Sort function use to sort files in a natural order, by lowering # Sort function use to sort files in a natural order, by lowering
# characters, and manage multi levels of integers (tome 1/ page 1.jpg, etc etc) # characters, and manage multi levels of integers (tome 1/ page 1.jpg, etc etc)
# cf: See http://www.codinghorror.com/blog/archives/001018.html
def natural_key(string_): def natural_key(string_):
"""See http://www.codinghorror.com/blog/archives/001018.html""" l = []
return [int(s) if s.isdigit() else s.lower() for s in re.split(r'(\d+)', string_)] for s in re.split(r'(\d+)', string_):
# QString do not have isdigit, so convert it if need
if isinstance(s, QtCore.QString):
s = unicode(s)
if s.isdigit():
l.append(int(s))
else:
l.append(s.lower())
return l
class Book(object): class Book(object):

View File

@ -16,20 +16,20 @@
import os import os
from PIL import Image, ImageDraw from PIL import Image, ImageDraw, ImageStat, ImageChops
class ImageFlags: class ImageFlags:
Orient = 1 << 0 Orient = 1 << 0
Resize = 1 << 1 Resize = 1 << 1
Frame = 1 << 2 Frame = 1 << 2
Quantize = 1 << 3 Quantize = 1 << 3
Stretch = 1 << 4 Stretch = 1 << 4
Split = 1 << 5 # split right then left Split = 1 << 5 # split right then left
SplitRight = 1 << 6 # split only the right page SplitRight = 1 << 6 # split only the right page
SplitLeft = 1 << 7 # split only the left page SplitLeft = 1 << 7 # split only the left page
SplitInverse = 1 << 8 # split left then right page SplitInverse = 1 << 8 # split left then right page
AutoCrop = 1 << 9 # split left then right page
class KindleData: class KindleData:
@ -179,6 +179,15 @@ def orientImage(image, size):
return image return image
# We will auto crop the image, by removing just white part around the image
# by inverting colors, and asking a bounder box ^^
@protect_bad_image
def autoCropImage(image):
x0, y0, xend, yend = ImageChops.invert(image).getbbox()
image = image.crop((x0, y0, xend, yend))
return image
def frameImage(image, foreground, background, size): def frameImage(image, foreground, background, size):
widthDev, heightDev = size widthDev, heightDev = size
widthImg, heightImg = image.size widthImg, heightImg = image.size
@ -240,6 +249,9 @@ def convertImage(source, target, device, flags):
raise RuntimeError('Unexpected output device %s' % device) raise RuntimeError('Unexpected output device %s' % device)
# Load image from source path # Load image from source path
image = loadImage(source) image = loadImage(source)
# Format according to palette # Format according to palette
image = formatImage(image) image = formatImage(image)
# Apply flag transforms # Apply flag transforms
@ -257,6 +269,10 @@ def convertImage(source, target, device, flags):
if (flags & ImageFlags.SplitInverse): if (flags & ImageFlags.SplitInverse):
image = splitRight(image) 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: if flags & ImageFlags.Orient:
image = orientImage(image, size) image = orientImage(image, size)
if flags & ImageFlags.Resize: if flags & ImageFlags.Resize:
@ -265,6 +281,9 @@ def convertImage(source, target, device, flags):
image = stretchImage(image, size) image = stretchImage(image, size)
if flags & ImageFlags.Frame: if flags & ImageFlags.Frame:
image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size) image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size)
if flags & ImageFlags.Quantize: if flags & ImageFlags.Quantize:
image = quantizeImage(image, palette) image = quantizeImage(image, palette)

View File

@ -72,6 +72,8 @@ class DialogOptions(QtGui.QDialog):
imageFlags |= ImageFlags.Split imageFlags |= ImageFlags.Split
if self.checkboxSplitInverse.isChecked(): if self.checkboxSplitInverse.isChecked():
imageFlags |= ImageFlags.SplitInverse imageFlags |= ImageFlags.SplitInverse
if self.checkboxAutoCrop.isChecked():
imageFlags |= ImageFlags.AutoCrop
# If we did modified a value, update the book # If we did modified a value, update the book
# and only if we did change something to not # and only if we did change something to not

View File

@ -181,14 +181,21 @@
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="checkboxSplitInverse"> <widget class="QCheckBox" name="checkboxSplitInverse">
<property name="text"> <property name="text">
<string>Split images into two pages (left, right)</string> <string>Split images into two pages (left, right)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="checkboxAutoCrop">
<property name="text">
<string>Auto crop image (remove white around the image)</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Size</string> <string>Size</string>