diff options
-rw-r--r-- | README.md | 1 | ||||
-rwxr-xr-x | kcc/comic2ebook.py | 6 | ||||
-rw-r--r-- | kcc/comic2panel.py | 82 |
3 files changed, 84 insertions, 5 deletions
diff --git a/README.md b/README.md index c6dcd5c..0285234 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ Options: -y HEIGHT, --height=HEIGHT Height of the target device screen -i, --in-place Overwrite source directory + -m, --merge Combine every directory into a single image before splitting OTHER: -d, --debug Create debug file for every splitted image diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 85d4630..ffab9d4 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -953,12 +953,10 @@ def main(argv=None, qtGUI=None): path = getWorkFolder(args[0]) checkComicInfo(path + "/OEBPS/Images/", args[0]) if options.webtoon: - if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Splitting images') if options.customheight > 0: - comic2panel.main(['-y ' + str(options.customheight), '-i', path], qtGUI) + comic2panel.main(['-y ' + str(options.customheight), '-i', '-m', path], qtGUI) else: - comic2panel.main(['-y ' + str(image.ProfileData.Profiles[options.profile][1][1]), '-i', path], qtGUI) + comic2panel.main(['-y ' + str(image.ProfileData.Profiles[options.profile][1][1]), '-i', '-m', path], qtGUI) if options.imgproc: print "\nProcessing images..." if GUI: diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index f84a60a..f803ebe 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -69,6 +69,59 @@ def getImageFileName(imgfile): return filename +def walkLevel(some_dir, level=1): + some_dir = some_dir.rstrip(os.path.sep) + assert os.path.isdir(some_dir) + num_sep = some_dir.count(os.path.sep) + for root, dirs, files in os.walk(some_dir): + yield root, dirs, files + num_sep_this = root.count(os.path.sep) + if num_sep + level <= num_sep_this: + del dirs[:] + + +def mergeDirectory_tick(output): + if output: + mergeWorkerOutput.append(output) + mergeWorkerPool.terminate() + if GUI: + GUI.emit(QtCore.SIGNAL("progressBarTick")) + if not GUI.conversionAlive: + mergeWorkerPool.terminate() + + +def mergeDirectory(work): + try: + directory = work[0] + images = [] + imagesClear = [] + sizes = [] + for root, dirs, files in walkLevel(directory, 0): + for name in files: + if getImageFileName(name) is not None: + images.append([Image.open(os.path.join(root, name)), os.path.join(root, name)]) + if len(images) > 0: + for i in images: + sizes.append(i[0].size[0]) + mw = max(set(sizes), key=sizes.count) + for i in images: + if i[0].size[0] == mw: + i[0] = i[0].convert('RGB') + imagesClear.append(i) + h = sum(i[0].size[1] for i in imagesClear) + result = Image.new('RGB', (mw, h)) + y = 0 + for i in imagesClear: + result.paste(i[0], (0, y)) + y += i[0].size[1] + for i in imagesClear: + os.remove(i[1]) + savePath = os.path.split(imagesClear[0][1]) + result.save(os.path.join(savePath[0], os.path.splitext(savePath[1])[0] + '.png'), 'PNG') + except StandardError: + return str(sys.exc_info()[1]) + + def sanitizePanelSize(panel, opt): newPanels = [] if panel[2] > 8 * opt.height: @@ -216,7 +269,7 @@ def Copyright(): def main(argv=None, qtGUI=None): - global options, GUI, splitWorkerPool, splitWorkerOutput + global options, GUI, splitWorkerPool, splitWorkerOutput, mergeWorkerPool, mergeWorkerOutput parser = OptionParser(usage="Usage: %prog [options] comic_folder", add_help_option=False) mainOptions = OptionGroup(parser, "MANDATORY") otherOptions = OptionGroup(parser, "OTHER") @@ -224,6 +277,8 @@ def main(argv=None, qtGUI=None): help="Height of the target device screen") mainOptions.add_option("-i", "--in-place", action="store_true", dest="inPlace", default=False, help="Overwrite source directory") + mainOptions.add_option("-m", "--merge", action="store_true", dest="merge", default=False, + help="Combine every directory into a single image before splitting") otherOptions.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help="Create debug file for every splitted image") otherOptions.add_option("-h", "--help", action="help", @@ -249,6 +304,29 @@ def main(argv=None, qtGUI=None): pagenumber = 0 splitWorkerOutput = [] splitWorkerPool = Pool() + if options.merge: + directoryNumer = 1 + mergeWork = [] + mergeWorkerOutput = [] + mergeWorkerPool = Pool() + mergeWork.append([options.targetDir]) + for root, dirs, files in os.walk(options.targetDir, False): + for directory in dirs: + directoryNumer += 1 + mergeWork.append([os.path.join(root, directory)]) + if GUI: + GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Combining images') + GUI.emit(QtCore.SIGNAL("progressBarTick"), directoryNumer) + for i in mergeWork: + mergeWorkerPool.apply_async(func=mergeDirectory, args=(i, ), callback=mergeDirectory_tick) + mergeWorkerPool.close() + mergeWorkerPool.join() + if GUI and not GUI.conversionAlive: + rmtree(options.targetDir, True) + raise UserWarning("Conversion interrupted.") + if len(mergeWorkerOutput) > 0: + rmtree(options.targetDir, True) + raise RuntimeError("One of workers crashed. Cause: " + mergeWorkerOutput[0]) for root, dirs, files in os.walk(options.targetDir, False): for name in files: if getImageFileName(name) is not None: @@ -257,7 +335,9 @@ def main(argv=None, qtGUI=None): else: os.remove(os.path.join(root, name)) if GUI: + GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Splitting images') GUI.emit(QtCore.SIGNAL("progressBarTick"), pagenumber) + GUI.emit(QtCore.SIGNAL("progressBarTick")) if len(work) > 0: for i in work: splitWorkerPool.apply_async(func=splitImage, args=(i, ), callback=splitImage_tick) |