Einzelnen Beitrag anzeigen

Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 

TBitmap(32) unter Beibehaltung der Proportionen skalieren

  Alt 11. Jun 2006, 16:18
Hallo, diese zwei Funktionen nehmen ein TBitmap(32) und einen Punkt, der die Ausmaße des skalierten Bildes hält, und geben das skalierte Bild zurück.
Bei der Graphics32-Funktion ist durch Verwendung der Stretchfilter sfMitchell zum Vergrößern und sfLanczos zum Verkleinern eine sehr viel höhere Qualität gewährleistet, afaik stretcht das TBitmap nur linear.

Delphi-Quellcode:
uses Math;

uses GR32;
{-----------------------------------------------------------------------------
  Function:  ResizeBitmap(32)
  Author:    DGL-luke
  Date:      11-Jun-2006
  Arguments: src: TBitmap(32); dst: TPoint
  Result:    TBitmap(32)

  stretches a TBitmap(32) into a rect, keeping proportions
  Ein TBitmap(32) wird in ein Rechteck einskaliert, die Proportionen werden beibehalten.
-----------------------------------------------------------------------------}

function ResizeBitmap32(src: TBitmap32; dst: TPoint): TBitmap32;
var
  scalex, scaley, scale: single;
  sf: TStretchFilter;
begin
  scalex := dst.X / src.Width;
  scaley := dst.Y / src.Height;


  scale := Min(scalex, scaley);

  if scale > 1 then
    sf := sfMitchell // magnifying filter
  else
    sf := sfLanczos;


  Result := TBitmap32.Create;
  Result.Width := Ceil(src.Width * scale);
  Result.Height := Ceil(src.Height * scale);

  Result.Clear(clWhite32);

  Result.StretchFilter := sf;
  Result.Draw(rect(0,0,Result.Width,Result.Height), // over the whole bitmap
              rect(0,0,src.Width,src.Height), // the whole src
              src);
end;

uses Graphics;
function ResizeBitmap(src: TBitmap; dst: TPoint): TBitmap;
var
  scalex, scaley, scale: single;
begin
  scalex := dst.X / src.Width;
  scaley := dst.Y / src.Height;

  scale := Min(scalex, scaley);

  Result := TBitmap.Create;
  Result.Width := Ceil(src.Width * scale);
  Result.Height := Ceil(src.Height * scale);

  Result.Canvas.StretchDraw(rect(0,0,Result.Width,Result.Height), src);
end;
[edit=Chakotay1308]Code-Formatierung. Mfg, Chakotay1308[/edit]
[edit=fkerber]Neu gespeichert wegen Syntax-Highlighting. Mfg, fkerber[/edit]
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat