Added "Split left and right pages" option

Also cleaned formatting according to Eclipse PyDev
This commit is contained in:
Jan 2013-10-17 12:42:42 +11:00
parent 9c065b50ef
commit 1b2c5308eb
10 changed files with 86 additions and 48 deletions

View File

@ -17,7 +17,9 @@
import sys import sys
from PyQt4 import QtGui from PyQt4 import QtGui
from mangle.book import MainWindowBook from mangle.book import MainWindowBook

View File

@ -14,10 +14,10 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os.path
import util
from PyQt4 import QtGui, uic from PyQt4 import QtGui, uic
import util
class DialogAbout(QtGui.QDialog): class DialogAbout(QtGui.QDialog):
def __init__(self, parent): def __init__(self, parent):

View File

@ -14,19 +14,20 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import os.path
from os.path import basename from os.path import basename
import util import os.path
import tempfile import tempfile
from PyQt4 import QtGui, QtCore, QtXml, uic
from zipfile import ZipFile from zipfile import ZipFile
from image import ImageFlags
from about import DialogAbout from PyQt4 import QtGui, QtCore, QtXml, uic
from options import DialogOptions
from convert import DialogConvert
from natsort import natsorted from natsort import natsorted
from about import DialogAbout
from convert import DialogConvert
from image import ImageFlags
from options import DialogOptions
import util
class Book(object): class Book(object):
DefaultDevice = 'Kindle Paperwhite' DefaultDevice = 'Kindle Paperwhite'
@ -250,7 +251,7 @@ class MainWindowBook(QtGui.QMainWindow):
QtGui.QMessageBox.warning(self, 'Mangle', 'This book has no images to export') QtGui.QMessageBox.warning(self, 'Mangle', 'This book has no images to export')
return return
if not self.book.titleSet: # if self.book.title is None: if not self.book.titleSet: # if self.book.title is None:
dialog = DialogOptions(self, self.book) dialog = DialogOptions(self, self.book)
if dialog.exec_() == QtGui.QDialog.Rejected: if dialog.exec_() == QtGui.QDialog.Rejected:
return return
@ -378,7 +379,7 @@ class MainWindowBook(QtGui.QMainWindow):
filenames = [] filenames = []
for directory in directories: for directory in directories:
for root, subdirs, subfiles in os.walk(unicode(directory)): for root, _, subfiles in os.walk(unicode(directory)):
for filename in subfiles: for filename in subfiles:
path = os.path.join(root, filename) path = os.path.join(root, filename)
if self.isImageFile(path): if self.isImageFile(path):
@ -402,16 +403,15 @@ class MainWindowBook(QtGui.QMainWindow):
for f in cbzFile.namelist(): for f in cbzFile.namelist():
if f.endswith('/'): if f.endswith('/'):
try: try:
os.makedirs(path+f) os.makedirs(path + f)
except: except:
pass #the dir exists so we are going to extract the images only. pass # the dir exists so we are going to extract the images only.
else: else:
cbzFile.extract(f, path) cbzFile.extract(f, path)
#Add the directories if os.path.isdir(unicode(path)): # Add the directories
if os.path.isdir(unicode(path)):
directories.append(path) directories.append(path)
#Add the files
self.addImageDirs(directories) self.addImageDirs(directories) # Add the files
def isImageFile(self, filename): def isImageFile(self, filename):

View File

@ -14,10 +14,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, shutil import os
import shutil
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
import image
import cbz import cbz
import image
import pdfimage import pdfimage
@ -39,7 +42,7 @@ class DialogConvert(QtGui.QProgressDialog):
self.pdf = None self.pdf = None
if "PDF" in self.book.outputFormat: if "PDF" in self.book.outputFormat:
self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device)) self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device))
@ -56,9 +59,9 @@ class DialogConvert(QtGui.QProgressDialog):
# Close the archive if we created a CBZ file # Close the archive if we created a CBZ file
if self.archive is not None: if self.archive is not None:
self.archive.close() self.archive.close()
#Close and generate the PDF File # Close and generate the PDF File
if self.pdf is not None: if self.pdf is not None:
self.pdf.close() self.pdf.close()
# Remove image directory if the user didn't wish for images # Remove image directory if the user didn't wish for images
if 'Image' not in self.book.outputFormat: if 'Image' not in self.book.outputFormat:
@ -108,7 +111,7 @@ class DialogConvert(QtGui.QProgressDialog):
if self.archive is not None: if self.archive is not None:
self.archive.addFile(target) self.archive.addFile(target)
if self.pdf is not None: if self.pdf is not None:
self.pdf.addImage(target) self.pdf.addImage(target)
except RuntimeError, error: except RuntimeError, error:
result = QtGui.QMessageBox.critical( result = QtGui.QMessageBox.critical(
self, self,

View File

@ -14,6 +14,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
@ -23,6 +25,8 @@ class ImageFlags:
Frame = 1 << 2 Frame = 1 << 2
Quantize = 1 << 3 Quantize = 1 << 3
Stretch = 1 << 4 Stretch = 1 << 4
Split = 1 << 5
SplitRight = 1 << 6
class KindleData: class KindleData:
@ -81,6 +85,18 @@ class KindleData:
} }
def splitLeft(image):
widthImg, heightImg = image.size
return image.crop((0, 0, widthImg / 2, heightImg))
def splitRight(image):
widthImg, heightImg = image.size
return image.crop((widthImg / 2, 0, widthImg, heightImg))
def quantizeImage(image, palette): def quantizeImage(image, palette):
colors = len(palette) / 3 colors = len(palette) / 3
if colors < 256: if colors < 256:
@ -93,8 +109,8 @@ def quantizeImage(image, palette):
def stretchImage(image, size): def stretchImage(image, size):
widthDev, heightDev = size widthDev, heightDev = size
return image.resize((widthDev, heightDev), Image.ANTIALIAS) return image.resize((widthDev, heightDev), Image.ANTIALIAS)
def resizeImage(image, size): def resizeImage(image, size):
widthDev, heightDev = size widthDev, heightDev = size
@ -175,15 +191,24 @@ def convertImage(source, target, device, flags):
raise RuntimeError('Cannot read image file %s' % source) raise RuntimeError('Cannot read image file %s' % source)
image = formatImage(image) image = formatImage(image)
if flags & ImageFlags.Orient: if flags & ImageFlags.Orient:
image = orientImage(image, size) image = orientImage(image, size)
if flags & ImageFlags.SplitRight:
image = splitRight(image)
elif flags & ImageFlags.Split:
image = splitLeft(image)
# Recurse for right page
fileName, fileExtension = os.path.splitext(target)
newTarget = fileName + "r" + fileExtension
print(newTarget)
convertImage(source, newTarget, device, flags | ImageFlags.SplitRight)
if flags & ImageFlags.Resize: if flags & ImageFlags.Resize:
image = resizeImage(image, size) image = resizeImage(image, size)
if flags & ImageFlags.Stretch: if flags & ImageFlags.Stretch:
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)
try: try:
image.save(target) image.save(target)

