// Wenn man Bitmaps
mit Stretchdraw
(oder mit
StretchBlt ohne SetStretchBltMode)
//
vergrößert, kommt es zu Verpixelung
(Abbildung 2).
Das kann man mittels StretchBlt
// und setzen von SetstretchBltMode auf STRETCH_HALFTONE umgehen. Allerdings bei
//
kontrastreichen Bildern, starken Übergängen von einer Farbe zur anderen
(in den
// Bildern
mit einem Pfeil gekennzeichnet) oder softwaremäßig nachgeschärften Bildern
// ist es in etwa einem
Drittel aller Fälle besser, das Bild selber zu Sampeln. Warum
// das so sein kann, zeigen die
starken Vergrößerungen der Abbildungen 5 bis 7.
// Anmerkung:
// Die gezeigten Bilder entsprechen nicht ganz genau den bearbeiteten
Bitmaps,
// da sie aus Platzgründen in JPegs gewandelt wurden.
// Getestet mit D4 unter XP
|
![](frori.jpg) |
|
|
Abbildung 1
Original |
|
![](frpix.jpg) |
![](frmode.jpg) |
![](frsmp.jpg) |
Abbildung 2
StretchDraw |
Abbildung
3
SetstretchBltMode +
StretchBlt |
Abbildung 4
ResampleBitmap |
![](frgp.jpg) |
![](frgm.jpg) |
![](frgs.jpg) |
Abbildung 5 |
Abbildung 6 |
Abbildung 7 |
--------------------------- Punkt im Haar 21-fach vergrößert
---------------------------- |
procedure ResampleBitmap(src, dst: TBitmap);
var
sz1, sz2, dz: PByteArray;
xx, yy, mxx, myy, xxyy, xmy, mxy, xy: single;
x, y, x3, xs1, xs11, xs12, xs21, xs22, yz1, xs2, yz2, sw, sh, dw, dh:
integer;
begin
src.PixelFormat := pf24Bit;
dst.PixelFormat := pf24Bit;
sw := pred(src.width);
sh := pred(src.height);
dw := pred(dst.width);
dh := pred(dst.height);
for y := 0 to dh do begin
yy := y * (sh / dh);
yz1 := Trunc(yy);
yy := frac(yy);
yz2 := yz1 + ord(yy > 0);
myy := 1 - yy;
sz1 := src.ScanLine[yz1];
sz2 := src.ScanLine[yz2];
dz := dst.ScanLine[y];
for x := 0 to dw do begin
xx := x * (sw / dw);
xs1 := Trunc(xx) * 3;
xx := frac(xx);
xs2 := xs1 + ord(xx > 0) * 3;
mxx := 1 - xx;
xxyy := mxx * myy;
mxy := mxx * yy;
xmy := xx * myy;
xy := xx * yy;
xs11 := succ(xs1);
xs21 := succ(xs2);
xs12 := succ(xs11);
xs22 := succ(xs21);
x3 := x * 3;
dz[x3] := round(sz1[xs1] * xxyy + sz1[xs2] * xmy + sz2[xs1] * mxy +
sz2[xs2] * xy);
dz[x3 + 1] := round(sz1[xs11] * xxyy + sz1[xs21] * xmy + sz2[xs11] *
mxy + sz2[xs21] * xy);
dz[x3 + 2] := round(sz1[xs12] * xxyy + sz1[xs22] * xmy + sz2[xs12] *
mxy + sz2[xs22] * xy);
end;
end;
end;
// Beispiel
procedure TForm1.Button1Click(Sender: TObject);
var Original, Gestretcht, Gesampled: TBitmap;
begin
Original := TBitmap.create;
Gesampled := TBitmap.create;
Gestretcht := TBitmap.create;
Original.loadfromfile('c:\frau.bmp');
Gesampled.width := Original.width * 2;
Gesampled.height := Original.height * 2;
Gestretcht.width := Original.width * 2;
Gestretcht.height := Original.height * 2;
SetstretchBltMode(Gestretcht.canvas.handle, STRETCH_HALFTONE);
StretchBlt(Gestretcht.canvas.handle, 0, 0, Gestretcht.width,
Gestretcht.height, Original.canvas.handle, 0, 0, Original.width,
Original.height, srcCopy);
ResampleBitmap(Original, Gesampled);
Canvas.Draw(0, 0, Original);
Canvas.Draw(Original.width, 0, Gestretcht);
Canvas.Draw(Original.width + Gestretcht.width, 0, Gesampled);
Gestretcht.free;
Gesampled.free;
Original.free;
end;
![](zurueck.gif)
|