Danke für diesen wertvollen Hinweis!
... Image und Graphics sind zwei völlig unterschiedliche Klassen. ... Ich vermute, dass deshalb Deine Interpolation fehlschlägt, weil Du der Funktion das Image übergibst, und nicht das entsprechende Graphics-Objekt.
Ich habe nun folgendes versucht, was aber nicht funktioniert. Ich komme sowei, dass ich ein
GDI+ Image ausgehend von meinem TBitmap anlegen und ausgehend davon einen Zeiger auf das
GDI+ Graphics bekomme. Trotzdem lässt sich der InterpolationMode nicht setzen mit dem Hinweis auf falsche Parameter:
Delphi-Quellcode:
Function GdipSetInterpolationMode(Out graphics: GdipImage;
interpolationMode: GdipInterpolationMode): GdipStatus; Stdcall;
External Gdip;
// GdipImage = Pointer; GdipInterpolationMode = Integer
Procedure TBitmapEx.StretchGdip(Const NewWidth, NewHeight: Integer;
Const PreserveAspectRatio: Boolean = True);
Var
Source : GdipImage; // = Pointer
Dest : GdipGraphics; // = Pointer
Stat : GdipStatus;
Begin
If (Self.Empty) Then Exit;
If (GdipCreateBitmapFromHBITMAP(self.Handle, self.Palette, Source) = Ok) Then
Begin
If (GdipGetImageGraphicsContext(Source, Dest) = Ok) Then
Begin
// Bis hierhin ist alles OK!
Stat:=GdipSetInterpolationMode(Dest, 4);
// Hier kommt der Hinweis auf falsche Parameter; leider nicht genau welcher der beiden möglichen...
ShowMessage(GdipStatusMessage[Stat]);
End;
GdipDisposeImage(Source);
End;
End;
Was mache in denn da falsch?
Ich scheitere nun schon seit letzter Woche an
GdipSetInterpolationMode()
. Ich habe alle möglichen Deklarationen angefangen von GDIPlus über IGDIPlus bis hin zu dem Uhr-Beispiel von EWeiss probiert. Im Grunde fehlen doch nur noch 3 Zeilen ((1)Interpolation Mode setzen (2) Bild zeichnen mit Draw und (3) ggf. auf das TBitmap zurückschieben).