Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Beim *.bmp skalieren geht Qualität verloren? (https://www.delphipraxis.net/173552-beim-%2A-bmp-skalieren-geht-qualitaet-verloren.html)

OrNEC 2. Mär 2013 22:57


Beim *.bmp skalieren geht Qualität verloren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jungs,

ich konvertiere ein JPEG-Bild in ein BMP-Bild und die Qualität des Bildes bleibt erhalten. Schneide ich jedoch das konvertierte BMP-Bild geht die Qualität verloren. Wieso eigentlich?

Delphi-Quellcode:
procedure TForm2.PictureBitBtnClick(Sender: TObject);
var
  jpeg: TJPEGImage;
  bmp, bmp2: TBitmap;
  von, nach: TRect;
begin

  if OpenPictureDialog1.Execute then
  begin
    jpeg := TJPEGImage.Create;
    try
      jpeg.CompressionQuality := 100;
      jpeg.LoadFromFile(OpenPictureDialog1.FileName);
      bmp := TBitmap.Create;
      bmp2 := TBitmap.Create;
      try
        bmp.Assign(jpeg);
        bmp.SaveTofile(ChangeFileExt(OpenPictureDialog1.FileName, '.bmp')); // <-- die Qualität bleibt erhalten
        bmp2.Width := 200;
        bmp2.Height := 200;

        // Schneiden
        von := Rect(0, 0, bmp.Width, bmp.Height);
        nach := Rect(0, 0, 200, 200);
        bmp2.Canvas.CopyRect(nach, bmp.Canvas, von);
        bmp2.SaveTofile(ChangeFileExt(OpenPictureDialog1.FileName, '(klein).bmp')); // <-- hier nicht, geht verloren
      finally
        bmp.Free;
        bmp2.Free;
      end;
    finally
      jpeg.Free;
    end;
  end;

end;

Namenloser 2. Mär 2013 23:19

AW: Beim *.bmp schneiden geht Qualität verloren?
 
Was du da machst ist nicht Schneiden, sondern Skalieren, und dabei ist Resampling nötig. Das Resampling von StretchDraw ist standardmäßig leider... schlecht.

Auf StackOverflow gibt es einige Lösungsvorschläge.

Volker Z. 2. Mär 2013 23:48

AW: Beim *.bmp schneiden geht Qualität verloren?
 
Hallo,

und wenn Du tatsächlich nur einen Teil der Grafik (aus)schneiden möchtest, dann sollte das so gehen:
Delphi-Quellcode:
// Schneiden
von := Rect(0, 100, 50, 150); // der Teilbereich, der "ausgeschnitten" werden soll aus bmp
nach := Rect(0, 0, bmp2.Width, bmp2.Height);

bmp2.Canvas.CopyRect(nach, bmp.Canvas, von);
Gruß

Medium 3. Mär 2013 00:20

AW: Beim *.bmp schneiden geht Qualität verloren?
 
Es sei der Vollständigkeit halbar noch hinzugefügt: Wenn es wirklich um Verkleinern geht, kommt man (informationstechnisch) nicht um einen Verlust herum. Nie. Egal wie. Man kann höchstens dafür sorgen, wie NamenLozer schon angedeutet hat, dass zur Verkleinerung eine Methode benutzt wird, die zum Erhalt der für Menschen wichtigen Aspekte eines Bildes besser geeignet ist als das, was StretchDraw standardmäßig macht. (Übrigens kann man das StretchDraw() der WinAPI durchaus dazu veranlassen etwas hübschere Skalierungen zu machen, jedoch bringt es nicht die besseren Filter mit. (Lanczos, Sinc oder Bikubisch bei Verkleinerungen z.B.))

Wenn es wirklich um schneiden geht, ist Volker dein Freund.

OrNEC 3. Mär 2013 08:06

AW: Beim *.bmp skalieren geht Qualität verloren?
 
Hab mich falsch ausgedruckt, möchte das Bild natürlich skalieren. Mein Beispielcode macht das auch, nur mit massiven Qualitätsverlusten.

DeddyH 3. Mär 2013 08:44

AW: Beim *.bmp skalieren geht Qualität verloren?
 
Wie sieht es hiermit aus?

Bummi 3. Mär 2013 08:50

AW: Beim *.bmp skalieren geht Qualität verloren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Recht gute Ergebnisse bekommst Du mit GDI+ und graphics.SetInterpolationMode(InterpolationModeHig hQualityBicubic);

Im Anhang ist ein Beispielprogramm (Source)...

OrNEC 11. Mär 2013 20:52

AW: Beim *.bmp skalieren geht Qualität verloren?
 
Zitat:

Zitat von Bummi (Beitrag 1205758)
Recht gute Ergebnisse bekommst Du mit GDI+ und graphics.SetInterpolationMode(InterpolationModeHig hQualityBicubic);

Im Anhang ist ein Beispielprogramm (Source)...

Danke dir, bekomme aber diese Fehlermeldung:
Delphi-Quellcode:
[Fataler Fehler] GDIPAPI.pas(38): Datei nicht gefunden: 'DirectDraw.dcu'
Wo kann ich die Datei hernehmen?

Bummi 11. Mär 2013 21:31

AW: Beim *.bmp skalieren geht Qualität verloren?
 
wenn Du wie angegeben D2010 verwendest sollte diese Datei unter C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\rtl\win (oder bei einem 32-Bit Windows entsprechend liegen), falls Du eine alte Delphiversion verwendest hätte ich Dir prodigy.com empfohlen, habe aber gerade feststellen müssen dass dort die API nicht mehr angeboten wird. In wie weit http://www.codeforge.com/article/141497 zu empfehlen ist kann ich nicht beurteilen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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