Grafiken proportional skalieren

Mit dieser Prozedur können Sie Grafiken proportional verkleinern/vergrößern.
procedure StretchGraphic(const src, dest: TGraphic;
  DestWidth, DestHeight: integer; Smooth: Boolean = true);
var
  temp, aCopy: TBitmap;
  faktor: double;
begin
  Assert(Assigned(src) and Assigned(dest));
  if (src.Width = 0) or (src.Height = 0) then
    raise Exception.CreateFmt('Invalid source dimensions: %d x %d',[src.Width, src.Height]);
  if src.Width > DestWidth then
    begin
      faktor := DestWidth / src.Width;
      if (src.Height * faktor) > DestHeight then
        faktor := DestHeight / src.Height;
    end
  else
    begin
      faktor := DestHeight / src.Height;
      if (src.Width * faktor) > DestWidth then
        faktor := DestWidth / src.Width;
    end;
  try
    aCopy := TBitmap.Create;
    try
      aCopy.PixelFormat := pf24Bit;
      aCopy.Assign(src);
      temp := TBitmap.Create;
      try
        temp.Width := round(src.Width * faktor);
        temp.Height := round(src.Height * faktor);
        if Smooth then
          SetStretchBltMode(temp.Canvas.Handle, HALFTONE);
        StretchBlt(temp.Canvas.Handle, 0, 0, temp.Width, temp.Height,
          aCopy.Canvas.Handle, 0, 0, aCopy.Width, aCopy.Height, SRCCOPY);
        dest.Assign(temp);
      finally
        temp.Free;
      end;
    finally
      aCopy.Free;
    end;
  except
    on E: Exception do
      MessageBox(0, PChar(E.Message), nil, MB_OK or MB_ICONERROR);
  end;
end;
Parameter:
  • src: die Quellgrafik vom Typ TGraphic
  • dest: die Zielgrafik vom selben Typ
  • DestWidth: maximal erlaubte Breite der Zielgrafik
  • DestHeight: maximal erlaubte Höhe der Zielgrafik
  • Smooth: berechnete Farben verwenden
Auswirkungen von Smooth
Falls Sie sich unter den berechneten Farben nichts vorstellen können, hier eine Gegenüberstellung, links Smooth ein, rechts aus (die Quellgrafik in der Größe 1632x1224 war natürlich in beiden Fällen exakt dieselbe):