Alphablending und Zoom werden beschleunigt

This commit is contained in:
2025-05-29 19:03:19 +02:00
parent bb94e41756
commit 51d8c40064
+47 -16
View File
@@ -37,6 +37,9 @@ class MainWindow(QMainWindow):
self.current_page = 0 self.current_page = 0
self.current_pdf = None self.current_pdf = None
# Cache für die aktuell gerenderten Pixmaps (Performance-Optimierung)
self.current_rendered_pixmaps = None
# Label für die Vollansicht (nur ein einziges Label) # Label für die Vollansicht (nur ein einziges Label)
self.fullsize_label = None self.fullsize_label = None
@@ -115,6 +118,7 @@ class MainWindow(QMainWindow):
# Dicts zurücksetzen # Dicts zurücksetzen
self.thumbnail_to_page = {} self.thumbnail_to_page = {}
self.pdf_documents = {} self.pdf_documents = {}
self.current_rendered_pixmaps = None
# Basis-Pfad zu den PDF-Ordnern # Basis-Pfad zu den PDF-Ordnern
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -231,6 +235,7 @@ class MainWindow(QMainWindow):
def render_and_display_page(self, pdf_filename, page_num): def render_and_display_page(self, pdf_filename, page_num):
""" """
Rendert und zeigt eine spezifische Seite in der Vollansicht an. Rendert und zeigt eine spezifische Seite in der Vollansicht an.
Cached die gerenderten Pixmaps für bessere Performance.
Args: Args:
pdf_filename: Name der PDF-Datei pdf_filename: Name der PDF-Datei
@@ -269,7 +274,40 @@ class MainWindow(QMainWindow):
new_qimg = QImage.fromData(new_img_data) new_qimg = QImage.fromData(new_img_data)
new_pixmap = QPixmap.fromImage(new_qimg) new_pixmap = QPixmap.fromImage(new_qimg)
# Erstelle das überlagerte Bild # Cache die gerenderten Pixmaps für schnelle Alpha/Zoom-Operationen
self.current_rendered_pixmaps = {
'ref': ref_pixmap,
'diff': diff_pixmap,
'new': new_pixmap
}
# Aktualisiere aktuelle Seite
self.current_page = page_num
self.current_pdf = pdf_filename
# Zeige das Bild mit aktuellem Alpha- und Zoom-Wert an
self.update_current_display()
print(f"Seite {page_num + 1} erfolgreich gerendert und gecacht")
except Exception as e:
print(f"Fehler beim Rendern der Seite {page_num + 1}: {e}")
def update_current_display(self):
"""
Aktualisiert die Anzeige der aktuellen Seite basierend auf gecachten Pixmaps.
Verwendet für Alpha- und Zoom-Änderungen ohne erneutes PDF-Rendering.
"""
if not self.current_rendered_pixmaps:
print("Keine gerenderten Pixmaps verfügbar")
return
# Hole die gecachten Pixmaps
ref_pixmap = self.current_rendered_pixmaps['ref']
diff_pixmap = self.current_rendered_pixmaps['diff']
new_pixmap = self.current_rendered_pixmaps['new']
# Erstelle das überlagerte Bild mit aktuellem Alpha-Wert
alpha_value = self.ui.alpha.value() alpha_value = self.ui.alpha.value()
layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value) layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value)
@@ -283,15 +321,6 @@ class MainWindow(QMainWindow):
self.fullsize_label.setPixmap(layered_pixmap) self.fullsize_label.setPixmap(layered_pixmap)
self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter)
# Aktualisiere aktuelle Seite
self.current_page = page_num
self.current_pdf = pdf_filename
print(f"Seite {page_num + 1} erfolgreich angezeigt")
except Exception as e:
print(f"Fehler beim Rendern der Seite {page_num + 1}: {e}")
def _clear_layout(self, layout): def _clear_layout(self, layout):
"""Entfernt alle Widgets aus einem Layout.""" """Entfernt alle Widgets aus einem Layout."""
if layout is not None: if layout is not None:
@@ -315,15 +344,17 @@ class MainWindow(QMainWindow):
def on_alpha_changed(self, alpha_value): def on_alpha_changed(self, alpha_value):
""" """
Wird ausgeführt, wenn der Alpha-Slider geändert wird. Wird ausgeführt, wenn der Alpha-Slider geändert wird.
Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering.
Args: Args:
alpha_value: Der neue Alpha-Wert (-100 bis 100) alpha_value: Der neue Alpha-Wert (-100 bis 100)
""" """
print(f"Alpha geändert auf {alpha_value}") print(f"Alpha geändert auf {alpha_value}")
# Nur die aktuell angezeigte Seite neu rendern
start = time.time() start = time.time()
if self.current_pdf:
self.render_and_display_page(self.current_pdf, self.current_page) # Verwende gecachte Pixmaps für schnelle Alpha-Änderungen
self.update_current_display()
dauer = time.time() - start dauer = time.time() - start
print(f"Dauer: {dauer}") print(f"Dauer: {dauer}")
@@ -403,6 +434,7 @@ class MainWindow(QMainWindow):
def apply_zoom(self, zoom_value): def apply_zoom(self, zoom_value):
""" """
Wendet den Zoom-Faktor auf das aktuelle Bild an. Wendet den Zoom-Faktor auf das aktuelle Bild an.
Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering.
Args: Args:
zoom_value: Der neue Zoom-Wert (in Prozent) zoom_value: Der neue Zoom-Wert (in Prozent)
@@ -410,9 +442,8 @@ class MainWindow(QMainWindow):
self.current_zoom = zoom_value self.current_zoom = zoom_value
print(f"Zoom geändert auf {zoom_value}%") print(f"Zoom geändert auf {zoom_value}%")
# Nur die aktuell angezeigte Seite neu rendern # Verwende gecachte Pixmaps für schnelle Zoom-Änderungen
if self.current_pdf: self.update_current_display()
self.render_and_display_page(self.current_pdf, self.current_page)
def on_fullsize_mouse_press(self, event, fullsize_label): def on_fullsize_mouse_press(self, event, fullsize_label):
""" """