Entwickler-Ecke

Multimedia / Grafik - Sehr großes Bild zeichnen


Leto - Do 10.08.06 18:09
Titel: Sehr großes Bild zeichnen
Hallo, meine erste Frage in der Welt von c# und .NET.
Meine Suche ergab kein Ergebnis, daher hier die Frage:

In einer Anwendung wird ein größeres Bild im Backbuffer verwaltet, etwa 8000x6000 Pixel, also größer als der Bildschrim. Auf der Zeichenfläche (eine PictureBox) soll es nun entsrechend dem sichtbaren Ausschnitt bei Gelegenheit angezeigt werden (bsp. Benutzer benutzt die umschliesenden Scrollbalken). Das Problem ist nur, dass DrawImage mir mieserable Ergebnisse hinsicht Laufzeit bietet.

Wie kann ich schneller das Bild zeichnen?

Bisheriger Code im Paint-Ereignis des PictureBox:


Quelltext
1:
e.Graphics.DrawImage(backbuffer, 0, 0, new Rectangle(scrollbar1.Value, scrollbar2.Value, pictureBox1.Width, pictureBox1.Height), GraphicsUnit.Pixel);                    


PS: Unter Delphi hätte ich BitBlt genutzt, aber gibt es nicht eine .NET native Lösung?


Neidhard von Reuental - Do 10.08.06 22:09

Ich versteh nich so richtig den Sinn des Ganzen.
Warum zeigst Du nicht einfach das ganze Bild in der PictureBox in Originalgröße?


Leto - Fr 11.08.06 09:55

Das Bild ist sehr groß und in dieser Größe soll es betrachtet werden. Das Forum wird ja (vertikal) auch nicht auf den verfügbaren Bilschirmplatz gepresst, sondern zeigt eine Bildlaufleiste, um einen anderen Ausschnitt darszustellen.

Das Bild ist darüberhinaus im Backbuffer, weil auf der Karte vorher Zeichenoperationen stattfinden und ich Doublebuffering nutze.


Neidhard von Reuental - Fr 11.08.06 14:27

Wie oft wird denn auf die Grafik gezeichnet? Wenn es nur zu Begin ist, kannst Du es doch trotzdem in einer PictureBox anzeigen.
Die PictureBox selber besitzt ja keine Scrollbalken, wahrscheinlich willst Du deswegen das Neuzeichnen übernehmen. Ist aber völlig unnötig.
Um Scrollbalken für eine PictureBox zu bekommen packt man die PictureBox einfach in ein Panel und stellt in der PictureBox-Eigenschaft auf AutoSize. Das Panel übernimmt dadurch die Anzeige und Funtion der Scrollbalken.


Leto - Fr 11.08.06 23:43

Es wird sehr häufig etwas darauf gezeichnet (und vor allem in abhängig des Kontext auch was anderes natürlich). Aber ich sehe schon, dass ich den Mechanismus unterschätzt habe. Wenn ich die Hintergrundgrafik wie oben beschrieben gleich zu Beginn verankere und dann nur die die notwendigen zeichenoperationen im onPaint() durchführe, klappt es auch, ganz ohne Backbuffer.

Nichtsdestotrotz ist auch die interne Zeichen-Lösung durch die Combo PaintBox und Panel mit Scrollbalken nicht wirklich geschwind...