![]() |
BMP Resize suche guten Algorithmus
Hallo
Weiß jemand einen Link für einen guten Algorithmus zum vergrößern verkleinern einer Bitmap.
Delphi-Quellcode:
Habe dies im Netz gefunden mit beschränkten
function ResizeBitmap(_Bitmap : TBitmap; const maxWidth, maxHeight : integer) : boolean;
var thumbnail : TBitmap; thumbRect : TRect; begin try thumbnail := TBitmap.Create; thumbRect.Left := 0; thumbRect.Top := 0; thumbnail.Assign(_Bitmap); //proportional resize if thumbnail.Width > thumbnail.Height then begin thumbRect.Right := maxWidth; thumbRect.Bottom := (maxWidth * thumbnail.Height) div thumbnail.Width; end else begin thumbRect.Bottom := maxHeight; thumbRect.Right := (maxHeight * thumbnail.Width) div thumbnail.Height; end; thumbnail.Canvas.StretchDraw(thumbRect, thumbnail) ; //resize image thumbnail.Width := thumbRect.Right; thumbnail.Height := thumbRect.Bottom; //display in a TImage control Form4.Im.Picture.Assign(nil); thumbnail.SaveToFile('d:\zz.bmp'); Form4.Im.Picture.Assign(thumbnail); finally thumbnail.Free; end; end; "Antialiasing" Ergebnis. |
AW: BMP Resize suche guten Algorithmus
Ist ein guter Resizealgorithmus jener, der kein beschränktes Antialiasing hat?
Wie wärs wenn du das Bild selber vergrößerst und den Gaußschen Weichzeichneralgorithmus drüberwälzt? |
AW: BMP Resize suche guten Algorithmus
Und dann wäre noch die Frage zu klären: Performance? wichtig oder unwichtig?
MFG Memnarch |
AW: BMP Resize suche guten Algorithmus
Zitat:
|
AW: BMP Resize suche guten Algorithmus
Da nach "gut" und nicht nach "schnell" gefragt wurde: Bikubische Interpolation
|
AW: BMP Resize suche guten Algorithmus
Die besten Ergebnisse bei wenig Aufwand bekomme mit GDI+
benötigt drei units aus GDI+ ![]()
Delphi-Quellcode:
unit ExGraphicUtils;
//2010 Thomas Wassermann www.explido-software.de interface uses Windows, Classes, Sysutils, Graphics,GDIPAPI,GDIPOBJ,PNGImage, StdCtrls, jpeg, ActiveX; Type TGPImageWrapper=Class(TObject) private FImage: TGPImage; FStream: TMemoryStream; public Constructor Create(AGraphic:TGraphic); Destructor Destroy;override; Public Property Image:TGPImage read FImage; End; procedure SetCanvasZoomFactor(Canvas: TCanvas; AZoomFactor: Integer); Procedure SetCanvasZoomAndRotation(ACanvas:TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double); Procedure ScaleImage(source:String;dest:TCanvas;DestRect:Trect;Center:Boolean=true);overload; Procedure ScaleImage(source:TGraphic;dest:TCanvas;DestRect:Trect;Center:Boolean=true);overload; function CreateGraphicFromFile(const Filename: string): TGraphic; procedure MirrorBitmap(Bmp, MBmp: TBitmap;Horizonal:Boolean=true); Function FileNameIsImage(Const fn:String):Boolean; implementation /// SNIPP Procedure ScaleImage(source:String;dest:TCanvas;DestRect:Trect;Center:Boolean=true);overload; var graphics : TGPGraphics; image: TGPImage; width, height: Integer; faktor:Double; X, Y:Double; begin image:= TGPImage.Create(source); try width := image.GetWidth; height := image.GetHeight; if ((DestRect.Right - DestRect.Left) / width) < ((DestRect.Bottom -DestRect.Top)/Height) then faktor := (DestRect.Right - DestRect.Left) / width else faktor:= ((DestRect.Bottom -DestRect.Top)/Height); Faktor := ABS(Faktor); if Center then begin X := ((Destrect.Right - Destrect.Left) - faktor * width ) / 2; Y := ((Destrect.Bottom - Destrect.Top) - faktor * Height ) / 2; end else begin X := Destrect.Left; Y := Destrect.Top; end; graphics := TGPGraphics.Create(dest.Handle); try graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); graphics.DrawImage( image, MakeRect(X, Y , faktor * width, faktor * height), 0, 0, width, height, UnitPixel); finally graphics.Free; end; finally image.Free; end; end; Procedure ScaleImage(source:TGraphic;dest:TCanvas;DestRect:Trect;Center:Boolean=true);overload; // Das Bild graphics : TGPGraphics "lebt" nur so lange wie der Stream STR lebt var graphics : TGPGraphics; imagewrapper: TGPImageWrapper; width, height: Integer; faktor:Double; X, Y:Double; begin imagewrapper := TGPImageWrapper.Create(source); try width := imagewrapper.image.GetWidth; height := imagewrapper.image.GetHeight; if ((DestRect.Right - DestRect.Left) / width) < ((DestRect.Bottom -DestRect.Top)/Height) then faktor := (DestRect.Right - DestRect.Left) / width else faktor:= ((DestRect.Bottom -DestRect.Top)/Height); Faktor := ABS(Faktor); if Center then begin X := Destrect.Left + ((Destrect.Right - Destrect.Left) - faktor * width ) / 2; Y := Destrect.Top + ((Destrect.Bottom - Destrect.Top) - faktor * Height ) / 2; end else begin X := Destrect.Left; Y := Destrect.Top; end; graphics := TGPGraphics.Create(dest.Handle); try graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); graphics.DrawImage( imagewrapper.image, MakeRect(X, Y , faktor * width, faktor * height), 0, 0, width, height, UnitPixel); finally graphics.Free; end; finally imagewrapper.Free; end; end; |
AW: BMP Resize suche guten Algorithmus
@JHeins: Also ich möchte dich jetzt nicht in eine Philosophische diskussion über 'Gut' ziehen, aber ein Guter algorythmuss kan gut sein, weil er schnell ist, weil er performant ist, weil er wenig speicher verbaucht, weil er das optimum der 3 vorherigen kombiniert ;)
|
AW: BMP Resize suche guten Algorithmus
Zitat:
|
AW: BMP Resize suche guten Algorithmus
Danke für eure Antworten
Performance gute Frage Nö die ist mir hier nicht wichtig |
AW: BMP Resize suche guten Algorithmus
Danke Bummi, GDI+ das sind ja total Mächtige Tool's für Grafik.
Ergänzung Zitat:
|
AW: BMP Resize suche guten Algorithmus
Grad mal ne andere Frage: Reicht es denn nicht, einfach ein
Delphi-Quellcode:
vor das StretchDraw zu setzen? Eventuell auch mal das StretchDraw gegen
SetStretchBltMode(thumbnail.Canvas.Handle, HALFTONE);
SetBrushOrgEx(thumbnail.Canvas.Handle, 0, 0, nil); ![]() Bernhard |
AW: BMP Resize suche guten Algorithmus
Bischen umgewandelt, sollte der Code von
![]() |
AW: BMP Resize suche guten Algorithmus
Zitat:
Habe doch geantwortet das Bummis Idee richtig gute Ergebnisse liefert. Ich habe noch eine Corel5 Image CD mit tausenden CMX files und so habe ich tausende Bilder wo ich das Copyright nicht beachten muss und die Bitmaps sollen eben ganz ordentlich aussehen. |
AW: BMP Resize suche guten Algorithmus
Zitat:
Vielen Dank für den Link zu ![]() Dort ist aber leider mindestens ein Fehler drin ;-) Alt:
Delphi-Quellcode:
function LoadJPEGPictureFile(Bitmap: TBitmap; FilePath, FileName: string): Boolean;
var JPEGImage: TJPEGImage; begin if (FileName = '') then // No FileName so nothing Result := False //to load - return False... ... Neu:
Delphi-Quellcode:
Nachwievor liefert aber die
function LoadJPEGPictureFile(Bitmap: TBitmap; FilePath, FileName: string): Boolean;
var JPEGImage: TJPEGImage; begin Result := True; // <= wurde "vergessen" ;-) if (FileName = '') then // No FileName so nothing Result := False //to load - return False... ... function JPEGDimensions(Filename : string; var X, Y : Word) : boolean; bei mir falsche x- und y-Werte ab ;-) ===== Sehr nett ist, wenn man bei
Delphi-Quellcode:
das
procedure ResizeImage(FileName: string; MaxWidth: Integer);
var OldBitmap: TBitmap; NewBitmap: TBitmap; aWidth: Integer; begin OldBitmap := TBitmap.Create; try if LoadJPEGPictureFile(OldBitmap, ExtractFilePath(FileName), ExtractFileName(FileName)) then begin aWidth := OldBitmap.Width; if (OldBitmap.Width > MaxWidth) then
Delphi-Quellcode:
durch
if (OldBitmap.Width > MaxWidth) then
Delphi-Quellcode:
ersetzt.
if (OldBitmap.Width <> MaxWidth) then
Dann Vergrößert die Prozedur sogar recht brauchbar ;-) LG vergessen Edit möchte wissen, wie man nachträglich Delphi-Tags setzt. Die Mods können es ja schließlich auch... Edit2 hat versucht, nachträglich Delphi-Tags zu setzen :-) Dank an Bummi & f.kerber. Dachte, das ginge einfacher (Markieren und irgendwo draufklicken) ;-( |
AW: BMP Resize suche guten Algorithmus
Code:
[delphi]
Code... [/delphi] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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