| | from PyQt5.QtWidgets import ( |
| | QHBoxLayout, |
| | QLabel, |
| | QLineEdit, |
| | QSlider, |
| | QToolButton, |
| | QFileDialog, |
| | QApplication, |
| | ) |
| |
|
| |
|
| | from PyQt5.QtCore import Qt, QEvent |
| |
|
| | from PIL import Image |
| | from constants import DEVICE |
| | from app_settings import AppSettings |
| | from urllib.parse import urlparse, unquote |
| | from frontend.gui.base_widget import BaseWidget |
| | from backend.models.lcmdiffusion_setting import DiffusionTask |
| |
|
| |
|
| | class Img2ImgWidget(BaseWidget): |
| | def __init__(self, config: AppSettings, parent): |
| | super().__init__(config, parent) |
| |
|
| | |
| | self.img_label = QLabel("Init image:") |
| | self.img_path = QLineEdit() |
| | self.img_path.setReadOnly(True) |
| | self.img_path.setAcceptDrops(True) |
| | self.img_path.installEventFilter(self) |
| | self.img_browse = QToolButton() |
| | self.img_browse.setText("...") |
| | self.img_browse.setToolTip("Browse for an init image") |
| | self.img_browse.clicked.connect(self.browse_click) |
| | |
| | hlayout = QHBoxLayout() |
| | hlayout.addWidget(self.img_label) |
| | hlayout.addWidget(self.img_path) |
| | hlayout.addWidget(self.img_browse) |
| |
|
| | self.strength_label = QLabel("Denoising strength: 0.3") |
| | self.strength = QSlider(orientation=Qt.Orientation.Horizontal) |
| | self.strength.setMaximum(10) |
| | self.strength.setMinimum(1) |
| | self.strength.setValue(3) |
| | self.strength.valueChanged.connect(self.update_strength_label) |
| | |
| | |
| | self.layout().addLayout(hlayout) |
| | self.layout().addWidget(self.strength_label) |
| | self.layout().addWidget(self.strength) |
| |
|
| | def browse_click(self): |
| | filename = self.show_file_selection_dialog() |
| | if filename[0] != "": |
| | self.img_path.setText(filename[0]) |
| |
|
| | def show_file_selection_dialog(self) -> str: |
| | filename = QFileDialog.getOpenFileName( |
| | self, "Open Image", "results", "Image Files (*.png *.jpg *.bmp)" |
| | ) |
| | return filename |
| |
|
| | def eventFilter(self, source, event: QEvent): |
| | """This is the Drag and Drop event filter for the init image QLineEdit""" |
| | if event.type() == QEvent.DragEnter: |
| | if event.mimeData().hasFormat("text/plain"): |
| | event.acceptProposedAction() |
| | return True |
| | elif event.type() == QEvent.Drop: |
| | event.acceptProposedAction() |
| | path = unquote(urlparse(event.mimeData().text()).path) |
| | self.img_path.setText(path) |
| | return True |
| |
|
| | return False |
| |
|
| | def before_generation(self): |
| | super().before_generation() |
| | self.img_browse.setEnabled(False) |
| | self.img_path.setEnabled(False) |
| |
|
| | def after_generation(self): |
| | super().after_generation() |
| | self.img_browse.setEnabled(True) |
| | self.img_path.setEnabled(True) |
| |
|
| | def generate_image(self): |
| | self.parent.prepare_generation_settings(self.config) |
| | self.config.settings.lcm_diffusion_setting.diffusion_task = ( |
| | DiffusionTask.image_to_image.value |
| | ) |
| | self.config.settings.lcm_diffusion_setting.prompt = self.prompt.toPlainText() |
| | self.config.settings.lcm_diffusion_setting.negative_prompt = ( |
| | self.neg_prompt.toPlainText() |
| | ) |
| | 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 |
| |
|
| | images = self.parent.context.generate_text_to_image( |
| | self.config.settings, |
| | self.config.reshape_required, |
| | DEVICE, |
| | ) |
| | self.parent.context.save_images(images, self.config.settings) |
| | self.prepare_images(images) |
| | self.after_generation() |
| |
|
| | def update_strength_label(self, value): |
| | val = round(int(value) / 10, 1) |
| | self.strength_label.setText(f"Denoising strength: {val}") |
| | self.config.settings.lcm_diffusion_setting.strength = val |
| |
|