from PIL import Image from PyQt5.QtWidgets import ( QApplication, QHBoxLayout, QRadioButton, QWidget, ) from app_settings import AppSettings from backend.models.upscale import UpscaleMode from backend.upscale.upscaler import upscale_image from frontend.gui.img2img_widget import Img2ImgWidget from paths import FastStableDiffusionPaths class UpscalerWidget(Img2ImgWidget): scale_factor = 2.0 def __init__(self, config: AppSettings, parent): super().__init__(config, parent) # Hide prompt and negative prompt widgets self.prompt.hide() self.neg_prompt.hide() # self.neg_prompt.deleteLater() self.strength_label.hide() self.strength.hide() self.generate.setText("Upscale") # Create upscaler widgets self.edsr_button = QRadioButton("EDSR", self) self.edsr_button.toggled.connect(self.on_mode_change) self.edsr_button.toggle() self.sd_button = QRadioButton("SD", self) self.sd_button.toggled.connect(self.on_mode_change) self.aura_button = QRadioButton("AURA-SR", self) self.aura_button.toggled.connect(self.on_mode_change) self.neg_prompt_label.setText("Upscale mode (2x) | AURA-SR (4x):") # Create upscaler buttons layout hlayout = QHBoxLayout() hlayout.addWidget(self.edsr_button) hlayout.addWidget(self.sd_button) hlayout.addWidget(self.aura_button) # Can't use a layout with replaceWidget(), so the layout is assigned # to a dummy widget used to replace the negative prompt button and # obtain the desired GUI design self.container = QWidget() self.container.setLayout(hlayout) self.layout().replaceWidget(self.neg_prompt, self.container) def generate_image(self): self.parent.prepare_generation_settings(self.config) self.config.settings.lcm_diffusion_setting.init_image = Image.open( self.img_path.text() ) self.config.settings.lcm_diffusion_setting.strength = self.strength.value() / 10 upscaled_filepath = FastStableDiffusionPaths.get_upscale_filepath( None, self.scale_factor, self.config.settings.generated_images.format, ) images = upscale_image( context=self.parent.context, src_image_path=self.img_path.text(), dst_image_path=upscaled_filepath, upscale_mode=self.upscale_mode, strength=0.1, ) self.prepare_images(images) self.after_generation() def before_generation(self): super().before_generation() self.container.setEnabled(False) def after_generation(self): super().after_generation() self.container.setEnabled(True) # TODO For some reason, if init_image is not set to None, saving settings # when closing the main window will fail, even though the save() method # explicitly sets init_image to None? self.config.settings.lcm_diffusion_setting.init_image = None def on_mode_change(self): self.scale_factor = 2.0 if self.edsr_button.isChecked(): self.upscale_mode = UpscaleMode.normal.value elif self.sd_button.isChecked(): self.upscale_mode = UpscaleMode.sd_upscale.value else: self.upscale_mode = UpscaleMode.aura_sr.value self.scale_factor = 4.0