// 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

   
  Abbildung 1
Original
 
Abbildung 2
StretchDraw
 Abbildung 3
SetstretchBltMode + StretchBlt
Abbildung 4
ResampleBitmap
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;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke