![]() |
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; |
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 ![]() |
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:
Gruß
// 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); |
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. |
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.
|
AW: Beim *.bmp skalieren geht Qualität verloren?
Wie sieht es
![]() |
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)... |
AW: Beim *.bmp skalieren geht Qualität verloren?
Zitat:
Delphi-Quellcode:
Wo kann ich die Datei hernehmen?
[Fataler Fehler] GDIPAPI.pas(38): Datei nicht gefunden: 'DirectDraw.dcu'
|
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
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 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