From e4c918f0f380e929d2f6416c2ab7977d03b8c5d1 Mon Sep 17 00:00:00 2001 From: Alex Xu Date: Sun, 12 Apr 2026 09:04:21 -0700 Subject: [PATCH] add webp output support (ignored for Kindle MOBI/EPUB and all PDF) (#1290) * add webp output support (ignored for Kindle MOBI/EPUB) * disable png extra optons by default * pdf webp is not supported --- README.md | 1 + gui/KCC.ui | 633 ++++++++++++++-------------- kindlecomicconverter/KCC_gui.py | 3 + kindlecomicconverter/KCC_ui.py | 532 +++++++++++------------ kindlecomicconverter/comic2ebook.py | 6 + kindlecomicconverter/image.py | 13 +- 6 files changed, 620 insertions(+), 568 deletions(-) diff --git a/README.md b/README.md index a01159d..a65f357 100644 --- a/README.md +++ b/README.md @@ -274,6 +274,7 @@ PROCESSING: --coverfill Center-crop only the cover to fill target device screen --forcecolor Don't convert images to grayscale --forcepng Create PNG files instead JPEG for black and white images + --webp Replace JPG with lossy WEBP and PNG with lossless WEBP --force-png-rgb Force color images to be saved as PNG --pnglegacy Use a more compatible 8 bit PNG instead of 4 bit. --noquantize Don't quantize PNG images to 16 colors diff --git a/gui/KCC.ui b/gui/KCC.ui index 1767b25..f7311c6 100644 --- a/gui/KCC.ui +++ b/gui/KCC.ui @@ -514,68 +514,13 @@ 0 - - + + - <html><head/><body><p>When the spread splitter option is partially checked,</p><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Rotate Last<br/></span>Put the rotated 2 page spread after the split spreads.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Rotate First<br/></span>Put the rotated 2 page spread before the split spreads.</p></body></html> + Do not rotate double page spreads in spread splitter option. - Rotate First - - - - - - - <html><head/><body><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Unchecked - Automatic mode<br/></span>The output will be split automatically.</p><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Checked - Volume mode<br/></span>Every subdirectory will be considered as a separate volume.</p></body></html> - - - Output split - - - - - - - Render vector PDFs to device width instead of height. - -Useful if you plan to crop a little off the top and bottom to fill screen. - - - PDF Width Render - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Autodetection<br/></span>The color of margins fill will be detected automatically.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - White<br/></span>Margins will be untouched.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Black<br/></span>Margins will be filled with black color.</p></body></html> - - - W/B margins - - - true - - - - - - - Delete input file(s) or directory. It's not recoverable! - - - Delete input - - - - - - - Shift first page to opposite side in landscape for two page spread alignment - - - Spread shift + No rotate @@ -589,6 +534,89 @@ Useful if you plan to crop a little off the top and bottom to fill screen. + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Split<br/></span>Double page spreads will be cut into two separate pages.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Split and rotate<br/></span>Double page spreads will be displayed twice. First split and then rotated. </p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Rotate<br/></span>Double page spreads will be rotated.</p></body></html> + + + Spread splitter + + + true + + + + + + + false + + + Use a more compatible 8 bit PNG instead of 4 bit. + + + PNG Legacy Mode + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Disabled<br/></span>Disabled</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Horizontal<br/></span>Crop empty horizontal lines.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Both<br/></span>Crop empty horizontal and vertical lines.</p></body></html> + + + Inter-panel crop + + + true + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::ClickFocus + + + <html><head/><body><p>Default Title</p></body></html> + + + Default Title + + + false + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::ClickFocus + + + Default Author is KCC + + + Default Author + + + false + + + @@ -599,13 +627,81 @@ Useful if you plan to crop a little off the top and bottom to fill screen. - - + + - Do not rotate double page spreads in spread splitter option. + <html><head/><body><p>Combines all selected files into a single file. (Helpful for combining chapters into volumes.)</p></body></html> - No rotate + File Fusion + + + + + + + Delete input file(s) or directory. It's not recoverable! + + + Delete input + + + + + + + <html><head/><body><p>Set a custom gamma correction.</p><p>1.0 is default (disabled).<br/>&lt; 1.0 makes the image brighter.<br/>&gt; 1.0 makes the image darker. </p><p>1.8 was the default in KCC 9.1.0 and earlier.</p><p>Use if you want to make midtones darker.</p></body></html> + + + Custom gamma + + + + + + + false + + + Don't quantize PNG images to 16 colors (4 bit) + +This will double file size but preserve all 256 colors (8 bit). + +Eink only has 16 shades of gray so you probably don't want this. + + + No Quantize + + + + + + + Erase rainbow effect on color eink screen by attenuating interfering frequencies + + + Rainbow eraser + + + + + + + Resize cover to exact device resolution by center-cropping to aspect ratio first. +May crop top/bottom or left/right depending on source aspect ratio. Not implemented for Kindle Scribe. + + + Cover Fill + + + + + + + Rotate 2 page spreads in opposite direction than normal. + + + Rotate Right @@ -619,17 +715,26 @@ Useful if you plan to crop a little off the top and bottom to fill screen. - - + + - Don't quantize PNG images to 16 colors (4 bit) - -This will double file size but preserve all 256 colors (8 bit). - -Eink only has 16 shades of gray so you probably don't want this. + Shift first page to opposite side in landscape for two page spread alignment - No Quantize + Spread shift + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Disabled</span></p><p>Disabled</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Margins<br/></span>Margins</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Margins + page numbers<br/></span>Margins +page numbers</p></body></html> + + + Cropping mode + + + true @@ -647,6 +752,136 @@ Higher values are larger and higher quality, and may resolve blank page issues.< + + + + <html><head/><body><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Unchecked - Automatic mode<br/></span>The output will be split automatically.</p><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Checked - Volume mode<br/></span>Every subdirectory will be considered as a separate volume.</p></body></html> + + + Output split + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Don't use metadata Title<br/></span>Write default title.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Add metadata Title to the default schema<br/></span>Write default title with Title from ComicInfo.xml or other embedded metadata.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Use metadata Title only<br/></span>Write Title from ComicInfo.xml or other embedded metadata.</p></body></html> + + + Metadata Title + + + true + + + + + + + Attempt to crop main cover from wide image. + + + Smart Cover Crop + + + + + + + <html><head/><body><p>When the spread splitter option is partially checked,</p><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Rotate Last<br/></span>Put the rotated 2 page spread after the split spreads.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Rotate First<br/></span>Put the rotated 2 page spread before the split spreads.</p></body></html> + + + Rotate First + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - JPEG<br/></span>Use JPEG files</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - force PNG<br/></span>Create PNG files instead JPEG for black and white images</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - mozJpeg<br/></span>10-20% smaller JPEG file, with the same image quality, but processing time multiplied by 2</p></body></html> + + + JPEG/PNG/mozJpeg + + + true + + + + + + + <html><head/><body><p>By default, KCC maps the darkest pixel value to pure black (the black point.)</p><p>Extreme black point sets the black point to be the most common dark pixel value.</p><p>Useful when text is black but artwork is gray.</p></body></html> + + + Extreme Black Point + + + + + + + false + + + Force full color images to be saved in lossless PNG format, dramatically increases the filesize. + + + Force PNG RGB + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Nothing<br/></span>Images smaller than device resolution will not be resized.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Stretching<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be not preserved.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Upscaling<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be preserved.</p></body></html> + + + Stretch/Upscale + + + true + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Autodetection<br/></span>The color of margins fill will be detected automatically.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - White<br/></span>Margins will be untouched.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Black<br/></span>Margins will be filled with black color.</p></body></html> + + + W/B margins + + + true + + + + + + + <html><head/><body><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Unchecked - 4 panels<br/></span>Zoom each corner separately.</p><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Indeterminate - 2 panels<br/></span>Zoom only the top and bottom of the page.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - 4 high-quality panels<br/></span>Zoom each corner separately. Try to increase the quality of magnification. Check wiki for more details.</p></body></html> + + + Panel View 4/2/HQ + + + true + + + + + + + Use the PDF image extraction method from KCC 8 and earlier. + +Useful for really weird PDFs. + + + PDF Legacy Extract + + + @@ -657,6 +892,18 @@ Higher values are larger and higher quality, and may resolve blank page issues.< + + + + Render vector PDFs to device width instead of height. + +Useful if you plan to crop a little off the top and bottom to fill screen. + + + PDF Width Render + + + @@ -724,16 +971,13 @@ Higher values are larger and higher quality, and may resolve blank page issues.< - - + + - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Don't use metadata Title<br/></span>Write default title.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Add metadata Title to the default schema<br/></span>Write default title with Title from ComicInfo.xml or other embedded metadata.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Use metadata Title only<br/></span>Write Title from ComicInfo.xml or other embedded metadata.</p></body></html> + <html><head/><body><p><span style=" font-weight:700; text-decoration: underline;">Unchecked<br/></span>Maximal output file size is 100 MB for Webtoon, 400 MB for others before split occurs.</p><p><span style=" font-weight:700; text-decoration: underline;">Checked</span><br/>Output file size specified in &quot;Chunk size MB&quot; before split occurs.</p></body></html> - Metadata Title - - - true + Chunk size @@ -750,238 +994,15 @@ Higher values are larger and higher quality, and may resolve blank page issues.< - - + + - Use the PDF image extraction method from KCC 8 and earlier. + Replace JPG with lossy WebP and PNG with lossless WebP. This includes the JPG Quality. -Useful for really weird PDFs. +Ignored for Kindle EPUB/MOBI and all PDF. - PDF Legacy Extract - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Nothing<br/></span>Images smaller than device resolution will not be resized.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Stretching<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be not preserved.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Upscaling<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be preserved.</p></body></html> - - - Stretch/Upscale - - - true - - - - - - - <html><head/><body><p><span style=" font-weight:700; text-decoration: underline;">Unchecked<br/></span>Maximal output file size is 100 MB for Webtoon, 400 MB for others before split occurs.</p><p><span style=" font-weight:700; text-decoration: underline;">Checked</span><br/>Output file size specified in &quot;Chunk size MB&quot; before split occurs.</p></body></html> - - - Chunk size - - - - - - - <html><head/><body><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Unchecked - 4 panels<br/></span>Zoom each corner separately.</p><p style='white-space:pre'><span style=" font-weight:600; text-decoration: underline;">Indeterminate - 2 panels<br/></span>Zoom only the top and bottom of the page.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - 4 high-quality panels<br/></span>Zoom each corner separately. Try to increase the quality of magnification. Check wiki for more details.</p></body></html> - - - Panel View 4/2/HQ - - - true - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - JPEG<br/></span>Use JPEG files</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - force PNG<br/></span>Create PNG files instead JPEG for black and white images</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - mozJpeg<br/></span>10-20% smaller JPEG file, with the same image quality, but processing time multiplied by 2</p></body></html> - - - JPEG/PNG/mozJpeg - - - true - - - - - - - - 0 - 0 - - - - Qt::FocusPolicy::ClickFocus - - - <html><head/><body><p>Default Title</p></body></html> - - - Default Title - - - false - - - - - - - Erase rainbow effect on color eink screen by attenuating interfering frequencies - - - Rainbow eraser - - - - - - - <html><head/><body><p>Combines all selected files into a single file. (Helpful for combining chapters into volumes.)</p></body></html> - - - File Fusion - - - - - - - Resize cover to exact device resolution by center-cropping to aspect ratio first. -May crop top/bottom or left/right depending on source aspect ratio. Not implemented for Kindle Scribe. - - - Cover Fill - - - - - - - Rotate 2 page spreads in opposite direction than normal. - - - Rotate Right - - - - - - - <html><head/><body><p>Set a custom gamma correction.</p><p>1.0 is default (disabled).<br/>&lt; 1.0 makes the image brighter.<br/>&gt; 1.0 makes the image darker. </p><p>1.8 was the default in KCC 9.1.0 and earlier.</p><p>Use if you want to make midtones darker.</p></body></html> - - - Custom gamma - - - - - - - <html><head/><body><p>By default, KCC maps the darkest pixel value to pure black (the black point.)</p><p>Extreme black point sets the black point to be the most common dark pixel value.</p><p>Useful when text is black but artwork is gray.</p></body></html> - - - Extreme Black Point - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Disabled<br/></span>Disabled</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Horizontal<br/></span>Crop empty horizontal lines.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Both<br/></span>Crop empty horizontal and vertical lines.</p></body></html> - - - Inter-panel crop - - - true - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Split<br/></span>Double page spreads will be cut into two separate pages.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Split and rotate<br/></span>Double page spreads will be displayed twice. First split and then rotated. </p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Rotate<br/></span>Double page spreads will be rotated.</p></body></html> - - - Spread splitter - - - true - - - - - - - - 0 - 0 - - - - Qt::FocusPolicy::ClickFocus - - - Default Author is KCC - - - Default Author - - - false - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Disabled</span></p><p>Disabled</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Margins<br/></span>Margins</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Margins + page numbers<br/></span>Margins +page numbers</p></body></html> - - - Cropping mode - - - true - - - - - - - Use a more compatible 8 bit PNG instead of 4 bit. - - - PNG Legacy Mode - - - - - - - Force full color images to be saved in lossless PNG format, dramatically increases the filesize. - - - Force PNG RGB - - - - - - - Attempt to crop main cover from wide image. - - - Smart Cover Crop + WebP (experimental) diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index 54aff4e..4dc4d01 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -359,6 +359,8 @@ class WorkerThread(QThread): options.forcepng = True elif GUI.mozJpegBox.checkState() == Qt.CheckState.Checked: options.mozjpeg = True + if GUI.webpBox.isChecked(): + options.webp = True if GUI.pngLegacyBox.isChecked(): options.pnglegacy = True if GUI.noQuantizeBox.isChecked(): @@ -1068,6 +1070,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): 'metadataTitleBox': GUI.metadataTitleBox.checkState(), 'mozJpegBox': GUI.mozJpegBox.checkState(), 'forcePngRgbBox': GUI.forcePngRgbBox.checkState(), + 'webpBox': GUI.webpBox.checkState(), 'pngLegacyBox': GUI.pngLegacyBox.checkState(), 'noQuantizeBox': GUI.noQuantizeBox.checkState(), 'jpegQualityBox': GUI.jpegQualityBox.checkState(), diff --git a/kindlecomicconverter/KCC_ui.py b/kindlecomicconverter/KCC_ui.py index 473a2e9..7d5b38c 100644 --- a/kindlecomicconverter/KCC_ui.py +++ b/kindlecomicconverter/KCC_ui.py @@ -287,20 +287,157 @@ class Ui_mainWindow(object): self.gridLayout_2 = QGridLayout(self.optionWidget) self.gridLayout_2.setObjectName(u"gridLayout_2") self.gridLayout_2.setContentsMargins(0, 0, 0, 0) - self.rotateFirstBox = QCheckBox(self.optionWidget) - self.rotateFirstBox.setObjectName(u"rotateFirstBox") + self.noRotateBox = QCheckBox(self.optionWidget) + self.noRotateBox.setObjectName(u"noRotateBox") - self.gridLayout_2.addWidget(self.rotateFirstBox, 8, 1, 1, 1) + self.gridLayout_2.addWidget(self.noRotateBox, 6, 1, 1, 1) + + self.maximizeStrips = QCheckBox(self.optionWidget) + self.maximizeStrips.setObjectName(u"maximizeStrips") + + self.gridLayout_2.addWidget(self.maximizeStrips, 4, 1, 1, 1) + + self.rotateBox = QCheckBox(self.optionWidget) + self.rotateBox.setObjectName(u"rotateBox") + self.rotateBox.setTristate(True) + + self.gridLayout_2.addWidget(self.rotateBox, 1, 1, 1, 1) + + self.pngLegacyBox = QCheckBox(self.optionWidget) + self.pngLegacyBox.setObjectName(u"pngLegacyBox") + self.pngLegacyBox.setEnabled(False) + + self.gridLayout_2.addWidget(self.pngLegacyBox, 11, 0, 1, 1) + + self.interPanelCropBox = QCheckBox(self.optionWidget) + self.interPanelCropBox.setObjectName(u"interPanelCropBox") + self.interPanelCropBox.setTristate(True) + + self.gridLayout_2.addWidget(self.interPanelCropBox, 6, 2, 1, 1) + + self.titleEdit = QLineEdit(self.optionWidget) + self.titleEdit.setObjectName(u"titleEdit") + sizePolicy4.setHeightForWidth(self.titleEdit.sizePolicy().hasHeightForWidth()) + self.titleEdit.setSizePolicy(sizePolicy4) + self.titleEdit.setFocusPolicy(Qt.FocusPolicy.ClickFocus) + self.titleEdit.setClearButtonEnabled(False) + + self.gridLayout_2.addWidget(self.titleEdit, 0, 0, 1, 1) + + self.authorEdit = QLineEdit(self.optionWidget) + self.authorEdit.setObjectName(u"authorEdit") + sizePolicy4.setHeightForWidth(self.authorEdit.sizePolicy().hasHeightForWidth()) + self.authorEdit.setSizePolicy(sizePolicy4) + self.authorEdit.setFocusPolicy(Qt.FocusPolicy.ClickFocus) + self.authorEdit.setClearButtonEnabled(False) + + self.gridLayout_2.addWidget(self.authorEdit, 0, 1, 1, 1) + + self.webtoonBox = QCheckBox(self.optionWidget) + self.webtoonBox.setObjectName(u"webtoonBox") + + self.gridLayout_2.addWidget(self.webtoonBox, 2, 0, 1, 1) + + self.fileFusionBox = QCheckBox(self.optionWidget) + self.fileFusionBox.setObjectName(u"fileFusionBox") + + self.gridLayout_2.addWidget(self.fileFusionBox, 6, 0, 1, 1) + + self.deleteBox = QCheckBox(self.optionWidget) + self.deleteBox.setObjectName(u"deleteBox") + + self.gridLayout_2.addWidget(self.deleteBox, 5, 1, 1, 1) + + self.gammaBox = QCheckBox(self.optionWidget) + self.gammaBox.setObjectName(u"gammaBox") + + self.gridLayout_2.addWidget(self.gammaBox, 2, 2, 1, 1) + + self.noQuantizeBox = QCheckBox(self.optionWidget) + self.noQuantizeBox.setObjectName(u"noQuantizeBox") + self.noQuantizeBox.setEnabled(False) + + self.gridLayout_2.addWidget(self.noQuantizeBox, 10, 2, 1, 1) + + self.eraseRainbowBox = QCheckBox(self.optionWidget) + self.eraseRainbowBox.setObjectName(u"eraseRainbowBox") + + self.gridLayout_2.addWidget(self.eraseRainbowBox, 7, 2, 1, 1) + + self.coverFillBox = QCheckBox(self.optionWidget) + self.coverFillBox.setObjectName(u"coverFillBox") + + self.gridLayout_2.addWidget(self.coverFillBox, 9, 1, 1, 1) + + self.rotateRightBox = QCheckBox(self.optionWidget) + self.rotateRightBox.setObjectName(u"rotateRightBox") + + self.gridLayout_2.addWidget(self.rotateRightBox, 10, 1, 1, 1) + + self.mangaBox = QCheckBox(self.optionWidget) + self.mangaBox.setObjectName(u"mangaBox") + + self.gridLayout_2.addWidget(self.mangaBox, 1, 0, 1, 1) + + self.spreadShiftBox = QCheckBox(self.optionWidget) + self.spreadShiftBox.setObjectName(u"spreadShiftBox") + + self.gridLayout_2.addWidget(self.spreadShiftBox, 5, 0, 1, 1) + + self.croppingBox = QCheckBox(self.optionWidget) + self.croppingBox.setObjectName(u"croppingBox") + self.croppingBox.setTristate(True) + + self.gridLayout_2.addWidget(self.croppingBox, 4, 2, 1, 1) + + self.jpegQualityBox = QCheckBox(self.optionWidget) + self.jpegQualityBox.setObjectName(u"jpegQualityBox") + + self.gridLayout_2.addWidget(self.jpegQualityBox, 8, 0, 1, 1) self.outputSplit = QCheckBox(self.optionWidget) self.outputSplit.setObjectName(u"outputSplit") self.gridLayout_2.addWidget(self.outputSplit, 3, 1, 1, 1) - self.pdfWidthBox = QCheckBox(self.optionWidget) - self.pdfWidthBox.setObjectName(u"pdfWidthBox") + self.metadataTitleBox = QCheckBox(self.optionWidget) + self.metadataTitleBox.setObjectName(u"metadataTitleBox") + self.metadataTitleBox.setTristate(True) - self.gridLayout_2.addWidget(self.pdfWidthBox, 10, 0, 1, 1) + self.gridLayout_2.addWidget(self.metadataTitleBox, 7, 0, 1, 1) + + self.smartCoverCropBox = QCheckBox(self.optionWidget) + self.smartCoverCropBox.setObjectName(u"smartCoverCropBox") + + self.gridLayout_2.addWidget(self.smartCoverCropBox, 11, 1, 1, 1) + + self.rotateFirstBox = QCheckBox(self.optionWidget) + self.rotateFirstBox.setObjectName(u"rotateFirstBox") + + self.gridLayout_2.addWidget(self.rotateFirstBox, 8, 1, 1, 1) + + self.mozJpegBox = QCheckBox(self.optionWidget) + self.mozJpegBox.setObjectName(u"mozJpegBox") + self.mozJpegBox.setTristate(True) + + self.gridLayout_2.addWidget(self.mozJpegBox, 4, 0, 1, 1) + + self.autoLevelBox = QCheckBox(self.optionWidget) + self.autoLevelBox.setObjectName(u"autoLevelBox") + + self.gridLayout_2.addWidget(self.autoLevelBox, 8, 2, 1, 1) + + self.forcePngRgbBox = QCheckBox(self.optionWidget) + self.forcePngRgbBox.setObjectName(u"forcePngRgbBox") + self.forcePngRgbBox.setEnabled(False) + + self.gridLayout_2.addWidget(self.forcePngRgbBox, 11, 2, 1, 1) + + self.upscaleBox = QCheckBox(self.optionWidget) + self.upscaleBox.setObjectName(u"upscaleBox") + self.upscaleBox.setTristate(True) + + self.gridLayout_2.addWidget(self.upscaleBox, 2, 1, 1, 1) self.borderBox = QCheckBox(self.optionWidget) self.borderBox.setObjectName(u"borderBox") @@ -308,51 +445,27 @@ class Ui_mainWindow(object): self.gridLayout_2.addWidget(self.borderBox, 3, 0, 1, 1) - self.deleteBox = QCheckBox(self.optionWidget) - self.deleteBox.setObjectName(u"deleteBox") + self.qualityBox = QCheckBox(self.optionWidget) + self.qualityBox.setObjectName(u"qualityBox") + self.qualityBox.setTristate(True) - self.gridLayout_2.addWidget(self.deleteBox, 5, 1, 1, 1) + self.gridLayout_2.addWidget(self.qualityBox, 1, 2, 1, 1) - self.spreadShiftBox = QCheckBox(self.optionWidget) - self.spreadShiftBox.setObjectName(u"spreadShiftBox") + self.pdfExtractBox = QCheckBox(self.optionWidget) + self.pdfExtractBox.setObjectName(u"pdfExtractBox") - self.gridLayout_2.addWidget(self.spreadShiftBox, 5, 0, 1, 1) - - self.maximizeStrips = QCheckBox(self.optionWidget) - self.maximizeStrips.setObjectName(u"maximizeStrips") - - self.gridLayout_2.addWidget(self.maximizeStrips, 4, 1, 1, 1) - - self.webtoonBox = QCheckBox(self.optionWidget) - self.webtoonBox.setObjectName(u"webtoonBox") - - self.gridLayout_2.addWidget(self.webtoonBox, 2, 0, 1, 1) - - self.noRotateBox = QCheckBox(self.optionWidget) - self.noRotateBox.setObjectName(u"noRotateBox") - - self.gridLayout_2.addWidget(self.noRotateBox, 6, 1, 1, 1) - - self.mangaBox = QCheckBox(self.optionWidget) - self.mangaBox.setObjectName(u"mangaBox") - - self.gridLayout_2.addWidget(self.mangaBox, 1, 0, 1, 1) - - self.noQuantizeBox = QCheckBox(self.optionWidget) - self.noQuantizeBox.setObjectName(u"noQuantizeBox") - - self.gridLayout_2.addWidget(self.noQuantizeBox, 10, 2, 1, 1) - - self.jpegQualityBox = QCheckBox(self.optionWidget) - self.jpegQualityBox.setObjectName(u"jpegQualityBox") - - self.gridLayout_2.addWidget(self.jpegQualityBox, 8, 0, 1, 1) + self.gridLayout_2.addWidget(self.pdfExtractBox, 9, 0, 1, 1) self.colorBox = QCheckBox(self.optionWidget) self.colorBox.setObjectName(u"colorBox") self.gridLayout_2.addWidget(self.colorBox, 3, 2, 1, 1) + self.pdfWidthBox = QCheckBox(self.optionWidget) + self.pdfWidthBox.setObjectName(u"pdfWidthBox") + + self.gridLayout_2.addWidget(self.pdfWidthBox, 10, 0, 1, 1) + self.disableProcessingBox = QCheckBox(self.optionWidget) self.disableProcessingBox.setObjectName(u"disableProcessingBox") @@ -381,11 +494,10 @@ class Ui_mainWindow(object): self.gridLayout_2.addWidget(self.outputFolderWidget, 0, 2, 1, 1) - self.metadataTitleBox = QCheckBox(self.optionWidget) - self.metadataTitleBox.setObjectName(u"metadataTitleBox") - self.metadataTitleBox.setTristate(True) + self.chunkSizeCheckBox = QCheckBox(self.optionWidget) + self.chunkSizeCheckBox.setObjectName(u"chunkSizeCheckBox") - self.gridLayout_2.addWidget(self.metadataTitleBox, 7, 0, 1, 1) + self.gridLayout_2.addWidget(self.chunkSizeCheckBox, 7, 1, 1, 1) self.autocontrastBox = QCheckBox(self.optionWidget) self.autocontrastBox.setObjectName(u"autocontrastBox") @@ -393,114 +505,10 @@ class Ui_mainWindow(object): self.gridLayout_2.addWidget(self.autocontrastBox, 9, 2, 1, 1) - self.pdfExtractBox = QCheckBox(self.optionWidget) - self.pdfExtractBox.setObjectName(u"pdfExtractBox") + self.webpBox = QCheckBox(self.optionWidget) + self.webpBox.setObjectName(u"webpBox") - self.gridLayout_2.addWidget(self.pdfExtractBox, 9, 0, 1, 1) - - self.upscaleBox = QCheckBox(self.optionWidget) - self.upscaleBox.setObjectName(u"upscaleBox") - self.upscaleBox.setTristate(True) - - self.gridLayout_2.addWidget(self.upscaleBox, 2, 1, 1, 1) - - self.chunkSizeCheckBox = QCheckBox(self.optionWidget) - self.chunkSizeCheckBox.setObjectName(u"chunkSizeCheckBox") - - self.gridLayout_2.addWidget(self.chunkSizeCheckBox, 7, 1, 1, 1) - - self.qualityBox = QCheckBox(self.optionWidget) - self.qualityBox.setObjectName(u"qualityBox") - self.qualityBox.setTristate(True) - - self.gridLayout_2.addWidget(self.qualityBox, 1, 2, 1, 1) - - self.mozJpegBox = QCheckBox(self.optionWidget) - self.mozJpegBox.setObjectName(u"mozJpegBox") - self.mozJpegBox.setTristate(True) - - self.gridLayout_2.addWidget(self.mozJpegBox, 4, 0, 1, 1) - - self.titleEdit = QLineEdit(self.optionWidget) - self.titleEdit.setObjectName(u"titleEdit") - sizePolicy4.setHeightForWidth(self.titleEdit.sizePolicy().hasHeightForWidth()) - self.titleEdit.setSizePolicy(sizePolicy4) - self.titleEdit.setFocusPolicy(Qt.FocusPolicy.ClickFocus) - self.titleEdit.setClearButtonEnabled(False) - - self.gridLayout_2.addWidget(self.titleEdit, 0, 0, 1, 1) - - self.eraseRainbowBox = QCheckBox(self.optionWidget) - self.eraseRainbowBox.setObjectName(u"eraseRainbowBox") - - self.gridLayout_2.addWidget(self.eraseRainbowBox, 7, 2, 1, 1) - - self.fileFusionBox = QCheckBox(self.optionWidget) - self.fileFusionBox.setObjectName(u"fileFusionBox") - - self.gridLayout_2.addWidget(self.fileFusionBox, 6, 0, 1, 1) - - self.coverFillBox = QCheckBox(self.optionWidget) - self.coverFillBox.setObjectName(u"coverFillBox") - - self.gridLayout_2.addWidget(self.coverFillBox, 9, 1, 1, 1) - - self.rotateRightBox = QCheckBox(self.optionWidget) - self.rotateRightBox.setObjectName(u"rotateRightBox") - - self.gridLayout_2.addWidget(self.rotateRightBox, 10, 1, 1, 1) - - self.gammaBox = QCheckBox(self.optionWidget) - self.gammaBox.setObjectName(u"gammaBox") - - self.gridLayout_2.addWidget(self.gammaBox, 2, 2, 1, 1) - - self.autoLevelBox = QCheckBox(self.optionWidget) - self.autoLevelBox.setObjectName(u"autoLevelBox") - - self.gridLayout_2.addWidget(self.autoLevelBox, 8, 2, 1, 1) - - self.interPanelCropBox = QCheckBox(self.optionWidget) - self.interPanelCropBox.setObjectName(u"interPanelCropBox") - self.interPanelCropBox.setTristate(True) - - self.gridLayout_2.addWidget(self.interPanelCropBox, 6, 2, 1, 1) - - self.rotateBox = QCheckBox(self.optionWidget) - self.rotateBox.setObjectName(u"rotateBox") - self.rotateBox.setTristate(True) - - self.gridLayout_2.addWidget(self.rotateBox, 1, 1, 1, 1) - - self.authorEdit = QLineEdit(self.optionWidget) - self.authorEdit.setObjectName(u"authorEdit") - sizePolicy4.setHeightForWidth(self.authorEdit.sizePolicy().hasHeightForWidth()) - self.authorEdit.setSizePolicy(sizePolicy4) - self.authorEdit.setFocusPolicy(Qt.FocusPolicy.ClickFocus) - self.authorEdit.setClearButtonEnabled(False) - - self.gridLayout_2.addWidget(self.authorEdit, 0, 1, 1, 1) - - self.croppingBox = QCheckBox(self.optionWidget) - self.croppingBox.setObjectName(u"croppingBox") - self.croppingBox.setTristate(True) - - self.gridLayout_2.addWidget(self.croppingBox, 4, 2, 1, 1) - - self.pngLegacyBox = QCheckBox(self.optionWidget) - self.pngLegacyBox.setObjectName(u"pngLegacyBox") - - self.gridLayout_2.addWidget(self.pngLegacyBox, 11, 0, 1, 1) - - self.forcePngRgbBox = QCheckBox(self.optionWidget) - self.forcePngRgbBox.setObjectName(u"forcePngRgbBox") - - self.gridLayout_2.addWidget(self.forcePngRgbBox, 11, 2, 1, 1) - - self.smartCoverCropBox = QCheckBox(self.optionWidget) - self.smartCoverCropBox.setObjectName(u"smartCoverCropBox") - - self.gridLayout_2.addWidget(self.smartCoverCropBox, 11, 1, 1, 1) + self.gridLayout_2.addWidget(self.webpBox, 12, 0, 1, 1) self.gridLayout.addWidget(self.optionWidget, 5, 0, 1, 2) @@ -655,47 +663,49 @@ class Ui_mainWindow(object): self.chunkSizeLabel.setText(QCoreApplication.translate("mainWindow", u"Chunk size MB:", None)) self.chunkSizeWarnLabel.setText(QCoreApplication.translate("mainWindow", u"Greater than default may cause performance issues on older ereaders.", None)) #if QT_CONFIG(tooltip) - self.rotateFirstBox.setToolTip(QCoreApplication.translate("mainWindow", u"

When the spread splitter option is partially checked,

Unchecked - Rotate Last
Put the rotated 2 page spread after the split spreads.

Checked - Rotate First
Put the rotated 2 page spread before the split spreads.

", None)) + self.noRotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"Do not rotate double page spreads in spread splitter option.", None)) #endif // QT_CONFIG(tooltip) - self.rotateFirstBox.setText(QCoreApplication.translate("mainWindow", u"Rotate First", None)) -#if QT_CONFIG(tooltip) - self.outputSplit.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Automatic mode
The output will be split automatically.

Checked - Volume mode
Every subdirectory will be considered as a separate volume.

", None)) -#endif // QT_CONFIG(tooltip) - self.outputSplit.setText(QCoreApplication.translate("mainWindow", u"Output split", None)) -#if QT_CONFIG(tooltip) - self.pdfWidthBox.setToolTip(QCoreApplication.translate("mainWindow", u"Render vector PDFs to device width instead of height.\n" -"\n" -"Useful if you plan to crop a little off the top and bottom to fill screen.", None)) -#endif // QT_CONFIG(tooltip) - self.pdfWidthBox.setText(QCoreApplication.translate("mainWindow", u"PDF Width Render", None)) -#if QT_CONFIG(tooltip) - self.borderBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Autodetection
The color of margins fill will be detected automatically.

Indeterminate - White
Margins will be untouched.

Checked - Black
Margins will be filled with black color.

", None)) -#endif // QT_CONFIG(tooltip) - self.borderBox.setText(QCoreApplication.translate("mainWindow", u"W/B margins", None)) -#if QT_CONFIG(tooltip) - self.deleteBox.setToolTip(QCoreApplication.translate("mainWindow", u"Delete input file(s) or directory. It's not recoverable!", None)) -#endif // QT_CONFIG(tooltip) - self.deleteBox.setText(QCoreApplication.translate("mainWindow", u"Delete input", None)) -#if QT_CONFIG(tooltip) - self.spreadShiftBox.setToolTip(QCoreApplication.translate("mainWindow", u"Shift first page to opposite side in landscape for two page spread alignment", None)) -#endif // QT_CONFIG(tooltip) - self.spreadShiftBox.setText(QCoreApplication.translate("mainWindow", u"Spread shift", None)) + self.noRotateBox.setText(QCoreApplication.translate("mainWindow", u"No rotate", None)) #if QT_CONFIG(tooltip) self.maximizeStrips.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - 1x4
Keep format 1x4 panels strips.

Checked - 2x2
Turn 1x4 strips to 2x2 to maximize screen usage.

", None)) #endif // QT_CONFIG(tooltip) self.maximizeStrips.setText(QCoreApplication.translate("mainWindow", u"1x4 to 2x2 strips", None)) +#if QT_CONFIG(tooltip) + self.rotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Split
Double page spreads will be cut into two separate pages.

Indeterminate - Split and rotate
Double page spreads will be displayed twice. First split and then rotated.

Checked - Rotate
Double page spreads will be rotated.

", None)) +#endif // QT_CONFIG(tooltip) + self.rotateBox.setText(QCoreApplication.translate("mainWindow", u"Spread splitter", None)) +#if QT_CONFIG(tooltip) + self.pngLegacyBox.setToolTip(QCoreApplication.translate("mainWindow", u"Use a more compatible 8 bit PNG instead of 4 bit.", None)) +#endif // QT_CONFIG(tooltip) + self.pngLegacyBox.setText(QCoreApplication.translate("mainWindow", u"PNG Legacy Mode", None)) +#if QT_CONFIG(tooltip) + self.interPanelCropBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Disabled
Disabled

Indeterminate - Horizontal
Crop empty horizontal lines.

Checked - Both
Crop empty horizontal and vertical lines.

", None)) +#endif // QT_CONFIG(tooltip) + self.interPanelCropBox.setText(QCoreApplication.translate("mainWindow", u"Inter-panel crop", None)) +#if QT_CONFIG(tooltip) + self.titleEdit.setToolTip(QCoreApplication.translate("mainWindow", u"

Default Title

", None)) +#endif // QT_CONFIG(tooltip) + self.titleEdit.setPlaceholderText(QCoreApplication.translate("mainWindow", u"Default Title", None)) +#if QT_CONFIG(tooltip) + self.authorEdit.setToolTip(QCoreApplication.translate("mainWindow", u"Default Author is KCC", None)) +#endif // QT_CONFIG(tooltip) + self.authorEdit.setPlaceholderText(QCoreApplication.translate("mainWindow", u"Default Author", None)) #if QT_CONFIG(tooltip) self.webtoonBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Enable special parsing mode for Korean Webtoons.

", None)) #endif // QT_CONFIG(tooltip) self.webtoonBox.setText(QCoreApplication.translate("mainWindow", u"Webtoon mode", None)) #if QT_CONFIG(tooltip) - self.noRotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"Do not rotate double page spreads in spread splitter option.", None)) + self.fileFusionBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Combines all selected files into a single file. (Helpful for combining chapters into volumes.)

", None)) #endif // QT_CONFIG(tooltip) - self.noRotateBox.setText(QCoreApplication.translate("mainWindow", u"No rotate", None)) + self.fileFusionBox.setText(QCoreApplication.translate("mainWindow", u"File Fusion", None)) #if QT_CONFIG(tooltip) - self.mangaBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Enable right-to-left reading.

", None)) + self.deleteBox.setToolTip(QCoreApplication.translate("mainWindow", u"Delete input file(s) or directory. It's not recoverable!", None)) #endif // QT_CONFIG(tooltip) - self.mangaBox.setText(QCoreApplication.translate("mainWindow", u"Right-to-left (manga)", None)) + self.deleteBox.setText(QCoreApplication.translate("mainWindow", u"Delete input", None)) +#if QT_CONFIG(tooltip) + self.gammaBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Set a custom gamma correction.

1.0 is default (disabled).
< 1.0 makes the image brighter.
> 1.0 makes the image darker.

1.8 was the default in KCC 9.1.0 and earlier.

Use if you want to make midtones darker.

", None)) +#endif // QT_CONFIG(tooltip) + self.gammaBox.setText(QCoreApplication.translate("mainWindow", u"Custom gamma", None)) #if QT_CONFIG(tooltip) self.noQuantizeBox.setToolTip(QCoreApplication.translate("mainWindow", u"Don't quantize PNG images to 16 colors (4 bit)\n" "\n" @@ -704,6 +714,31 @@ class Ui_mainWindow(object): "Eink only has 16 shades of gray so you probably don't want this.", None)) #endif // QT_CONFIG(tooltip) self.noQuantizeBox.setText(QCoreApplication.translate("mainWindow", u"No Quantize", None)) +#if QT_CONFIG(tooltip) + self.eraseRainbowBox.setToolTip(QCoreApplication.translate("mainWindow", u"Erase rainbow effect on color eink screen by attenuating interfering frequencies", None)) +#endif // QT_CONFIG(tooltip) + self.eraseRainbowBox.setText(QCoreApplication.translate("mainWindow", u"Rainbow eraser", None)) +#if QT_CONFIG(tooltip) + self.coverFillBox.setToolTip(QCoreApplication.translate("mainWindow", u"Resize cover to exact device resolution by center-cropping to aspect ratio first.\n" +"May crop top/bottom or left/right depending on source aspect ratio. Not implemented for Kindle Scribe.", None)) +#endif // QT_CONFIG(tooltip) + self.coverFillBox.setText(QCoreApplication.translate("mainWindow", u"Cover Fill", None)) +#if QT_CONFIG(tooltip) + self.rotateRightBox.setToolTip(QCoreApplication.translate("mainWindow", u"Rotate 2 page spreads in opposite direction than normal.", None)) +#endif // QT_CONFIG(tooltip) + self.rotateRightBox.setText(QCoreApplication.translate("mainWindow", u"Rotate Right", None)) +#if QT_CONFIG(tooltip) + self.mangaBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Enable right-to-left reading.

", None)) +#endif // QT_CONFIG(tooltip) + self.mangaBox.setText(QCoreApplication.translate("mainWindow", u"Right-to-left (manga)", None)) +#if QT_CONFIG(tooltip) + self.spreadShiftBox.setToolTip(QCoreApplication.translate("mainWindow", u"Shift first page to opposite side in landscape for two page spread alignment", None)) +#endif // QT_CONFIG(tooltip) + self.spreadShiftBox.setText(QCoreApplication.translate("mainWindow", u"Spread shift", None)) +#if QT_CONFIG(tooltip) + self.croppingBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Disabled

Disabled

Indeterminate - Margins
Margins

Checked - Margins + page numbers
Margins +page numbers

", None)) +#endif // QT_CONFIG(tooltip) + self.croppingBox.setText(QCoreApplication.translate("mainWindow", u"Cropping mode", None)) #if QT_CONFIG(tooltip) self.jpegQualityBox.setToolTip(QCoreApplication.translate("mainWindow", u"The JPEG quality, on a scale from 0 (worst) to 95 (best). \n" "\n" @@ -712,10 +747,62 @@ class Ui_mainWindow(object): "Higher values are larger and higher quality, and may resolve blank page issues.", None)) #endif // QT_CONFIG(tooltip) self.jpegQualityBox.setText(QCoreApplication.translate("mainWindow", u"Custom JPEG Quality", None)) +#if QT_CONFIG(tooltip) + self.outputSplit.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Automatic mode
The output will be split automatically.

Checked - Volume mode
Every subdirectory will be considered as a separate volume.

", None)) +#endif // QT_CONFIG(tooltip) + self.outputSplit.setText(QCoreApplication.translate("mainWindow", u"Output split", None)) +#if QT_CONFIG(tooltip) + self.metadataTitleBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Don't use metadata Title
Write default title.

Indeterminate - Add metadata Title to the default schema
Write default title with Title from ComicInfo.xml or other embedded metadata.

Checked - Use metadata Title only
Write Title from ComicInfo.xml or other embedded metadata.

", None)) +#endif // QT_CONFIG(tooltip) + self.metadataTitleBox.setText(QCoreApplication.translate("mainWindow", u"Metadata Title", None)) +#if QT_CONFIG(tooltip) + self.smartCoverCropBox.setToolTip(QCoreApplication.translate("mainWindow", u"Attempt to crop main cover from wide image.", None)) +#endif // QT_CONFIG(tooltip) + self.smartCoverCropBox.setText(QCoreApplication.translate("mainWindow", u"Smart Cover Crop", None)) +#if QT_CONFIG(tooltip) + self.rotateFirstBox.setToolTip(QCoreApplication.translate("mainWindow", u"

When the spread splitter option is partially checked,

Unchecked - Rotate Last
Put the rotated 2 page spread after the split spreads.

Checked - Rotate First
Put the rotated 2 page spread before the split spreads.

", None)) +#endif // QT_CONFIG(tooltip) + self.rotateFirstBox.setText(QCoreApplication.translate("mainWindow", u"Rotate First", None)) +#if QT_CONFIG(tooltip) + self.mozJpegBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - JPEG
Use JPEG files

Indeterminate - force PNG
Create PNG files instead JPEG for black and white images

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

", None)) +#endif // QT_CONFIG(tooltip) + self.mozJpegBox.setText(QCoreApplication.translate("mainWindow", u"JPEG/PNG/mozJpeg", None)) +#if QT_CONFIG(tooltip) + self.autoLevelBox.setToolTip(QCoreApplication.translate("mainWindow", u"

By default, KCC maps the darkest pixel value to pure black (the black point.)

Extreme black point sets the black point to be the most common dark pixel value.

Useful when text is black but artwork is gray.

", None)) +#endif // QT_CONFIG(tooltip) + self.autoLevelBox.setText(QCoreApplication.translate("mainWindow", u"Extreme Black Point", None)) +#if QT_CONFIG(tooltip) + self.forcePngRgbBox.setToolTip(QCoreApplication.translate("mainWindow", u"Force full color images to be saved in lossless PNG format, dramatically increases the filesize.", None)) +#endif // QT_CONFIG(tooltip) + self.forcePngRgbBox.setText(QCoreApplication.translate("mainWindow", u"Force PNG RGB", None)) +#if QT_CONFIG(tooltip) + self.upscaleBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

", None)) +#endif // QT_CONFIG(tooltip) + self.upscaleBox.setText(QCoreApplication.translate("mainWindow", u"Stretch/Upscale", None)) +#if QT_CONFIG(tooltip) + self.borderBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Autodetection
The color of margins fill will be detected automatically.

Indeterminate - White
Margins will be untouched.

Checked - Black
Margins will be filled with black color.

", None)) +#endif // QT_CONFIG(tooltip) + self.borderBox.setText(QCoreApplication.translate("mainWindow", u"W/B margins", None)) +#if QT_CONFIG(tooltip) + self.qualityBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - 4 panels
Zoom each corner separately.

Indeterminate - 2 panels
Zoom only the top and bottom of the page.

Checked - 4 high-quality panels
Zoom each corner separately. Try to increase the quality of magnification. Check wiki for more details.

", None)) +#endif // QT_CONFIG(tooltip) + self.qualityBox.setText(QCoreApplication.translate("mainWindow", u"Panel View 4/2/HQ", None)) +#if QT_CONFIG(tooltip) + self.pdfExtractBox.setToolTip(QCoreApplication.translate("mainWindow", u"Use the PDF image extraction method from KCC 8 and earlier.\n" +"\n" +"Useful for really weird PDFs.", None)) +#endif // QT_CONFIG(tooltip) + self.pdfExtractBox.setText(QCoreApplication.translate("mainWindow", u"PDF Legacy Extract", None)) #if QT_CONFIG(tooltip) self.colorBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Disable conversion to grayscale.

", None)) #endif // QT_CONFIG(tooltip) self.colorBox.setText(QCoreApplication.translate("mainWindow", u"Color mode", None)) +#if QT_CONFIG(tooltip) + self.pdfWidthBox.setToolTip(QCoreApplication.translate("mainWindow", u"Render vector PDFs to device width instead of height.\n" +"\n" +"Useful if you plan to crop a little off the top and bottom to fill screen.", None)) +#endif // QT_CONFIG(tooltip) + self.pdfWidthBox.setText(QCoreApplication.translate("mainWindow", u"PDF Width Render", None)) #if QT_CONFIG(tooltip) self.disableProcessingBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Do not process any image, ignore profile and processing options.

", None)) #endif // QT_CONFIG(tooltip) @@ -729,92 +816,19 @@ class Ui_mainWindow(object): #endif // QT_CONFIG(tooltip) self.defaultOutputFolderButton.setText("") #if QT_CONFIG(tooltip) - self.metadataTitleBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Don't use metadata Title
Write default title.

Indeterminate - Add metadata Title to the default schema
Write default title with Title from ComicInfo.xml or other embedded metadata.

Checked - Use metadata Title only
Write Title from ComicInfo.xml or other embedded metadata.

", None)) + self.chunkSizeCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked
Maximal output file size is 100 MB for Webtoon, 400 MB for others before split occurs.

Checked
Output file size specified in "Chunk size MB" before split occurs.

", None)) #endif // QT_CONFIG(tooltip) - self.metadataTitleBox.setText(QCoreApplication.translate("mainWindow", u"Metadata Title", None)) + self.chunkSizeCheckBox.setText(QCoreApplication.translate("mainWindow", u"Chunk size", None)) #if QT_CONFIG(tooltip) self.autocontrastBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - BW only
Only autocontrast bw pages. Ignored for pages where near blacks or whites don't exist.

Indeterminate - Disabled
Disable autocontrast

Checked - BW and Color
BW and color images will be autocontrasted. Ignored for pages where near blacks or whites don't exist.

", None)) #endif // QT_CONFIG(tooltip) self.autocontrastBox.setText(QCoreApplication.translate("mainWindow", u"Autocontrast", None)) #if QT_CONFIG(tooltip) - self.pdfExtractBox.setToolTip(QCoreApplication.translate("mainWindow", u"Use the PDF image extraction method from KCC 8 and earlier.\n" + self.webpBox.setToolTip(QCoreApplication.translate("mainWindow", u"Replace JPG with lossy WebP and PNG with lossless WebP. This includes the JPG Quality.\n" "\n" -"Useful for really weird PDFs.", None)) +"Ignored for Kindle EPUB/MOBI and all PDF.", None)) #endif // QT_CONFIG(tooltip) - self.pdfExtractBox.setText(QCoreApplication.translate("mainWindow", u"PDF Legacy Extract", None)) -#if QT_CONFIG(tooltip) - self.upscaleBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

", None)) -#endif // QT_CONFIG(tooltip) - self.upscaleBox.setText(QCoreApplication.translate("mainWindow", u"Stretch/Upscale", None)) -#if QT_CONFIG(tooltip) - self.chunkSizeCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked
Maximal output file size is 100 MB for Webtoon, 400 MB for others before split occurs.

Checked
Output file size specified in "Chunk size MB" before split occurs.

", None)) -#endif // QT_CONFIG(tooltip) - self.chunkSizeCheckBox.setText(QCoreApplication.translate("mainWindow", u"Chunk size", None)) -#if QT_CONFIG(tooltip) - self.qualityBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - 4 panels
Zoom each corner separately.

Indeterminate - 2 panels
Zoom only the top and bottom of the page.

Checked - 4 high-quality panels
Zoom each corner separately. Try to increase the quality of magnification. Check wiki for more details.

", None)) -#endif // QT_CONFIG(tooltip) - self.qualityBox.setText(QCoreApplication.translate("mainWindow", u"Panel View 4/2/HQ", None)) -#if QT_CONFIG(tooltip) - self.mozJpegBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - JPEG
Use JPEG files

Indeterminate - force PNG
Create PNG files instead JPEG for black and white images

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

", None)) -#endif // QT_CONFIG(tooltip) - self.mozJpegBox.setText(QCoreApplication.translate("mainWindow", u"JPEG/PNG/mozJpeg", None)) -#if QT_CONFIG(tooltip) - self.titleEdit.setToolTip(QCoreApplication.translate("mainWindow", u"

Default Title

", None)) -#endif // QT_CONFIG(tooltip) - self.titleEdit.setPlaceholderText(QCoreApplication.translate("mainWindow", u"Default Title", None)) -#if QT_CONFIG(tooltip) - self.eraseRainbowBox.setToolTip(QCoreApplication.translate("mainWindow", u"Erase rainbow effect on color eink screen by attenuating interfering frequencies", None)) -#endif // QT_CONFIG(tooltip) - self.eraseRainbowBox.setText(QCoreApplication.translate("mainWindow", u"Rainbow eraser", None)) -#if QT_CONFIG(tooltip) - self.fileFusionBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Combines all selected files into a single file. (Helpful for combining chapters into volumes.)

", None)) -#endif // QT_CONFIG(tooltip) - self.fileFusionBox.setText(QCoreApplication.translate("mainWindow", u"File Fusion", None)) -#if QT_CONFIG(tooltip) - self.coverFillBox.setToolTip(QCoreApplication.translate("mainWindow", u"Resize cover to exact device resolution by center-cropping to aspect ratio first.\n" -"May crop top/bottom or left/right depending on source aspect ratio. Not implemented for Kindle Scribe.", None)) -#endif // QT_CONFIG(tooltip) - self.coverFillBox.setText(QCoreApplication.translate("mainWindow", u"Cover Fill", None)) -#if QT_CONFIG(tooltip) - self.rotateRightBox.setToolTip(QCoreApplication.translate("mainWindow", u"Rotate 2 page spreads in opposite direction than normal.", None)) -#endif // QT_CONFIG(tooltip) - self.rotateRightBox.setText(QCoreApplication.translate("mainWindow", u"Rotate Right", None)) -#if QT_CONFIG(tooltip) - self.gammaBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Set a custom gamma correction.

1.0 is default (disabled).
< 1.0 makes the image brighter.
> 1.0 makes the image darker.

1.8 was the default in KCC 9.1.0 and earlier.

Use if you want to make midtones darker.

", None)) -#endif // QT_CONFIG(tooltip) - self.gammaBox.setText(QCoreApplication.translate("mainWindow", u"Custom gamma", None)) -#if QT_CONFIG(tooltip) - self.autoLevelBox.setToolTip(QCoreApplication.translate("mainWindow", u"

By default, KCC maps the darkest pixel value to pure black (the black point.)

Extreme black point sets the black point to be the most common dark pixel value.

Useful when text is black but artwork is gray.

", None)) -#endif // QT_CONFIG(tooltip) - self.autoLevelBox.setText(QCoreApplication.translate("mainWindow", u"Extreme Black Point", None)) -#if QT_CONFIG(tooltip) - self.interPanelCropBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Disabled
Disabled

Indeterminate - Horizontal
Crop empty horizontal lines.

Checked - Both
Crop empty horizontal and vertical lines.

", None)) -#endif // QT_CONFIG(tooltip) - self.interPanelCropBox.setText(QCoreApplication.translate("mainWindow", u"Inter-panel crop", None)) -#if QT_CONFIG(tooltip) - self.rotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Split
Double page spreads will be cut into two separate pages.

Indeterminate - Split and rotate
Double page spreads will be displayed twice. First split and then rotated.

Checked - Rotate
Double page spreads will be rotated.

", None)) -#endif // QT_CONFIG(tooltip) - self.rotateBox.setText(QCoreApplication.translate("mainWindow", u"Spread splitter", None)) -#if QT_CONFIG(tooltip) - self.authorEdit.setToolTip(QCoreApplication.translate("mainWindow", u"Default Author is KCC", None)) -#endif // QT_CONFIG(tooltip) - self.authorEdit.setPlaceholderText(QCoreApplication.translate("mainWindow", u"Default Author", None)) -#if QT_CONFIG(tooltip) - self.croppingBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - Disabled

Disabled

Indeterminate - Margins
Margins

Checked - Margins + page numbers
Margins +page numbers

", None)) -#endif // QT_CONFIG(tooltip) - self.croppingBox.setText(QCoreApplication.translate("mainWindow", u"Cropping mode", None)) -#if QT_CONFIG(tooltip) - self.pngLegacyBox.setToolTip(QCoreApplication.translate("mainWindow", u"Use a more compatible 8 bit PNG instead of 4 bit.", None)) -#endif // QT_CONFIG(tooltip) - self.pngLegacyBox.setText(QCoreApplication.translate("mainWindow", u"PNG Legacy Mode", None)) -#if QT_CONFIG(tooltip) - self.forcePngRgbBox.setToolTip(QCoreApplication.translate("mainWindow", u"Force full color images to be saved in lossless PNG format, dramatically increases the filesize.", None)) -#endif // QT_CONFIG(tooltip) - self.forcePngRgbBox.setText(QCoreApplication.translate("mainWindow", u"Force PNG RGB", None)) -#if QT_CONFIG(tooltip) - self.smartCoverCropBox.setToolTip(QCoreApplication.translate("mainWindow", u"Attempt to crop main cover from wide image.", None)) -#endif // QT_CONFIG(tooltip) - self.smartCoverCropBox.setText(QCoreApplication.translate("mainWindow", u"Smart Cover Crop", None)) + self.webpBox.setText(QCoreApplication.translate("mainWindow", u"WebP (experimental)", None)) self.gammaLabel.setText(QCoreApplication.translate("mainWindow", u"Gamma: Auto", None)) self.jpegQualityLabel.setText(QCoreApplication.translate("mainWindow", u"JPEG Quality:", None)) # retranslateUi diff --git a/kindlecomicconverter/comic2ebook.py b/kindlecomicconverter/comic2ebook.py index 00ba009..79e1e4f 100755 --- a/kindlecomicconverter/comic2ebook.py +++ b/kindlecomicconverter/comic2ebook.py @@ -353,6 +353,8 @@ def buildOPF(dstdir, title, filelist, originalpath, cover=None): mt = 'image/png' elif '.gif' == filename[1]: mt = 'image/gif' + elif '.webp' == filename[1]: + mt = 'image/webp' else: mt = 'image/jpeg' f.write("