From 9b9181a715d18dc88bb60140a36926af0cf15e7c Mon Sep 17 00:00:00 2001 From: Alex Xu Date: Fri, 13 Mar 2026 14:15:14 -0700 Subject: [PATCH] Add rotate right option (#1268) --- README.md | 1 + gui/KCC.ui | 612 ++++++++++++++-------------- kindlecomicconverter/KCC_gui.py | 3 + kindlecomicconverter/KCC_ui.py | 499 ++++++++++++----------- kindlecomicconverter/comic2ebook.py | 2 + kindlecomicconverter/image.py | 10 +- 6 files changed, 579 insertions(+), 548 deletions(-) diff --git a/README.md b/README.md index 72e6609..52fbf64 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,7 @@ OUTPUT SETTINGS: Split output into multiple files. 0: Don't split 1: Automatic mode 2: Consider every subdirectory as separate volume [Default=0] --spreadshift Shift first page to opposite side in landscape for two page spread alignment --norotate Do not rotate double page spreads in spread splitter option. + --rotateright Rotate double page spreads in opposite direction. --rotatefirst Put rotated spread first in spread splitter option. --filefusion Combines all input files into a single file. --eraserainbow Erase rainbow effect on color eink screen by attenuating interfering frequencies diff --git a/gui/KCC.ui b/gui/KCC.ui index 2ce5f4a..fcc5f07 100644 --- a/gui/KCC.ui +++ b/gui/KCC.ui @@ -514,137 +514,6 @@ 0 - - - - - 0 - 0 - - - - Qt::FocusPolicy::ClickFocus - - - <html><head/><body><p>Default Title</p></body></html> - - - Default Title - - - false - - - - - - - <html><head/><body><p style='white-space:pre'>Enable right-to-left reading.</p></body></html> - - - Right-to-left (manga) - - - - - - - <html><head/><body><p style='white-space:pre'>Enable special parsing mode for Korean Webtoons.</p></body></html> - - - Webtoon mode - - - - - - - <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 - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - 1x4<br/></span>Keep format 1x4 panels strips.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - 2x2<br/></span>Turn 1x4 strips to 2x2 to maximize screen usage.</p></body></html> - - - 1x4 to 2x2 strips - - - - - - - Delete input file(s) or directory. It's not recoverable! - - - Delete input - - - - - - - <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 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 - 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>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><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 - - - @@ -655,101 +524,6 @@ - - - - <html><head/><body><p style='white-space:pre'>Disable conversion to grayscale.</p></body></html> - - - Color mode - - - - - - - <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 - - - - - - - Shift first page to opposite side in landscape for two page spread alignment - - - Spread shift - - - - - - - <html><head/><body><p style='white-space:pre'>Do not process any image, ignore profile and processing options.</p></body></html> - - - Disable processing - - - - - - - Erase rainbow effect on color eink screen by attenuating interfering frequencies - - - Rainbow eraser - - - - - - - Do not rotate double page spreads in spread splitter option. - - - No rotate - - - - - - - <html><head/><body><p>Combines all selected files into a single file. (Helpful for combining chapters into volumes.)</p></body></html> - - - File Fusion - - - - - - - - 0 - 0 - - - - Qt::FocusPolicy::ClickFocus - - - Default Author is KCC - - - Default Author - - - false - - - @@ -763,68 +537,6 @@ - - - - <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 - 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 - - - - - - - <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</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 - - - - - - - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - BW only<br/></span>Only autocontrast bw pages. Ignored for pages where near blacks or whites don't exist.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Disabled<br/></span>Disable autocontrast</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - BW and Color<br/></span>BW and color images will be autocontrasted. Ignored for pages where near blacks or whites don't exist.</p></body></html> - - - Autocontrast - - - true - - - @@ -882,17 +594,186 @@ - - + + - The JPEG quality, on a scale from 0 (worst) to 95 (best). - -Default is 85 for most devices besides Kindle Scribe and Colorsoft, which are 90. - -Higher values are larger and higher quality, and may resolve blank page issues. + Delete input file(s) or directory. It's not recoverable! - Custom JPEG Quality + Delete input + + + + + + + <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 + + + + + + + <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</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><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 - BW only<br/></span>Only autocontrast bw pages. Ignored for pages where near blacks or whites don't exist.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Disabled<br/></span>Disable autocontrast</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - BW and Color<br/></span>BW and color images will be autocontrasted. Ignored for pages where near blacks or whites don't exist.</p></body></html> + + + Autocontrast + + + true + + + + + + + Do not rotate double page spreads in spread splitter option. + + + No rotate + + + + + + + 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 + + + + + + + <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 + + + + + + + Erase rainbow effect on color eink screen by attenuating interfering frequencies + + + Rainbow eraser + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::ClickFocus + + + <html><head/><body><p>Default Title</p></body></html> + + + Default Title + + + false + + + + + + + <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>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>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 @@ -908,14 +789,143 @@ Useful for really weird PDFs. - - + + - 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. + <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> - Cover Fill + Output split + + + + + + + The JPEG quality, on a scale from 0 (worst) to 95 (best). + +Default is 85 for most devices besides Kindle Scribe and Colorsoft, which are 90. + +Higher values are larger and higher quality, and may resolve blank page issues. + + + Custom JPEG Quality + + + + + + + <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>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 + + + + + + + Shift first page to opposite side in landscape for two page spread alignment + + + Spread shift + + + + + + + <html><head/><body><p>Combines all selected files into a single file. (Helpful for combining chapters into volumes.)</p></body></html> + + + File Fusion + + + + + + + <html><head/><body><p style='white-space:pre'>Disable conversion to grayscale.</p></body></html> + + + Color mode + + + + + + + <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 + + + + + + + <html><head/><body><p style='white-space:pre'>Enable special parsing mode for Korean Webtoons.</p></body></html> + + + Webtoon mode + + + + + + + <html><head/><body><p style='white-space:pre'>Do not process any image, ignore profile and processing options.</p></body></html> + + + Disable processing + + + + + + + <html><head/><body><p style='white-space:pre'>Enable right-to-left reading.</p></body></html> + + + Right-to-left (manga) + + + + + + + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - 1x4<br/></span>Keep format 1x4 panels strips.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - 2x2<br/></span>Turn 1x4 strips to 2x2 to maximize screen usage.</p></body></html> + + + 1x4 to 2x2 strips + + + + + + + Rotate 2 page spreads in opposite direction than normal. + + + Rotate Right diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index 96780c7..73e8f91 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -345,6 +345,8 @@ class WorkerThread(QThread): options.filefusion = False if GUI.noRotateBox.isChecked(): options.norotate = True + if GUI.rotateRightBox.isChecked(): + options.rotateright = True if GUI.rotateFirstBox.isChecked(): options.rotatefirst = True if GUI.mozJpegBox.checkState() == Qt.CheckState.PartiallyChecked: @@ -1052,6 +1054,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): 'fileFusionBox': GUI.fileFusionBox.checkState(), 'defaultOutputFolderBox': GUI.defaultOutputFolderBox.checkState(), 'noRotateBox': GUI.noRotateBox.checkState(), + 'rotateRightBox': GUI.rotateRightBox.checkState(), 'rotateFirstBox': GUI.rotateFirstBox.checkState(), 'maximizeStrips': GUI.maximizeStrips.checkState(), 'gammaSlider': float(self.gammaValue) * 100, diff --git a/kindlecomicconverter/KCC_ui.py b/kindlecomicconverter/KCC_ui.py index f746aa9..1cdb648 100644 --- a/kindlecomicconverter/KCC_ui.py +++ b/kindlecomicconverter/KCC_ui.py @@ -287,153 +287,17 @@ 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.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.mangaBox = QCheckBox(self.optionWidget) - self.mangaBox.setObjectName(u"mangaBox") - - self.gridLayout_2.addWidget(self.mangaBox, 1, 0, 1, 1) - - self.webtoonBox = QCheckBox(self.optionWidget) - self.webtoonBox.setObjectName(u"webtoonBox") - - self.gridLayout_2.addWidget(self.webtoonBox, 2, 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.maximizeStrips = QCheckBox(self.optionWidget) - self.maximizeStrips.setObjectName(u"maximizeStrips") - - self.gridLayout_2.addWidget(self.maximizeStrips, 4, 1, 1, 1) - - self.deleteBox = QCheckBox(self.optionWidget) - self.deleteBox.setObjectName(u"deleteBox") - - self.gridLayout_2.addWidget(self.deleteBox, 5, 1, 1, 1) - - self.rotateFirstBox = QCheckBox(self.optionWidget) - self.rotateFirstBox.setObjectName(u"rotateFirstBox") - - self.gridLayout_2.addWidget(self.rotateFirstBox, 8, 1, 1, 1) - - self.outputSplit = QCheckBox(self.optionWidget) - self.outputSplit.setObjectName(u"outputSplit") - - self.gridLayout_2.addWidget(self.outputSplit, 3, 1, 1, 1) - - self.borderBox = QCheckBox(self.optionWidget) - self.borderBox.setObjectName(u"borderBox") - self.borderBox.setTristate(True) - - self.gridLayout_2.addWidget(self.borderBox, 3, 0, 1, 1) - - self.gammaBox = QCheckBox(self.optionWidget) - self.gammaBox.setObjectName(u"gammaBox") - - self.gridLayout_2.addWidget(self.gammaBox, 2, 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.chunkSizeCheckBox = QCheckBox(self.optionWidget) self.chunkSizeCheckBox.setObjectName(u"chunkSizeCheckBox") self.gridLayout_2.addWidget(self.chunkSizeCheckBox, 7, 1, 1, 1) - self.colorBox = QCheckBox(self.optionWidget) - self.colorBox.setObjectName(u"colorBox") - - self.gridLayout_2.addWidget(self.colorBox, 3, 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.spreadShiftBox = QCheckBox(self.optionWidget) - self.spreadShiftBox.setObjectName(u"spreadShiftBox") - - self.gridLayout_2.addWidget(self.spreadShiftBox, 5, 0, 1, 1) - - self.disableProcessingBox = QCheckBox(self.optionWidget) - self.disableProcessingBox.setObjectName(u"disableProcessingBox") - - self.gridLayout_2.addWidget(self.disableProcessingBox, 5, 2, 1, 1) - - self.eraseRainbowBox = QCheckBox(self.optionWidget) - self.eraseRainbowBox.setObjectName(u"eraseRainbowBox") - - self.gridLayout_2.addWidget(self.eraseRainbowBox, 7, 2, 1, 1) - - self.noRotateBox = QCheckBox(self.optionWidget) - self.noRotateBox.setObjectName(u"noRotateBox") - - self.gridLayout_2.addWidget(self.noRotateBox, 6, 1, 1, 1) - - self.fileFusionBox = QCheckBox(self.optionWidget) - self.fileFusionBox.setObjectName(u"fileFusionBox") - - self.gridLayout_2.addWidget(self.fileFusionBox, 6, 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.qualityBox = QCheckBox(self.optionWidget) self.qualityBox.setObjectName(u"qualityBox") self.qualityBox.setTristate(True) self.gridLayout_2.addWidget(self.qualityBox, 1, 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.metadataTitleBox = QCheckBox(self.optionWidget) - self.metadataTitleBox.setObjectName(u"metadataTitleBox") - self.metadataTitleBox.setTristate(True) - - self.gridLayout_2.addWidget(self.metadataTitleBox, 7, 0, 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.autocontrastBox = QCheckBox(self.optionWidget) - self.autocontrastBox.setObjectName(u"autocontrastBox") - self.autocontrastBox.setTristate(True) - - self.gridLayout_2.addWidget(self.autocontrastBox, 9, 2, 1, 1) - self.outputFolderWidget = QWidget(self.optionWidget) self.outputFolderWidget.setObjectName(u"outputFolderWidget") self.horizontalLayout_3 = QHBoxLayout(self.outputFolderWidget) @@ -457,20 +321,161 @@ class Ui_mainWindow(object): self.gridLayout_2.addWidget(self.outputFolderWidget, 0, 2, 1, 1) - self.jpegQualityBox = QCheckBox(self.optionWidget) - self.jpegQualityBox.setObjectName(u"jpegQualityBox") + self.deleteBox = QCheckBox(self.optionWidget) + self.deleteBox.setObjectName(u"deleteBox") - self.gridLayout_2.addWidget(self.jpegQualityBox, 8, 0, 1, 1) + self.gridLayout_2.addWidget(self.deleteBox, 5, 1, 1, 1) + + self.metadataTitleBox = QCheckBox(self.optionWidget) + self.metadataTitleBox.setObjectName(u"metadataTitleBox") + self.metadataTitleBox.setTristate(True) + + self.gridLayout_2.addWidget(self.metadataTitleBox, 7, 0, 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.interPanelCropBox = QCheckBox(self.optionWidget) + self.interPanelCropBox.setObjectName(u"interPanelCropBox") + self.interPanelCropBox.setTristate(True) + + self.gridLayout_2.addWidget(self.interPanelCropBox, 6, 2, 1, 1) + + self.autocontrastBox = QCheckBox(self.optionWidget) + self.autocontrastBox.setObjectName(u"autocontrastBox") + self.autocontrastBox.setTristate(True) + + self.gridLayout_2.addWidget(self.autocontrastBox, 9, 2, 1, 1) + + self.noRotateBox = QCheckBox(self.optionWidget) + self.noRotateBox.setObjectName(u"noRotateBox") + + self.gridLayout_2.addWidget(self.noRotateBox, 6, 1, 1, 1) + + self.coverFillBox = QCheckBox(self.optionWidget) + self.coverFillBox.setObjectName(u"coverFillBox") + + self.gridLayout_2.addWidget(self.coverFillBox, 9, 1, 1, 1) + + self.borderBox = QCheckBox(self.optionWidget) + self.borderBox.setObjectName(u"borderBox") + self.borderBox.setTristate(True) + + self.gridLayout_2.addWidget(self.borderBox, 3, 0, 1, 1) + + self.eraseRainbowBox = QCheckBox(self.optionWidget) + self.eraseRainbowBox.setObjectName(u"eraseRainbowBox") + + self.gridLayout_2.addWidget(self.eraseRainbowBox, 7, 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.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.autoLevelBox = QCheckBox(self.optionWidget) + self.autoLevelBox.setObjectName(u"autoLevelBox") + + self.gridLayout_2.addWidget(self.autoLevelBox, 8, 2, 1, 1) + + self.rotateFirstBox = QCheckBox(self.optionWidget) + self.rotateFirstBox.setObjectName(u"rotateFirstBox") + + self.gridLayout_2.addWidget(self.rotateFirstBox, 8, 1, 1, 1) self.pdfExtractBox = QCheckBox(self.optionWidget) self.pdfExtractBox.setObjectName(u"pdfExtractBox") self.gridLayout_2.addWidget(self.pdfExtractBox, 9, 0, 1, 1) - self.coverFillBox = QCheckBox(self.optionWidget) - self.coverFillBox.setObjectName(u"coverFillBox") + self.outputSplit = QCheckBox(self.optionWidget) + self.outputSplit.setObjectName(u"outputSplit") - self.gridLayout_2.addWidget(self.coverFillBox, 9, 1, 1, 1) + self.gridLayout_2.addWidget(self.outputSplit, 3, 1, 1, 1) + + self.jpegQualityBox = QCheckBox(self.optionWidget) + self.jpegQualityBox.setObjectName(u"jpegQualityBox") + + self.gridLayout_2.addWidget(self.jpegQualityBox, 8, 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.gammaBox = QCheckBox(self.optionWidget) + self.gammaBox.setObjectName(u"gammaBox") + + self.gridLayout_2.addWidget(self.gammaBox, 2, 2, 1, 1) + + self.spreadShiftBox = QCheckBox(self.optionWidget) + self.spreadShiftBox.setObjectName(u"spreadShiftBox") + + self.gridLayout_2.addWidget(self.spreadShiftBox, 5, 0, 1, 1) + + self.fileFusionBox = QCheckBox(self.optionWidget) + self.fileFusionBox.setObjectName(u"fileFusionBox") + + self.gridLayout_2.addWidget(self.fileFusionBox, 6, 0, 1, 1) + + self.colorBox = QCheckBox(self.optionWidget) + self.colorBox.setObjectName(u"colorBox") + + self.gridLayout_2.addWidget(self.colorBox, 3, 2, 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.webtoonBox = QCheckBox(self.optionWidget) + self.webtoonBox.setObjectName(u"webtoonBox") + + self.gridLayout_2.addWidget(self.webtoonBox, 2, 0, 1, 1) + + self.disableProcessingBox = QCheckBox(self.optionWidget) + self.disableProcessingBox.setObjectName(u"disableProcessingBox") + + self.gridLayout_2.addWidget(self.disableProcessingBox, 5, 2, 1, 1) + + self.mangaBox = QCheckBox(self.optionWidget) + self.mangaBox.setObjectName(u"mangaBox") + + self.gridLayout_2.addWidget(self.mangaBox, 1, 0, 1, 1) + + self.maximizeStrips = QCheckBox(self.optionWidget) + self.maximizeStrips.setObjectName(u"maximizeStrips") + + self.gridLayout_2.addWidget(self.maximizeStrips, 4, 1, 1, 1) + + self.rotateRightBox = QCheckBox(self.optionWidget) + self.rotateRightBox.setObjectName(u"rotateRightBox") + + self.gridLayout_2.addWidget(self.rotateRightBox, 10, 1, 1, 1) self.gridLayout.addWidget(self.optionWidget, 5, 0, 1, 2) @@ -624,110 +629,14 @@ class Ui_mainWindow(object): #endif // QT_CONFIG(tooltip) 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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.disableProcessingBox.setToolTip(QCoreApplication.translate("mainWindow", u"

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

", None)) -#endif // QT_CONFIG(tooltip) - self.disableProcessingBox.setText(QCoreApplication.translate("mainWindow", u"Disable processing", 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.noRotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"Do not rotate double page spreads in spread splitter option.", None)) -#endif // QT_CONFIG(tooltip) - self.noRotateBox.setText(QCoreApplication.translate("mainWindow", u"No rotate", 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.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.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.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.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.mozJpegBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - JPEG
Use JPEG files

Indeterminate - force PNG
Create PNG files instead JPEG

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.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.defaultOutputFolderBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - next to source
Place output files next to source files

Indeterminate - folder next to source
Place output files in a folder next to source files

Checked - Custom
Place output files in custom directory specified by right button

", None)) #endif // QT_CONFIG(tooltip) @@ -736,6 +645,73 @@ class Ui_mainWindow(object): self.defaultOutputFolderButton.setToolTip(QCoreApplication.translate("mainWindow", u"

Use this to select the default output directory.

", None)) #endif // QT_CONFIG(tooltip) self.defaultOutputFolderButton.setText("") +#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.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.mozJpegBox.setToolTip(QCoreApplication.translate("mainWindow", u"

Unchecked - JPEG
Use JPEG files

Indeterminate - force PNG
Create PNG files instead JPEG

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.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.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.noRotateBox.setToolTip(QCoreApplication.translate("mainWindow", u"Do not rotate double page spreads in spread splitter option.", None)) +#endif // QT_CONFIG(tooltip) + self.noRotateBox.setText(QCoreApplication.translate("mainWindow", u"No rotate", 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.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.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.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.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.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.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.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.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.jpegQualityBox.setToolTip(QCoreApplication.translate("mainWindow", u"The JPEG quality, on a scale from 0 (worst) to 95 (best). \n" "\n" @@ -745,16 +721,49 @@ class Ui_mainWindow(object): #endif // QT_CONFIG(tooltip) self.jpegQualityBox.setText(QCoreApplication.translate("mainWindow", u"Custom JPEG Quality", 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)) + 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.pdfExtractBox.setText(QCoreApplication.translate("mainWindow", u"PDF Legacy Extract", None)) + self.upscaleBox.setText(QCoreApplication.translate("mainWindow", u"Stretch/Upscale", 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)) + 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.coverFillBox.setText(QCoreApplication.translate("mainWindow", u"Cover Fill", None)) + self.gammaBox.setText(QCoreApplication.translate("mainWindow", u"Custom gamma", 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.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.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.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.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.disableProcessingBox.setToolTip(QCoreApplication.translate("mainWindow", u"

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

", None)) +#endif // QT_CONFIG(tooltip) + self.disableProcessingBox.setText(QCoreApplication.translate("mainWindow", u"Disable processing", 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.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.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)) 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 30c99c6..1cfc5c9 100755 --- a/kindlecomicconverter/comic2ebook.py +++ b/kindlecomicconverter/comic2ebook.py @@ -1356,6 +1356,8 @@ def makeParser(): help="Shift first page to opposite side in landscape for spread alignment") output_options.add_argument("--norotate", action="store_true", dest="norotate", default=False, help="Do not rotate double page spreads in spread splitter option.") + output_options.add_argument("--rotateright", action="store_true", dest="rotateright", default=False, + help="Rotate double page spreads in opposite direction.") output_options.add_argument("--rotatefirst", action="store_true", dest="rotatefirst", default=False, help="Put rotated 2 page spread first in spread splitter option.") diff --git a/kindlecomicconverter/image.py b/kindlecomicconverter/image.py index 3341940..635886f 100755 --- a/kindlecomicconverter/image.py +++ b/kindlecomicconverter/image.py @@ -197,7 +197,10 @@ class ComicPageParser: and not self.opt.webtoon and self.opt.splitter == 1: spread = self.image if not self.opt.norotate: - spread = spread.rotate(90, Image.Resampling.BICUBIC, True) + if not self.opt.rotateright: + spread = spread.rotate(90, Image.Resampling.BICUBIC, True) + else: + spread = spread.rotate(-90, Image.Resampling.BICUBIC, True) self.payload.append(['R', self.source, spread, self.fill]) elif (width > height) != (dstwidth > dstheight) and not self.opt.webtoon: if self.opt.splitter != 1: @@ -218,7 +221,10 @@ class ComicPageParser: if self.opt.splitter > 0: spread = self.image if not self.opt.norotate: - spread = spread.rotate(90, Image.Resampling.BICUBIC, True) + if not self.opt.rotateright: + spread = spread.rotate(90, Image.Resampling.BICUBIC, True) + else: + spread = spread.rotate(-90, Image.Resampling.BICUBIC, True) self.payload.append(['R', self.source, spread, self.fill]) else: self.payload.append(['N', self.source, self.image, self.fill])