So wie ich das verstanden habe, macht die eigentliche Arbeit der Skalierung GDIP_DrawImageRect. Es geht also lediglich darum die korrekte Breite/Höhe zu ermitteln.
Das Problem sind eigentlich zwei Probleme. Du willst das Bild zentrieren und das Bildverhältnis beibehalten.
Du musst dazu in einem ersten Schritt die richtige Breite/Höhe anpassen und in einem zweiten Schritt das Bild zentrieren.
Delphi-Quellcode:
var
SollVerhaeltnis: Double;
IstVerhaeltnis: Double;
w, h: Integer;
begin
IstVerhaeltnis := GifFrameRect.Width / GifFrameRect.Height;
SollVerhaeltnis := rc.Width / rc.Height;
if IstVerhaeltnis>SollVerhaeltnis
then begin
w := rc.Width;
h := trunc(rc.Width / IstVerhaeltnis);
end
else
if IstVerhaeltnis<SollVerhaeltnis
then begin
h := rc.Height;
w := trunc(rc.Height * IstVerhaeltnis);
end
else begin
w := rc.Width;
h := rc.Height;
end;
end;
Nun hast die gewünschte Breite und Höhe des Ziel-Bildes. Als nächste musst Du diese Werte benutzen um die Position zu berechnen
Delphi-Quellcode:
x := (rc.Width-w) div 2 + rc.left;
y := (rc.Height-h) div 2 + rc.top;