Alphablending und Zoom werden beschleunigt
This commit is contained in:
+51
-20
@@ -37,6 +37,9 @@ class MainWindow(QMainWindow):
|
||||
self.current_page = 0
|
||||
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)
|
||||
self.fullsize_label = None
|
||||
|
||||
@@ -115,6 +118,7 @@ class MainWindow(QMainWindow):
|
||||
# Dicts zurücksetzen
|
||||
self.thumbnail_to_page = {}
|
||||
self.pdf_documents = {}
|
||||
self.current_rendered_pixmaps = None
|
||||
|
||||
# Basis-Pfad zu den PDF-Ordnern
|
||||
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):
|
||||
"""
|
||||
Rendert und zeigt eine spezifische Seite in der Vollansicht an.
|
||||
Cached die gerenderten Pixmaps für bessere Performance.
|
||||
|
||||
Args:
|
||||
pdf_filename: Name der PDF-Datei
|
||||
@@ -269,29 +274,53 @@ class MainWindow(QMainWindow):
|
||||
new_qimg = QImage.fromData(new_img_data)
|
||||
new_pixmap = QPixmap.fromImage(new_qimg)
|
||||
|
||||
# Erstelle das überlagerte Bild
|
||||
alpha_value = self.ui.alpha.value()
|
||||
layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value)
|
||||
|
||||
# Wende aktuellen Zoom an
|
||||
zoom_factor = self.current_zoom / 100.0
|
||||
if zoom_factor != 1.0:
|
||||
new_width = int(layered_pixmap.width() * zoom_factor)
|
||||
layered_pixmap = layered_pixmap.scaledToWidth(new_width, Qt.TransformationMode.SmoothTransformation)
|
||||
|
||||
# Setze das überlagerte Bild
|
||||
self.fullsize_label.setPixmap(layered_pixmap)
|
||||
self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter)
|
||||
# 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
|
||||
|
||||
print(f"Seite {page_num + 1} erfolgreich angezeigt")
|
||||
# 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()
|
||||
layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value)
|
||||
|
||||
# Wende aktuellen Zoom an
|
||||
zoom_factor = self.current_zoom / 100.0
|
||||
if zoom_factor != 1.0:
|
||||
new_width = int(layered_pixmap.width() * zoom_factor)
|
||||
layered_pixmap = layered_pixmap.scaledToWidth(new_width, Qt.TransformationMode.SmoothTransformation)
|
||||
|
||||
# Setze das überlagerte Bild
|
||||
self.fullsize_label.setPixmap(layered_pixmap)
|
||||
self.fullsize_label.setAlignment(Qt.AlignmentFlag.AlignHCenter)
|
||||
|
||||
def _clear_layout(self, layout):
|
||||
"""Entfernt alle Widgets aus einem Layout."""
|
||||
if layout is not None:
|
||||
@@ -315,15 +344,17 @@ class MainWindow(QMainWindow):
|
||||
def on_alpha_changed(self, alpha_value):
|
||||
"""
|
||||
Wird ausgeführt, wenn der Alpha-Slider geändert wird.
|
||||
Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering.
|
||||
|
||||
Args:
|
||||
alpha_value: Der neue Alpha-Wert (-100 bis 100)
|
||||
"""
|
||||
print(f"Alpha geändert auf {alpha_value}")
|
||||
# Nur die aktuell angezeigte Seite neu rendern
|
||||
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
|
||||
print(f"Dauer: {dauer}")
|
||||
|
||||
@@ -403,6 +434,7 @@ class MainWindow(QMainWindow):
|
||||
def apply_zoom(self, zoom_value):
|
||||
"""
|
||||
Wendet den Zoom-Faktor auf das aktuelle Bild an.
|
||||
Optimiert: Verwendet gecachte Pixmaps statt erneutes PDF-Rendering.
|
||||
|
||||
Args:
|
||||
zoom_value: Der neue Zoom-Wert (in Prozent)
|
||||
@@ -410,9 +442,8 @@ class MainWindow(QMainWindow):
|
||||
self.current_zoom = zoom_value
|
||||
print(f"Zoom geändert auf {zoom_value}%")
|
||||
|
||||
# Nur die aktuell angezeigte Seite neu rendern
|
||||
if self.current_pdf:
|
||||
self.render_and_display_page(self.current_pdf, self.current_page)
|
||||
# Verwende gecachte Pixmaps für schnelle Zoom-Änderungen
|
||||
self.update_current_display()
|
||||
|
||||
def on_fullsize_mouse_press(self, event, fullsize_label):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user