View File

@ -14,10 +14,10 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os.path from PyQt4 import QtGui, uic
import util
from PyQt4 import QtGui, QtCore, uic
from image import ImageFlags from image import ImageFlags
import util
class DialogOptions(QtGui.QDialog): class DialogOptions(QtGui.QDialog):
@ -59,11 +59,13 @@ class DialogOptions(QtGui.QDialog):
if self.checkboxResize.isChecked(): if self.checkboxResize.isChecked():
imageFlags |= ImageFlags.Resize imageFlags |= ImageFlags.Resize
if self.checkboxStretch.isChecked(): if self.checkboxStretch.isChecked():
imageFlags |= ImageFlags.Stretch imageFlags |= ImageFlags.Stretch
if self.checkboxQuantize.isChecked(): if self.checkboxQuantize.isChecked():
imageFlags |= ImageFlags.Quantize imageFlags |= ImageFlags.Quantize
if self.checkboxFrame.isChecked(): if self.checkboxFrame.isChecked():
imageFlags |= ImageFlags.Frame imageFlags |= ImageFlags.Frame
if self.checkboxSplit.isChecked():
imageFlags |= ImageFlags.Split
modified = ( modified = (
self.book.title != title or self.book.title != title or

View File

@ -17,9 +17,10 @@
import os.path import os.path
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from image import KindleData from image import KindleData
class PDFImage(object): class PDFImage(object):
def __init__(self, path, title, device): def __init__(self, path, title, device):
outputDirectory = os.path.dirname(path) outputDirectory = os.path.dirname(path)
@ -28,7 +29,7 @@ class PDFImage(object):
self.currentDevice = device self.currentDevice = device
self.bookTitle = title self.bookTitle = title
self.pageSize = KindleData.Profiles[self.currentDevice][0] self.pageSize = KindleData.Profiles[self.currentDevice][0]
#pagesize could be letter or A4 for standarization but we need to control some image sizes # pagesize could be letter or A4 for standarization but we need to control some image sizes
self.canvas = canvas.Canvas(outputPath, pagesize=self.pageSize) self.canvas = canvas.Canvas(outputPath, pagesize=self.pageSize)
self.canvas.setAuthor("Mangle") self.canvas.setAuthor("Mangle")
self.canvas.setTitle(self.bookTitle) self.canvas.setTitle(self.bookTitle)

View File

@ -158,6 +158,13 @@
<string>Draw frame around images</string> <string>Draw frame around images</string>
</property> </property>
</widget> </widget>
</item>
<item>
<widget class="QCheckBox" name="checkboxSplit">
<property name="text">
<string>Split left and right pages</string>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">

View File

@ -15,7 +15,6 @@
import os.path import os.path
import re
import sys import sys

View File

@ -16,16 +16,15 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
from distutils.core import setup from distutils.core import setup
import py2exe import sys
sys.argv.append('py2exe') sys.argv.append('py2exe')
setup( setup(
name = 'Mangle', name='Mangle',
windows = [{'script': 'mangle.pyw'}], windows=[{'script': 'mangle.pyw'}],
data_files = [('', ['LICENSE']), data_files=[('', ['LICENSE']),
('mangle/ui', ['mangle/ui/book.ui', ('mangle/ui', ['mangle/ui/book.ui',
'mangle/ui/about.ui', 'mangle/ui/about.ui',
'mangle/ui/options.ui']), 'mangle/ui/options.ui']),
@ -39,11 +38,11 @@ setup(
'mangle/img/save_file.png', 'mangle/img/save_file.png',
'mangle/img/shift_down.png', 'mangle/img/shift_down.png',
'mangle/img/shift_up.png'])], 'mangle/img/shift_up.png'])],
options = {'py2exe': { options={'py2exe': {
'bundle_files': 1, 'bundle_files': 1,
'includes': ['sip'], 'includes': ['sip'],
'packages': ['reportlab.pdfbase'], 'packages': ['reportlab.pdfbase'],
'dll_excludes': ['w9xpopen.exe'] 'dll_excludes': ['w9xpopen.exe']
}}, }},
zipfile = None zipfile=None
) )