diff options
| -rw-r--r-- | kcc/KCC_gui.py | 4 | ||||
| -rwxr-xr-x | kcc/comic2ebook.py | 85 | ||||
| -rwxr-xr-x | kcc/image.py | 229 | ||||
| -rw-r--r-- | kcc/shared.py | 3 |
4 files changed, 102 insertions, 219 deletions
diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index c773529..22052bb 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -603,7 +603,9 @@ class KCCGUI(KCC_ui.Ui_mainWindow): GUI.upscaleBox.setEnabled(False) GUI.upscaleBox.setChecked(True) else: - GUI.qualityBox.setEnabled(True) + profile = GUI.profiles[str(GUI.deviceBox.currentText())] + if profile['Quality']: + GUI.qualityBox.setEnabled(True) GUI.mangaBox.setEnabled(True) GUI.rotateBox.setEnabled(True) GUI.upscaleBox.setEnabled(True) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index bffc798..175d576 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -98,8 +98,6 @@ def buildHTML(path, imgfile, imgfilepath): additionalStyle = 'background-color:#FFFFFF;' htmlpath = '' postfix = '' - size = '' - imgfilepv = '' backref = 1 head = path while True: @@ -125,16 +123,8 @@ def buildHTML(path, imgfile, imgfilepath): "<body style=\"background-image: ", "url('", "../" * backref, "Images/", postfix, imgfile, "'); " + additionalStyle + "\">\n"]) if options.iskindle and options.panelview: - if options.hqmode: - imgfilepv = list(os.path.splitext(imgfile)) - imgfilepv[0] += "-hq" - imgfilepv = "".join(imgfilepv) - if os.path.isfile(os.path.join(head, "Images", postfix, imgfilepv)): - size = Image.open(os.path.join(head, "Images", postfix, imgfilepv)).size - if not options.hqmode or not size: - imgfilepv = imgfile - sizeTmp = Image.open(os.path.join(head, "Images", postfix, imgfilepv)).size - size = (int(sizeTmp[0] * 1.5), int(sizeTmp[1] * 1.5)) + sizeTmp = Image.open(os.path.join(head, "Images", postfix, imgfile)).size + size = (int(sizeTmp[0] * 1.5), int(sizeTmp[1] * 1.5)) if options.autoscale: size = calculateZoomImageSize(sizeTmp, deviceres) if size[0] <= deviceres[0]: @@ -198,7 +188,7 @@ def buildHTML(path, imgfile, imgfilepath): for box in boxes: f.writelines(["<div class=\"PV-P\" id=\"" + box + "-P\" style=\"" + additionalStyle + "\">\n", "<img style=\"" + boxStyles[box] + "\" src=\"", "../" * backref, "Images/", postfix, - imgfilepv, "\" width=\"" + str(size[0]) + "\" height=\"" + str(size[1]) + "\"/>\n", + imgfile, "\" width=\"" + str(size[0]) + "\" height=\"" + str(size[1]) + "\"/>\n", "</div>\n"]) f.writelines(["</body>\n", "</html>\n"]) @@ -341,29 +331,6 @@ def buildOPF(dstdir, title, filelist, cover=None): f.write("</manifest>\n<spine page-progression-direction=\"rtl\" toc=\"ncx\">\n") else: f.write("</manifest>\n<spine page-progression-direction=\"ltr\" toc=\"ncx\">\n") - # if options.iskindle and options.profile != 'Custom': - # if options.righttoleft: - # nextflow = 'right' - # else: - # nextflow = 'left' - # for entry in reflist: - # if '-kcc-b' in entry: - # if options.righttoleft: - # f.write("<itemref idref=\"page_" + entry + "\" properties=\"page-spread-right\"/>\n") - # else: - # f.write("<itemref idref=\"page_" + entry + "\" properties=\"page-spread-left\"/>\n") - # elif '-kcc-c' in entry: - # if options.righttoleft: - # f.write("<itemref idref=\"page_" + entry + "\" properties=\"page-spread-left\"/>\n") - # else: - # f.write("<itemref idref=\"page_" + entry + "\" properties=\"page-spread-right\"/>\n") - # else: - # f.write("<itemref idref=\"page_" + entry + "\" properties=\"facing-page-" + nextflow + "\"/>\n") - # if nextflow == 'right': - # nextflow = 'left' - # else: - # nextflow = 'right' - # else: for entry in reflist: f.write("<itemref idref=\"page_" + entry + "\"/>\n") f.write("</spine>\n</package>\n") @@ -465,17 +432,15 @@ def buildEPUB(path, chapterNames, tomeNumber): chapter = False dirnames, filenames = walkSort(dirnames, filenames) for afile in filenames: - filename = getImageFileName(afile) - if not filename[0].endswith('-hq'): - filelist.append(buildHTML(dirpath, afile, os.path.join(dirpath, afile))) - if not chapter: - chapterlist.append((dirpath.replace('Images', 'Text'), filelist[-1][1])) - chapter = True - if cover is None: - cover = os.path.join(os.path.join(path, 'OEBPS', 'Images'), - 'cover' + getImageFileName(filelist[-1][1])[1]) - options.covers.append((image.Cover(os.path.join(filelist[-1][0], filelist[-1][1]), cover, options, - tomeNumber), options.uuid)) + filelist.append(buildHTML(dirpath, afile, os.path.join(dirpath, afile))) + if not chapter: + chapterlist.append((dirpath.replace('Images', 'Text'), filelist[-1][1])) + chapter = True + if cover is None: + cover = os.path.join(os.path.join(path, 'OEBPS', 'Images'), + 'cover' + getImageFileName(filelist[-1][1])[1]) + options.covers.append((image.Cover(os.path.join(filelist[-1][0], filelist[-1][1]), cover, options, + tomeNumber), options.uuid)) # Overwrite chapternames if tree is flat and ComicInfo.xml has bookmarks if not chapterNames and options.chapters: chapterlist = [] @@ -553,10 +518,10 @@ def imgFileProcessing(work): workImg = image.ComicPageParser((dirpath, afile), opt) for i in workImg.payload: img = image.ComicPage(i[0], i[1], i[2], i[3], i[4], opt) - if opt.cropping > 0 and not opt.webtoon: - img.cropWhiteSpace(opt.croppingp) if opt.cropping == 2 and not opt.webtoon: - img.cutPageNumber(opt.croppingpn) + img.cropPageNumber(opt.croppingp) + if opt.cropping > 0 and not opt.webtoon: + img.cropMargin(opt.croppingp) img.autocontrastImage() img.resizeImage() if opt.forcepng and not opt.forcecolor: @@ -991,8 +956,10 @@ def makeParser(): help="Double page parsing mode. 0: Split 1: Rotate 2: Both [Default=0]") processingOptions.add_option("-g", "--gamma", type="float", dest="gamma", default="0.0", help="Apply gamma correction to linearize the image [Default=Auto]") - processingOptions.add_option("--hq", action="store_true", dest="hqmode", default=False, - help="Enable high quality Panel View") + processingOptions.add_option("-c", "--cropping", type="int", dest="cropping", default="2", + help="Set cropping mode. 0: Disabled 1: Margins 2: Margins + page numbers [Default=2]") + processingOptions.add_option("--cp", "--croppingpower", type="float", dest="croppingp", default="1.0", + help="Set cropping power [Default=1.0]") processingOptions.add_option("--blackborders", action="store_true", dest="black_borders", default=False, help="Disable autodetection and force black borders") processingOptions.add_option("--whiteborders", action="store_true", dest="white_borders", default=False, @@ -1001,12 +968,6 @@ def makeParser(): help="Don't convert images to grayscale") processingOptions.add_option("--forcepng", action="store_true", dest="forcepng", default=False, help="Create PNG files instead JPEG") - processingOptions.add_option("--cropping", type="int", dest="cropping", default="2", - help="Set cropping mode. 0: Disabled 1: Margins 2: Margins + page numbers [Default=2]") - processingOptions.add_option("--croppingpower", type="float", dest="croppingp", default="0.1", - help="Set margin cropping threshold [Default=0.1]") - processingOptions.add_option("--croppingpowerpage", type="float", dest="croppingpn", default="5.0", - help="Set page number cropping threshold [Default=5.0]") customProfileOptions.add_option("--customwidth", type="int", dest="customwidth", default=0, help="Replace screen width provided by device profile") @@ -1048,20 +1009,16 @@ def checkOptions(): # Older Kindle don't need higher resolution files due lack of Panel View. if options.profile == 'K1' or options.profile == 'K2' or options.profile == 'K3' or options.profile == 'KDX': options.panelview = False - options.hqmode = False # Webtoon mode mandatory options if options.webtoon: options.panelview = False - options.hqmode = False options.righttoleft = False options.upscale = True # Disable all Kindle features for other e-readers if options.profile == 'OTHER': options.panelview = False - options.hqmode = False if 'Ko' in options.profile: options.panelview = False - options.hqmode = False # CBZ files on Kindle DX/DXG support higher resolution if options.profile == 'KDX' and options.format == 'CBZ': options.customheight = 1200 @@ -1074,7 +1031,7 @@ def checkOptions(): if options.customheight != 0: Y = options.customheight newProfile = ("Custom", (int(X), int(Y)), image.ProfileData.Palette16, - image.ProfileData.Profiles[options.profile][3], (int(int(X) * 1.5), int(int(Y) * 1.5))) + image.ProfileData.Profiles[options.profile][3]) image.ProfileData.Profiles["Custom"] = newProfile options.profile = "Custom" options.profileData = image.ProfileData.Profiles[options.profile] @@ -1192,7 +1149,6 @@ def makeBook(source, qtGUI=None): if not GUI and options.format == 'MOBI': print("Creating MOBI files...") work = [] - k = kindle.Kindle() for i in filepath: work.append([i]) output = makeMOBI(work, GUI) @@ -1201,6 +1157,7 @@ def makeBook(source, qtGUI=None): print('Error: KindleGen failed to create MOBI!') print(errors) return filepath + k = kindle.Kindle() if k.path and k.coverSupport: print("Kindle detected. Uploading covers...") for i in filepath: diff --git a/kcc/image.py b/kcc/image.py index aef77e5..009b2bb 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -1,5 +1,6 @@ # Copyright (C) 2010 Alex Yatskov # Copyright (C) 2011 Stanislav (proDOOMman) Kosolapov <[email protected]> +# Copyright (c) 2016 Alberto Planas <[email protected]> # Copyright (c) 2012-2014 Ciro Mattia Gonano <[email protected]> # Copyright (c) 2013-2016 Pawel Jastrzebski <[email protected]> # @@ -20,7 +21,7 @@ import os from io import BytesIO from urllib.request import Request, urlopen from urllib.parse import quote -from PIL import Image, ImageOps, ImageStat, ImageChops +from PIL import Image, ImageOps, ImageStat, ImageChops, ImageFilter from .shared import md5Checksum from . import __version__ @@ -77,21 +78,21 @@ class ProfileData: ] Profiles = { - 'K1': ("Kindle 1", (600, 670), Palette4, 1.8, (900, 1005)), - 'K2': ("Kindle 2", (600, 670), Palette15, 1.8, (900, 1005)), - 'K3': ("Kindle", (600, 800), Palette16, 1.8, (900, 1200)), - 'K45': ("Kindle", (600, 800), Palette16, 1.8, (900, 1200)), - 'KDX': ("Kindle DX/DXG", (824, 1000), Palette16, 1.8, (1236, 1500)), - 'KPW': ("Kindle Paperwhite 1/2", (758, 1024), Palette16, 1.8, (1137, 1536)), - 'KV': ("Kindle Paperwhite 3/Voyage/Oasis", (1072, 1448), Palette16, 1.8, (1608, 2172)), - 'KoMT': ("Kobo Mini/Touch", (600, 800), Palette16, 1.8, (900, 1200)), - 'KoG': ("Kobo Glo", (768, 1024), Palette16, 1.8, (1152, 1536)), - 'KoGHD': ("Kobo Glo HD", (1072, 1448), Palette16, 1.8, (1608, 2172)), - 'KoA': ("Kobo Aura", (758, 1024), Palette16, 1.8, (1137, 1536)), - 'KoAHD': ("Kobo Aura HD", (1080, 1440), Palette16, 1.8, (1620, 2160)), - 'KoAH2O': ("Kobo Aura H2O", (1080, 1430), Palette16, 1.8, (1620, 2145)), - 'KoAO': ("Kobo Aura ONE", (1404, 1872), Palette16, 1.8, (2106, 2808)), - 'OTHER': ("Other", (0, 0), Palette16, 1.8, (0, 0)), + 'K1': ("Kindle 1", (600, 670), Palette4, 1.8), + 'K2': ("Kindle 2", (600, 670), Palette15, 1.8), + 'K3': ("Kindle", (600, 800), Palette16, 1.8), + 'K45': ("Kindle", (600, 800), Palette16, 1.8), + 'KDX': ("Kindle DX/DXG", (824, 1000), Palette16, 1.8), + 'KPW': ("Kindle Paperwhite 1/2", (758, 1024), Palette16, 1.8), + 'KV': ("Kindle Paperwhite 3/Voyage/Oasis", (1072, 1448), Palette16, 1.8), + 'KoMT': ("Kobo Mini/Touch", (600, 800), Palette16, 1.8), + 'KoG': ("Kobo Glo", (768, 1024), Palette16, 1.8), + 'KoGHD': ("Kobo Glo HD", (1072, 1448), Palette16, 1.8), + 'KoA': ("Kobo Aura", (758, 1024), Palette16, 1.8), + 'KoAHD': ("Kobo Aura HD", (1080, 1440), Palette16, 1.8), + 'KoAH2O': ("Kobo Aura H2O", (1080, 1430), Palette16, 1.8), + 'KoAO': ("Kobo Aura ONE", (1404, 1872), Palette16, 1.8), + 'OTHER': ("Other", (0, 0), Palette16, 1.8), } @@ -105,8 +106,6 @@ class ComicPageParser: self.color = self.colorCheck() self.fill = self.fillCheck() self.splitCheck() - if self.opt.hqmode: - self.sizeCheck() def getImageHistogram(self, image): histogram = image.histogram() @@ -205,29 +204,16 @@ class ComicPageParser: else: return 'white' - def sizeCheck(self): - additionalPayload = [] - width, height = self.image.size - dstwidth, dstheight = self.size - for work in self.payload: - if width > dstwidth and height > dstheight: - additionalPayload.append([work[0] + '+', work[1], work[2].copy(), work[3], work[4]]) - self.payload = self.payload + additionalPayload - class ComicPage: def __init__(self, mode, path, image, color, fill, options): self.opt = options - _, self.size, self.palette, self.gamma, self.panelviewsize = self.opt.profileData + _, self.size, self.palette, self.gamma = self.opt.profileData self.image = image self.color = color self.fill = fill self.rotated = False self.orgPath = os.path.join(path[0], path[1]) - if '+' in mode: - self.hqMode = True - else: - self.hqMode = False if 'N' in mode: self.targetPath = os.path.join(path[0], os.path.splitext(path[1])[0]) + '-KCC' elif 'R' in mode: @@ -247,8 +233,6 @@ class ComicPage: flags.append('Rotated') if self.fill != 'white': flags.append('BlackFill') - if self.hqMode: - self.targetPath += '-HQ' if self.opt.forcepng: self.targetPath += '.png' self.image.save(self.targetPath, 'PNG', optimize=1) @@ -282,128 +266,69 @@ class ComicPage: self.image = self.image.quantize(palette=palImg) def resizeImage(self): - if self.hqMode: - size = (self.panelviewsize[0], self.panelviewsize[1]) - if self.image.size[0] > size[0] or self.image.size[1] > size[1]: - self.image.thumbnail(size, Image.LANCZOS) + if self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1]: + method = Image.BICUBIC else: - size = (self.size[0], self.size[1]) - if self.image.size[0] <= size[0] and self.image.size[1] <= size[1]: - method = Image.BICUBIC - else: - method = Image.LANCZOS - if self.opt.stretch: - self.image = self.image.resize(size, method) - elif self.image.size[0] <= size[0] and self.image.size[1] <= size[1] and not self.opt.upscale: - if self.opt.format == 'CBZ': - borderw = int((size[0] - self.image.size[0]) / 2) - borderh = int((size[1] - self.image.size[1]) / 2) - self.image = ImageOps.expand(self.image, border=(borderw, borderh), fill=self.fill) - if self.image.size[0] != size[0] or self.image.size[1] != size[1]: - self.image = ImageOps.fit(self.image, size, method=Image.BICUBIC, centering=(0.5, 0.5)) + method = Image.LANCZOS + if self.opt.stretch: + self.image = self.image.resize(self.size, method) + elif self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1] and not self.opt.upscale: + if self.opt.format == 'CBZ': + borderw = int((self.size[0] - self.image.size[0]) / 2) + borderh = int((self.size[1] - self.image.size[1]) / 2) + self.image = ImageOps.expand(self.image, border=(borderw, borderh), fill=self.fill) + if self.image.size[0] != self.size[0] or self.image.size[1] != self.size[1]: + self.image = ImageOps.fit(self.image, self.size, method=Image.BICUBIC, centering=(0.5, 0.5)) + else: + if self.opt.format == 'CBZ': + 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] + self.image = ImageOps.expand(self.image, border=(int(diff / 2), 0), fill=self.fill) + elif (float(self.image.size[0]) / float(self.image.size[1])) > ratioDev: + diff = int(self.image.size[0] / ratioDev) - self.image.size[1] + self.image = ImageOps.expand(self.image, border=(0, int(diff / 2)), fill=self.fill) + self.image = ImageOps.fit(self.image, self.size, method=method, centering=(0.5, 0.5)) else: - if self.opt.format == 'CBZ': - ratioDev = float(size[0]) / float(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] - self.image = ImageOps.expand(self.image, border=(int(diff / 2), 0), fill=self.fill) - elif (float(self.image.size[0]) / float(self.image.size[1])) > ratioDev: - diff = int(self.image.size[0] / ratioDev) - self.image.size[1] - self.image = ImageOps.expand(self.image, border=(0, int(diff / 2)), fill=self.fill) - self.image = ImageOps.fit(self.image, size, method=method, centering=(0.5, 0.5)) - else: - hpercent = size[1] / float(self.image.size[1]) - wsize = int((float(self.image.size[0]) * float(hpercent))) - self.image = self.image.resize((wsize, size[1]), method) - if self.image.size[0] > size[0] or self.image.size[1] > size[1]: - self.image.thumbnail(size, Image.LANCZOS) + hpercent = self.size[1] / float(self.image.size[1]) + wsize = int((float(self.image.size[0]) * float(hpercent))) + self.image = self.image.resize((wsize, self.size[1]), method) + if self.image.size[0] > self.size[0] or self.image.size[1] > self.size[1]: + self.image.thumbnail(self.size, Image.LANCZOS) - def cutPageNumber(self, fixedThreshold): - if ImageChops.invert(self.image).getbbox() is not None: - widthImg, heightImg = self.image.size - delta = 2 - diff = delta - 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 - 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 - 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)) + def getBoundingBox(self, tmpImg): + min_margin = [int(0.005 * i + 0.5) for i in tmpImg.size] + max_margin = [int(0.1 * i + 0.5) for i in tmpImg.size] + bbox = tmpImg.getbbox() + bbox = ( + max(0, min(max_margin[0], bbox[0] - min_margin[0])), + max(0, min(max_margin[1], bbox[1] - min_margin[1])), + min(tmpImg.size[0], + max(tmpImg.size[0] - max_margin[0], bbox[2] + min_margin[0])), + min(tmpImg.size[1], + max(tmpImg.size[1] - max_margin[1], bbox[3] + min_margin[1])), + ) + return bbox - def cropWhiteSpace(self, fixedThreshold): - 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] < fixedThreshold and diff < heightImg: - diff += delta - diff -= delta - 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] < fixedThreshold and diff < widthImg: - diff += delta - diff -= delta - 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] < fixedThreshold\ - and diff < heightImg: - diff += delta - diff -= delta - 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] < fixedThreshold\ - and diff < widthImg: - diff += delta - diff -= delta - self.image = self.image.crop((0, 0, widthImg - diff, heightImg)) + def cropPageNumber(self, power): + if self.fill != 'white': + tmpImg = self.image.convert(mode='L') + else: + tmpImg = ImageOps.invert(self.image.convert(mode='L')) + tmpImg = tmpImg.point(lambda x: x and 255) + tmpImg = tmpImg.filter(ImageFilter.MinFilter(size=3)) + tmpImg = tmpImg.filter(ImageFilter.GaussianBlur(radius=5)) + tmpImg = tmpImg.point(lambda x: (x >= 48 * power) and x) + self.image = self.image.crop(tmpImg.getbbox()) if tmpImg.getbbox() else self.image + + def cropMargin(self, power): + if self.fill != 'white': + tmpImg = self.image.convert(mode='L') + else: + tmpImg = ImageOps.invert(self.image.convert(mode='L')) + tmpImg = tmpImg.filter(ImageFilter.GaussianBlur(radius=3)) + tmpImg = tmpImg.point(lambda x: (x >= 16 * power) and x) + self.image = self.image.crop(self.getBoundingBox(tmpImg)) if tmpImg.getbbox() else self.image class Cover: diff --git a/kcc/shared.py b/kcc/shared.py index c149502..88d1782 100644 --- a/kcc/shared.py +++ b/kcc/shared.py @@ -144,8 +144,7 @@ def removeFromZIP(zipfname, *filenames): def sanitizeTrace(traceback): return ''.join(format_tb(traceback))\ - .replace('C:\\Users\\pawel\\Documents\\Projekty\\KCC\\', '') \ - .replace('C:\\Users\\Paweł\\Documents\\Projekty\\KCC\\', '') \ + .replace('C:\\Users\\Pawel\\Documents\\Projekty\\KCC\\', '') \ .replace('C:\\Python35\\', '')\ .replace('c:\\python35\\', '') |