Folgender Code funktioniert bei mir:
Delphi-Quellcode:
Procedure TBitmapEx.StretchGDI(Const NewWidth, NewHeight: Integer);
Var
ScaleDown : Boolean;
W, H : Integer;
oldW, oldH : Integer;
Begin
If (self.Empty) Or
((NewWidth = 0) And (NewHeight = 0)) Or
((NewWidth = self.Width) And (NewHeight = self.Height)) Then
Exit;
W:=NewWidth;
H:=NewHeight;
oldW:=self.Width;
oldH:=self.Height;
If (W = 0) Then W:=H * self.Width Div self.Height;
If (H = 0) Then H:=W * self.Height Div self.Width;
ScaleDown:=True;
If (W < self.Width) Or (H < self.Height) Then
SetStretchBltMode(self.Canvas.Handle, Halftone)
Else
Begin
ScaleDown:= False;
self.Width:= W;
self.Height:=H;
End;
StretchBlt(self.Canvas.Handle, 0, 0, W, H,
self.Canvas.Handle, 0, 0, oldW, oldH,
SRCCOPY);
If (ScaleDown) Then
Begin
self.Width:= W;
self.Height:=H;
End;
End;
Leider hatte ich am Wochenende wenig Zeit und den Code über
GDI+ (noch) nicht zum Laufen bekommen. Ich scheitere im Moment daran, dass mir
GdipSetInterpolationMode(Dest, 4);
erklärt, ich würde falsche Parameter übergeben. Dabei ist
Type Dest: Pointer
und 4 sollte eigentlich
Type InterpolationModeBicubic: Integer
sein. Letztere sollte auch anstelle von
Cardinal
laufen, wie es wiederum in der uGDIUnit von Cardinal Emil Weiss definiert ist.
Dazu wieder 2 Fragen:
- Wenn GDI ohne zusätzliches Bitmap resizen kann, sollte das nicht auch mit GDI+ funktionieren? Dann brauchte ich doch kein Var Source, Dest: Pointer
, sondern es sollte dann einfach eines reichen.
- Wo ist der Unterschied zwischen GdipDrawImageRect()
und GdipDrawImageRectI()
? Einfach nur, dass die eine Funktion mit Gleitkommazahlen und die andere mit Integer funktioniert?
- Wo ist bei den Funktionen unter 2. der Unterschied zwischen Graphics
und Image
? Beides ist laut den Erläuterungen zu GDI+ von MS ein Pointer bzw. bei Emil Weiss Cardinal.
Gruß & Dank, Alex