AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Beim *.bmp skalieren geht Qualität verloren?
Thema durchsuchen
Ansicht
Themen-Optionen

Beim *.bmp skalieren geht Qualität verloren?

Ein Thema von OrNEC · begonnen am 2. Mär 2013 · letzter Beitrag vom 11. Mär 2013
Antwort Antwort
OrNEC

Registriert seit: 6. Nov 2009
493 Beiträge
 
FreePascal / Lazarus
 
#1

Beim *.bmp skalieren geht Qualität verloren?

  Alt 2. Mär 2013, 22:57
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;
Angehängte Grafiken
Dateityp: jpg Autumn Leaves(klein).jpg (13,3 KB, 15x aufgerufen)

Geändert von OrNEC ( 3. Mär 2013 um 08:05 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 2. Mär 2013, 23:19
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.
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#3

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

  Alt 2. Mär 2013, 23:48
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 3. Mär 2013, 00:20
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
OrNEC

Registriert seit: 6. Nov 2009
493 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 3. Mär 2013, 08:06
Hab mich falsch ausgedruckt, möchte das Bild natürlich skalieren. Mein Beispielcode macht das auch, nur mit massiven Qualitätsverlusten.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 3. Mär 2013, 08:44
Wie sieht es hiermit aus?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

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

  Alt 3. Mär 2013, 08:50
Recht gute Ergebnisse bekommst Du mit GDI+ und graphics.SetInterpolationMode(InterpolationModeHig hQualityBicubic);

Im Anhang ist ein Beispielprogramm (Source)...
Angehängte Dateien
Dateityp: zip Demo.zip (173,7 KB, 12x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
OrNEC

Registriert seit: 6. Nov 2009
493 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 11. Mär 2013, 20:52
Recht gute Ergebnisse bekommst Du mit GDI+ und graphics.SetInterpolationMode(InterpolationModeHig hQualityBicubic);

Im Anhang ist ein Beispielprogramm (Source)...
Danke dir, bekomme aber diese Fehlermeldung:
[Fataler Fehler] GDIPAPI.pas(38): Datei nicht gefunden: 'DirectDraw.dcu' Wo kann ich die Datei hernehmen?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

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

  Alt 11. Mär 2013, 21:31
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 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