Ich fange mal mit einem Beispiel an. Nehmen wir an, daß ich zwei Bitmaps habe die 100 Pixels breit und hoch sind. Beide haben also die gleiche Maße. Nun will ich das rechte untere Viertel der einen Bitmap in das linke obere Viertel kopieren. Das könnte ich z.B. so machen:
Quelltext
1:
| Bmp1.Canvas.Draw(-50, -50, Bmp2); |
Sieht einfach aus. Die andere Variante könnte so aussehen:
Quelltext
1:
| Bmp1.Canvas.CopyRect(Rect(0, 0, 50, 50), Bmp2.Canvas, Rect(50, 50, 100, 100)); |
Natürlich könnte man auch BitBlt anwenden, aber darum geht es nicht.
Die erste Variante ist einfach. Alles was zuviel ist wird von dem System abgeschnitten, der Rest landet in der Bitmap. Die zweite Variante ist schwieriger, da ich die Bereiche selbst vorher berechnen muß. Bei beiden Varianten sind die Ergebnisse aber die gleich.
Nun könnte man sich fragen wieso das ganze. Klar, bei einer kleinen Grafik ist das nichts. Da gibt es wahrscheinlich kein Geschwindigkeitsvorteil. Problematisch wird es aber wenn es hunderte Bitmaps in der Sekunde sind und sie auch etwas größer als 100 Pixel sind.
Meine Frage ist jetzt die: weiss einer wie das bei Canvas.Draw funktioniert? Kopiert Draw Pixel für Pixel die Bitmap und prüft ob der Pixel außerhalb des Bereichs ist? Das macht sie dann eventuell einige tausend mal. Oder berechnet sie vorher eine Region und kopiert nur diese Region rüber?
Noch ein Beispiel um es zu verdeutlichen. Ich hab eine Bitmap (Bmp1) die 10x10 Pixel ist und eine (Bmp2) die 2000x2000 Pixel ist. Nun kopiere ich die Große in die kleine:
Quelltext
1:
| Bmp1.Canvas.Draw(5, 5, Bmp2); |
Nun kann man sehen, daß ca. 99% des großen Bildes außerhalb sind. Warum also nicht vorher die wichtige Region berechnen und nur diesen Bereich kopieren. Natürlich kann ich mir das sparen wenn Draw das bereits macht. Kann aber auch sein, daß Draw eben Pixel für Pixel kopiert und alles drüber nur ignoriert. Zwar glaube ich das nicht, aber ich frag mal lieber. Leider hab ich die Pas Version der Unit nicht. Würde aber auch nichts bringen, da Draw wahrscheinlich auf BitBlt zugreift und BitBlt die ganze Arbeit erledigt. An der Frage ändert sich aber nichts. Dann eben BitBlt. Kopiert BitBlt Pixel für Pixel und ignoriert die die außerhalb sind oder wird vorher ein Bereich berechent?