From 79715c6a06fe02b7394ac2a40e389aade6552563 Mon Sep 17 00:00:00 2001 From: darodi <4682830+darodi@users.noreply.github.com> Date: Sun, 10 Apr 2022 17:43:21 +0200 Subject: [PATCH] add --mozjpeg option and GUI checkBox --- .gitignore | 4 +++- gui/KCC.ui | 10 ++++++++++ kindlecomicconverter/KCC_gui.py | 7 ++++++- kindlecomicconverter/KCC_ui.py | 7 ++++++- kindlecomicconverter/comic2ebook.py | 2 ++ kindlecomicconverter/image.py | 13 +++++++++++-- requirements.txt | 4 +++- 7 files changed, 41 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 3e74b4d..46a8f3b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ other/windows/kindlegen.exe dist/ build/ KindleComicConverter.egg-info/ -.idea/ \ No newline at end of file +.idea/ +/venv/ +/kindlegen.exe diff --git a/gui/KCC.ui b/gui/KCC.ui index 0f78f62..bbd698f 100644 --- a/gui/KCC.ui +++ b/gui/KCC.ui @@ -149,6 +149,16 @@ + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Off<br/></span>Faster</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - On<br/></span>10-20% smaller JPEG file, with the same image quality, but processing time multiplied by 2</p></body></html> + + + use mozJpeg + + + diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index 2dbcaf3..419a644 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -18,6 +18,7 @@ # PERFORMANCE OF THIS SOFTWARE. import os +import re import sys from urllib.parse import unquote from urllib.request import urlopen, urlretrieve, Request @@ -143,7 +144,9 @@ class VersionThread(QtCore.QThread): except Exception: return latestVersion = XML.childNodes[0].getElementsByTagName('LatestVersion')[0].childNodes[0].toxml() - if StrictVersion(latestVersion) > StrictVersion(__version__): + if ("beta" not in __version__ and StrictVersion(latestVersion) > StrictVersion(__version__)) \ + or ("beta" in __version__ + and StrictVersion(latestVersion) >= StrictVersion(re.sub(r'-beta.*', '', __version__))): if sys.platform.startswith('win'): self.newVersion = latestVersion self.md5 = XML.childNodes[0].getElementsByTagName('MD5')[0].childNodes[0].toxml() @@ -279,6 +282,8 @@ class WorkerThread(QtCore.QThread): options.forcecolor = True if GUI.disableProcessingBox.isChecked(): options.noprocessing = True + if GUI.mozJpegBox.isChecked(): + options.mozjpeg = True if GUI.currentMode > 2: options.customwidth = str(GUI.widthBox.value()) options.customheight = str(GUI.heightBox.value()) diff --git a/kindlecomicconverter/KCC_ui.py b/kindlecomicconverter/KCC_ui.py index 814c15c..21e310e 100644 --- a/kindlecomicconverter/KCC_ui.py +++ b/kindlecomicconverter/KCC_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'gui/KCC.ui' # -# Created by: PyQt5 UI code generator 5.15.2 +# Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. @@ -62,6 +62,9 @@ class Ui_mainWindow(object): self.disableProcessingBox = QtWidgets.QCheckBox(self.optionWidget) self.disableProcessingBox.setObjectName("disableProcessingBox") self.gridLayout_2.addWidget(self.disableProcessingBox, 3, 2, 1, 1) + self.mozJpegBox = QtWidgets.QCheckBox(self.optionWidget) + self.mozJpegBox.setObjectName("mozJpegBox") + self.gridLayout_2.addWidget(self.mozJpegBox, 3, 1, 1, 1) self.gridLayout.addWidget(self.optionWidget, 4, 0, 1, 2) self.gammaWidget = QtWidgets.QWidget(self.centralWidget) self.gammaWidget.setVisible(False) @@ -258,6 +261,8 @@ class Ui_mainWindow(object): self.qualityBox.setText(_translate("mainWindow", "Panel View 4/2/HQ")) self.disableProcessingBox.setToolTip(_translate("mainWindow", "

Do not process any image, ignore profil and processing options

")) self.disableProcessingBox.setText(_translate("mainWindow", "Disable processing")) + self.mozJpegBox.setToolTip(_translate("mainWindow", "

Unchecked - Off
Faster

Checked - On
10-20% smaller JPEG file, with the same image quality, but processing time multiplied by 2

")) + self.mozJpegBox.setText(_translate("mainWindow", "use mozJpeg")) self.gammaLabel.setText(_translate("mainWindow", "Gamma: Auto")) self.directoryButton.setToolTip(_translate("mainWindow", "

Add directory containing JPG, PNG or GIF files to queue.
CBR, CBZ and CB7 files inside will not be processed!

")) self.directoryButton.setText(_translate("mainWindow", "Add directory")) diff --git a/kindlecomicconverter/comic2ebook.py b/kindlecomicconverter/comic2ebook.py index dc57b4f..5f8649d 100755 --- a/kindlecomicconverter/comic2ebook.py +++ b/kindlecomicconverter/comic2ebook.py @@ -952,6 +952,8 @@ 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("--mozjpeg", action="store_true", dest="mozjpeg", default=False, + help="Create JPEG files using mozJpeg") customProfileOptions.add_option("--customwidth", type="int", dest="customwidth", default=0, help="Replace screen width provided by device profile") diff --git a/kindlecomicconverter/image.py b/kindlecomicconverter/image.py index 2bcee16..809fc9e 100755 --- a/kindlecomicconverter/image.py +++ b/kindlecomicconverter/image.py @@ -18,8 +18,9 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . - +import io import os +import mozjpeg_lossless_optimization from PIL import Image, ImageOps, ImageStat, ImageChops, ImageFilter from .shared import md5Checksum @@ -244,7 +245,15 @@ class ComicPage: self.image.save(self.targetPath, 'PNG', optimize=1) else: self.targetPath += '.jpg' - self.image.save(self.targetPath, 'JPEG', optimize=1, quality=85) + if self.opt.mozjpeg: + with io.BytesIO() as output: + self.image.save(output, format="JPEG", optimize=1, quality=85) + input_jpeg_bytes = output.getvalue() + output_jpeg_bytes = mozjpeg_lossless_optimization.optimize(input_jpeg_bytes) + with open(self.targetPath, "wb") as output_jpeg_file: + output_jpeg_file.write(output_jpeg_bytes) + else: + self.image.save(self.targetPath, 'JPEG', optimize=1, quality=85) return [md5Checksum(self.targetPath), flags, self.orgPath] except IOError as err: raise RuntimeError('Cannot save image. ' + str(err)) diff --git a/requirements.txt b/requirements.txt index 355db43..7a86437 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,6 @@ PyQt5>=5.6.0 Pillow>=5.2.0 psutil>=5.0.0 python-slugify>=1.2.1,<3.0.0 -raven>=6.0.0 \ No newline at end of file +raven>=6.0.0 +# PyQt5-tools +mozjpeg-lossless-optimization \ No newline at end of file