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