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_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,29 +274,53 @@ 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
|
||||||
alpha_value = self.ui.alpha.value()
|
self.current_rendered_pixmaps = {
|
||||||
layered_pixmap = self.create_layered_pixmap(ref_pixmap, diff_pixmap, new_pixmap, alpha_value)
|
'ref': ref_pixmap,
|
||||||
|
'diff': diff_pixmap,
|
||||||
# Wende aktuellen Zoom an
|
'new': new_pixmap
|
||||||
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)
|
|
||||||
|
|
||||||
# Aktualisiere aktuelle Seite
|
# Aktualisiere aktuelle Seite
|
||||||
self.current_page = page_num
|
self.current_page = page_num
|
||||||
self.current_pdf = pdf_filename
|
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:
|
except Exception as e:
|
||||||
print(f"Fehler beim Rendern der Seite {page_num + 1}: {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):
|
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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user