diff options
-rw-r--r-- | README.md | 1 | ||||
-rwxr-xr-x | kcc/image.py | 168 |
2 files changed, 86 insertions, 83 deletions
diff --git a/README.md b/README.md index 08bfb21..3664ee2 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,7 @@ The app relies and includes the following scripts/binaries: * Kindle Fire support (color ePub/Mobi) * Panel View support for horizontal content * Fixed panel order for horizontal pages when --rotate is enabled +* Disabled cropping and page number cutting for blank pages ## COPYRIGHT diff --git a/kcc/image.py b/kcc/image.py index 7af6f39..4dc7cc6 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -20,7 +20,7 @@ __copyright__ = '2012-2013, Ciro Mattia Gonano <ciromattia@gmail.com>' __docformat__ = 'restructuredtext en' import os -from PIL import Image, ImageOps, ImageStat +from PIL import Image, ImageOps, ImageStat, ImageChops class ImageFlags: @@ -237,93 +237,95 @@ class ComicPage: return None def cutPageNumber(self): - widthImg, heightImg = self.image.size - delta = 2 - diff = delta - fixedThreshold = 5 - if ImageStat.Stat(self.image).var[0] < 2 * fixedThreshold: - return self.image - while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] < fixedThreshold\ - and diff < heightImg: - diff += delta - diff -= delta - pageNumberCut1 = diff - if diff < delta: + if ImageChops.invert(self.image).getbbox() is not None: + widthImg, heightImg = self.image.size + delta = 2 diff = delta - oldStat = ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] - diff += delta - while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] - oldStat > 0\ - and diff < heightImg / 4: + fixedThreshold = 5 + if ImageStat.Stat(self.image).var[0] < 2 * fixedThreshold: + return self.image + while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] < fixedThreshold\ + and diff < heightImg: + diff += delta + diff -= delta + pageNumberCut1 = diff + if diff < delta: + diff = delta oldStat = ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] diff += delta - diff -= delta - pageNumberCut2 = diff - diff += delta - oldStat = ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg - pageNumberCut2))).var[0] - while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg - pageNumberCut2))).var[0]\ - < fixedThreshold + oldStat and diff < heightImg / 4: - diff += delta - diff -= delta - pageNumberCut3 = diff - delta = 5 - diff = delta - while ImageStat.Stat(self.image.crop((0, heightImg - pageNumberCut2, diff, heightImg))).var[0] < fixedThreshold\ - and diff < widthImg: - diff += delta - diff -= delta - pageNumberX1 = diff - diff = delta - while ImageStat.Stat(self.image.crop((widthImg - diff, heightImg - pageNumberCut2, - widthImg, heightImg))).var[0] < fixedThreshold and diff < widthImg: + while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] - oldStat > 0\ + and diff < heightImg / 4: + oldStat = ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] + diff += delta + diff -= delta + pageNumberCut2 = diff diff += delta - diff -= delta - pageNumberX2 = widthImg - diff - if pageNumberCut3 - pageNumberCut1 > 2 * delta\ - and float(pageNumberX2 - pageNumberX1) / float(pageNumberCut2 - pageNumberCut1) <= 9.0\ - and ImageStat.Stat(self.image.crop((0, heightImg - pageNumberCut3, widthImg, heightImg))).var[0]\ - / ImageStat.Stat(self.image).var[0] < 0.1\ - and pageNumberCut3 < heightImg / 4 - delta: - diff = pageNumberCut3 - else: - diff = pageNumberCut1 - self.image = self.image.crop((0, 0, widthImg, heightImg - diff)) + oldStat = ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg - pageNumberCut2))).var[0] + while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg - pageNumberCut2))).var[0]\ + < fixedThreshold + oldStat and diff < heightImg / 4: + diff += delta + diff -= delta + pageNumberCut3 = diff + delta = 5 + diff = delta + while ImageStat.Stat(self.image.crop((0, heightImg - pageNumberCut2, diff, heightImg))).var[0] < fixedThreshold\ + and diff < widthImg: + diff += delta + diff -= delta + pageNumberX1 = diff + diff = delta + while ImageStat.Stat(self.image.crop((widthImg - diff, heightImg - pageNumberCut2, + widthImg, heightImg))).var[0] < fixedThreshold and diff < widthImg: + diff += delta + diff -= delta + pageNumberX2 = widthImg - diff + if pageNumberCut3 - pageNumberCut1 > 2 * delta\ + and float(pageNumberX2 - pageNumberX1) / float(pageNumberCut2 - pageNumberCut1) <= 9.0\ + and ImageStat.Stat(self.image.crop((0, heightImg - pageNumberCut3, widthImg, heightImg))).var[0]\ + / ImageStat.Stat(self.image).var[0] < 0.1\ + and pageNumberCut3 < heightImg / 4 - delta: + diff = pageNumberCut3 + else: + diff = pageNumberCut1 + self.image = self.image.crop((0, 0, widthImg, heightImg - diff)) return self.image def cropWhiteSpace(self, threshold): - widthImg, heightImg = self.image.size - delta = 10 - diff = delta - # top - while ImageStat.Stat(self.image.crop((0, 0, widthImg, diff))).var[0] < threshold and diff < heightImg: - diff += delta - diff -= delta - # print "Top crop: %s"%diff - self.image = self.image.crop((0, diff, widthImg, heightImg)) - widthImg, heightImg = self.image.size - diff = delta - # left - while ImageStat.Stat(self.image.crop((0, 0, diff, heightImg))).var[0] < threshold and diff < widthImg: - diff += delta - diff -= delta - # print "Left crop: %s"%diff - self.image = self.image.crop((diff, 0, widthImg, heightImg)) - widthImg, heightImg = self.image.size - diff = delta - # down - while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] < threshold\ - and diff < heightImg: - diff += delta - diff -= delta - # print "Down crop: %s"%diff - self.image = self.image.crop((0, 0, widthImg, heightImg - diff)) - widthImg, heightImg = self.image.size - diff = delta - # right - while ImageStat.Stat(self.image.crop((widthImg - diff, 0, widthImg, heightImg))).var[0] < threshold\ - and diff < widthImg: - diff += delta - diff -= delta - # print "Right crop: %s"%diff - self.image = self.image.crop((0, 0, widthImg - diff, heightImg)) - # print "New size: %sx%s"%(self.image.size[0],self.image.size[1]) + if ImageChops.invert(self.image).getbbox() is not None: + widthImg, heightImg = self.image.size + delta = 10 + diff = delta + # top + while ImageStat.Stat(self.image.crop((0, 0, widthImg, diff))).var[0] < threshold and diff < heightImg: + diff += delta + diff -= delta + # print "Top crop: %s"%diff + self.image = self.image.crop((0, diff, widthImg, heightImg)) + widthImg, heightImg = self.image.size + diff = delta + # left + while ImageStat.Stat(self.image.crop((0, 0, diff, heightImg))).var[0] < threshold and diff < widthImg: + diff += delta + diff -= delta + # print "Left crop: %s"%diff + self.image = self.image.crop((diff, 0, widthImg, heightImg)) + widthImg, heightImg = self.image.size + diff = delta + # down + while ImageStat.Stat(self.image.crop((0, heightImg - diff, widthImg, heightImg))).var[0] < threshold\ + and diff < heightImg: + diff += delta + diff -= delta + # print "Down crop: %s"%diff + self.image = self.image.crop((0, 0, widthImg, heightImg - diff)) + widthImg, heightImg = self.image.size + diff = delta + # right + while ImageStat.Stat(self.image.crop((widthImg - diff, 0, widthImg, heightImg))).var[0] < threshold\ + and diff < widthImg: + diff += delta + diff -= delta + # print "Right crop: %s"%diff + self.image = self.image.crop((0, 0, widthImg - diff, heightImg)) + # print "New size: %sx%s"%(self.image.size[0],self.image.size[1]) return self.image |