Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   BMP Resize suche guten Algorithmus (https://www.delphipraxis.net/157776-bmp-resize-suche-guten-algorithmus.html)

ATS3788 24. Jan 2011 19:10

BMP Resize suche guten Algorithmus
 
Hallo

Weiß jemand einen Link für einen guten Algorithmus
zum vergrößern verkleinern einer Bitmap.

Delphi-Quellcode:
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;
Habe dies im Netz gefunden mit beschränkten
"Antialiasing" Ergebnis.

Aphton 24. Jan 2011 19:19

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?

Memnarch 24. Jan 2011 19:42

AW: BMP Resize suche guten Algorithmus
 
Und dann wäre noch die Frage zu klären: Performance? wichtig oder unwichtig?

MFG
Memnarch

Aphton 24. Jan 2011 19:46

AW: BMP Resize suche guten Algorithmus
 
Zitat:

Zitat von Memnarch (Beitrag 1076983)
Und dann wäre noch die Frage zu klären: Performance? wichtig oder unwichtig?

MFG
Memnarch

Da hat einer Erfahrung, gell? xD

jfheins 24. Jan 2011 19:48

AW: BMP Resize suche guten Algorithmus
 
Da nach "gut" und nicht nach "schnell" gefragt wurde: Bikubische Interpolation

Bummi 24. Jan 2011 20:28

AW: BMP Resize suche guten Algorithmus
 
Die besten Ergebnisse bei wenig Aufwand bekomme mit GDI+

benötigt drei units aus GDI+ http://www.progdigy.com/

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;

Memnarch 24. Jan 2011 23:22

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 ;)

Aphton 24. Jan 2011 23:44

AW: BMP Resize suche guten Algorithmus
 
Zitat:

Zitat von Memnarch (Beitrag 1077062)
@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 ;)

Jup, so ist es. Wahrscheinlich falsche Wortwahl aber es wurde verstanden, was er gemeint hat...

ATS3788 25. Jan 2011 07:36

AW: BMP Resize suche guten Algorithmus
 
Danke für eure Antworten

Performance gute Frage

Nö die ist mir hier nicht wichtig

ATS3788 25. Jan 2011 07:57

AW: BMP Resize suche guten Algorithmus
 
Danke Bummi, GDI+ das sind ja total Mächtige Tool's für Grafik.
Ergänzung
Zitat:

Mit richtig guten Ergebnissen

rollstuhlfahrer 25. Jan 2011 12:14

AW: BMP Resize suche guten Algorithmus
 
Grad mal ne andere Frage: Reicht es denn nicht, einfach ein
Delphi-Quellcode:
SetStretchBltMode(thumbnail.Canvas.Handle, HALFTONE);
SetBrushOrgEx(thumbnail.Canvas.Handle, 0, 0, nil);
vor das StretchDraw zu setzen? Eventuell auch mal das StretchDraw gegen Delphi-Referenz durchsuchenStretchBlt() austauschen.

Bernhard

lbccaleb 25. Jan 2011 15:51

AW: BMP Resize suche guten Algorithmus
 
Bischen umgewandelt, sollte der Code von hier auch intressant sein.

ATS3788 25. Jan 2011 16:54

AW: BMP Resize suche guten Algorithmus
 
Zitat:

Reicht es denn nicht
rollstuhlfahrer, Hätte ich die frage sonst gestellt ?!

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.

vergessen 26. Jan 2011 02:51

AW: BMP Resize suche guten Algorithmus
 
Zitat:

Zitat von lbccaleb (Beitrag 1077231)
Bischen umgewandelt, sollte der Code von hier auch intressant sein.

@lbccaleb Post#12:

Vielen Dank für den Link zu http://www.swissdelphicenter.ch/torr...de.php?id=1896 !

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:
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...
...
Nachwievor liefert aber die

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:
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
das
Delphi-Quellcode:
      if (OldBitmap.Width > MaxWidth) then
durch
Delphi-Quellcode:
      if (OldBitmap.Width <> MaxWidth) then
ersetzt.

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) ;-(

Bummi 26. Jan 2011 07:22

AW: BMP Resize suche guten Algorithmus
 
Code:
[delphi]
Code...
[/delphi]


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz