![]() |
AW: Resample oder Resize mit GDI+
Folgender Code funktioniert bei mir:
Delphi-Quellcode:
Leider hatte ich am Wochenende wenig Zeit und den Code über GDI+ (noch) nicht zum Laufen bekommen. Ich scheitere im Moment daran, dass mir
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;
Delphi-Quellcode:
erklärt, ich würde falsche Parameter übergeben. Dabei ist
GdipSetInterpolationMode(Dest, 4);
Delphi-Quellcode:
und 4 sollte eigentlich
Type Dest: Pointer
Delphi-Quellcode:
sein. Letztere sollte auch anstelle von
Type InterpolationModeBicubic: Integer
Delphi-Quellcode:
laufen, wie es wiederum in der uGDIUnit von Cardinal Emil Weiss definiert ist.
Cardinal
Dazu wieder 2 Fragen:
Gruß & Dank, Alex |
AW: Resample oder Resize mit GDI+
Hallo,
Zitat:
(2) Genau, der Unterschied ist, dass Du einmal Float und einmal Integer verwenden kannst. (3) Image und Graphics sind zwei völlig unterschiedliche Klassen. Das ist quasi Bitmap und Canvas in der VCL. Ein Image hat immer ein Graphics, welches zum Manipulieren der Bitmapdaten dient. Ich vermute, dass deshalb Deine Interpolation fehlschlägt, weil Du der Funktion das Image übergibst, und nicht das entsprechende Graphics-Objekt. Gruß xaromz |
AW: Resample oder Resize mit GDI+
Danke für diesen wertvollen Hinweis!
Zitat:
Delphi-Quellcode:
Was mache in denn da falsch?
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; Ich scheitere nun schon seit letzter Woche an
Delphi-Quellcode:
. 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).
GdipSetInterpolationMode()
|
AW: Resample oder Resize mit GDI+
Die Vorgehensweise ist folgende..
1. Ein graphic obj erstellen
Code:
2. Setzen der Optimierungsmodis
GdipCreateFromHDC(Hdc, graphics);
Verschiedene modis die du verwenden kannst. Smoothing, Interpolation, PixelOffset, CompositingMode..
Code:
wobei InterpolationModeHighQualityBicubic den Wert 7 enthält..
GdipSetInterpolationMode(graphics, InterpolationModeHighQualityBicubic);
QualityModeHigh := 2; InterpolationModeHighQualityBicubic := QualityModeHigh + 5; erst dann die Bilddatei als solche öffnen! EDIT: Zitat:
Du kannst ein img nicht in ein graphic object konvertieren.. Source und Destination müssen von typ graphics sein. Zitat:
Aber davon abgesehen ist es bei MS auch ein Cardinal .. "Pointer of Cardinal" Bei mir gehts siehe Picture :) gruss |
AW: Resample oder Resize mit GDI+
Hier der Source zum Bild!
Vielleicht hilft es dir ja weiter :) gruss |
AW: Resample oder Resize mit GDI+
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
aufgerufen.
GdipCreateFromHDC(TBitmap.Canvas.Handle, graphics);
Zitat:
Ich übergebe jetzt graphics mit
Delphi-Quellcode:
, wobei gilt:
GdipSetInterpolationMode(graphics, 7)
Delphi-Quellcode:
Ich habe jetzt mal aus lauter Verzweiflung einen kurzen Testcode beigefügt mit der GdipAPI.inc, die ich selbst gebastelt und bislang benutzt habe. Vielleicht sieht ja jemand auf Anhieb meinen Fehler.
Type
GdipGraphics = Pointer; GdipInterpolationMode = Integer; Function GdipSetInterpolationMode(Out graphics: GdipGraphics; interpolationMode: GdipInterpolationMode): GdipStatus; Stdcall; External Gdip; [EDIT] Mist! Du warst schneller ;-) [/EDIT] Gruß, Alex |
AW: Resample oder Resize mit GDI+
Siehe mein Source ;)
gruss |
AW: Resample oder Resize mit GDI+
Schmeiss mal das shit OUT aus "Out graphics: GdipGraphics" raus.
Dann funktioniert es auch. gruss |
AW: Resample oder Resize mit GDI+
Liste der Anhänge anzeigen (Anzahl: 1)
@Eweiss
Hi, Ich hatte Ihn so verstanden daß er ein bestehenden GraphicObject direkt skalieren will ohne Umweg über ein File. Ich habe mal eine Prozedur:
Delphi-Quellcode:
in Deinen Code mit eingebaut, erfordert allerdings Classes,ActiveX wg.
function DrawImageFromGraphic(source:TGraphic;
DrawHdc: HDC; Percent: Integer; Interpolation: InterpolationMode = InterpolationModeDefault; Smoothing : SmoothingMode = SmoothingModeNone; PixelOffset : PixelOffsetMode = PixelOffsetModeNone; CompositingQuality: CompositingQualityMode = CompositingQualityDefault; CompositingMode: CompositingModeMode = CompositingModeSourceOver): Boolean; function GdipLoadImageFromStreamICM(stream: ISTREAM; out image: Cardinal): Integer; stdcall; {$EXTERNALSYM GdipLoadImageFromStreamICM} ist nur eine Quickhack, Du darfst falls Du es brauchen kannst das ganze gern optimieren. |
AW: Resample oder Resize mit GDI+
@Bummi
Zitat:
Das Problem war aber eher das setzen des InterpolationMode Die übergebenen Parameter müssen identisch sein sonst klappt das nicht :) Er kann nicht bei Out graphis nicht einfach einen Pointer graphics übergeben ... Wenn schon dann bitte das OUT entfernen dann funktioniert das auch. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz