Na, der Fehler liegt eher hier:
Deine Laufvariablen gehen von 0..768 und 0..1024 und greifen als Indizes auf deine Bitmap zu. Die ist aber u.U. viel kleiner.
Richtig geht es so (Pseudocode, also bitte keine Syntaxfehler oder fehlenden Deklarationen bemäkeln, das soll so sein):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| Procedure SlowStretch (aBitmap : TBitmap; aDestRect : TRect; aDestCanvas : TCanvas); Begin w := (aDestRect.Right - aDestRect.Left) / aBitmap.Width; h := (aDestRect.Bottom - aDestRect.Top) / aBitmap.Height; For i:=0 To aBitmap.Width - 1 do For j:=0 to aBitmap.Height - 1 do With aDestCanvas Do Begin Brush.Color := aBitmap.Pixel[j,i]; x := Scale (i, aBitmap.Width, aDestRect.Left, aDestRect.Right); y := Scale (j, aBitmap.Height, aDestRect.Top , aDestRect.Bottom); Rectangle (x, y, w, h) End End;
Function Scale (aSrc, aSrcSize, aLeft, aRight : Number) : Number; Begin Result := aLeft + aSrc*(aRight-aLeft)/aSrcSize; End; |
Leider funktioniert das nicht ohne Weiteres, weil die Dimension und Position des Zielpixels als gebrochen rationale Zahl berechnet wird, aber eine ganze Zahl sein muss. Daraus folgt, das die einzelnen Zielpixel i.A. nicht alle gleich aussehen. Daher ist ein Verzerren eines Bitmaps nicht trivial.
Du willst aber offensichtlich die Bitmaps nur doppelt so groß ausgeben. Dann müsstest Du das Zielrechteck nur doppelt so groß wählen, wie das Bitmap.
Die richtige Vorgehensweise ist jedoch, mit einem TImage zu Arbeiten und seine 'Streched' Eigenschaft zu verwenden. Auf den Canvas malt man eine Bitmap vergrößert wie Spaceguide bereits beschrieben hat.
Na denn, dann. Bis dann, denn.