about summary refs log tree commit diff
path: root/kcc/image.py
diff options
context:
space:
mode:
authorCiro Mattia Gonano <ciromattia@gmail.com>2013-01-17 16:20:32 +0100
committerCiro Mattia Gonano <ciromattia@gmail.com>2013-01-17 16:20:32 +0100
commitf231e9112a2006de619a4cfb20dd9a2db566851e (patch)
tree3ddcf781f1e1296117331ddd77be08383143e9df /kcc/image.py
parentMerge remote-tracking branch 'origin/master' (diff)
downloadkcc-f231e9112a2006de619a4cfb20dd9a2db566851e.tar.gz
kcc-f231e9112a2006de619a4cfb20dd9a2db566851e.tar.bz2
kcc-f231e9112a2006de619a4cfb20dd9a2db566851e.zip
Added a bunch of optimizations (autocontrast, page centering)
Diffstat (limited to 'kcc/image.py')
-rwxr-xr-xkcc/image.py53
1 files changed, 27 insertions, 26 deletions
diff --git a/kcc/image.py b/kcc/image.py
index c6042ce..42bf56b 100755
--- a/kcc/image.py
+++ b/kcc/image.py
@@ -16,7 +16,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
-from PIL import Image, ImageDraw, ImageStat
+from PIL import Image, ImageOps, ImageDraw, ImageStat
 
 class ImageFlags:
     Orient = 1 << 0
@@ -103,6 +103,9 @@ class ComicPage:
         except IOError as e:
             raise RuntimeError('Cannot write image in directory %s: %s' %(targetdir,e))
 
+    def optimizeImage(self):
+        self.image = ImageOps.autocontrast(self.image)
+
     def quantizeImage(self):
         colors = len(self.palette) / 3
         if colors < 256:
@@ -111,33 +114,31 @@ class ComicPage:
         palImg.putpalette(self.palette)
         self.image = self.image.quantize(palette=palImg)
 
-    def stretchImage(self):
-        widthDev, heightDev = self.size
-        self.image = self.image.resize((widthDev, heightDev), Image.ANTIALIAS)
+    def resizeImage(self,upscale=False, stretch=False):
+        method = Image.ANTIALIAS
+        if self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1]:
+            if not upscale:
+                return self.image
+            else:
+                method = Image.NEAREST
 
-    # TODO:
-    # - add option to stretch page
-    # - add option to upscale page
-    # - if ratio is not equal to dev size and stretch is not enabled, add white
-    #   background and center it (otherwise K3 does not display page
-    #   center-aligned but left-aligned)
-    def resizeImage(self):
-        widthDev, heightDev = self.size
-        widthImg, heightImg = self.image.size
-        if widthImg <= widthDev and heightImg <= heightDev:
+        if stretch: # if stretching call directly resize() without other considerations.
+            self.image = self.image.resize(self.size,method)
             return self.image
-        ratioImg = float(widthImg) / float(heightImg)
-        ratioWidth = float(widthImg) / float(widthDev)
-        ratioHeight = float(heightImg) / float(heightDev)
-        if ratioWidth > ratioHeight:
-            widthImg = widthDev
-            heightImg = int(widthDev / ratioImg)
-        elif ratioWidth < ratioHeight:
-            heightImg = heightDev
-            widthImg = int(heightDev * ratioImg)
-        else:
-            widthImg, heightImg = self.size
-        self.image = self.image.resize((widthImg, heightImg), Image.ANTIALIAS)
+
+        ratioDev = float(self.size[0]) / float(self.size[1])
+        if (float(self.image.size[0]) / float(self.image.size[1])) < ratioDev:
+            diff = int(self.image.size[1] * ratioDev) - self.image.size[0]
+            newImage = Image.new('RGB', (self.image.size[0] + diff, self.image.size[1]), (255,255,255))
+            newImage.paste(self.image, (diff / 2, 0, diff / 2 + self.image.size[0], self.image.size[1]))
+            self.image = newImage
+        elif (float(self.image.size[0]) / float(self.image.size[1])) > ratioDev:
+            diff = int(self.image.size[0] * ratioDev) - self.image.size[1]
+            newImage = Image.new('RGB', (self.image.size[0], self.image.size[1] + diff), (255,255,255))
+            newImage.paste(self.image, (0, diff / 2, self.image.size[0], diff / 2 + self.image.size[1]))
+            self.image = newImage
+        self.image = ImageOps.fit(self.image, self.size, method = method, centering = (0.5,0.5))
+        return self.image
 
     def splitPage(self, targetdir, righttoleft=False):
         width, height = self.image.size