Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Qualität tImage (https://www.delphipraxis.net/183219-qualitaet-timage.html)

striderx 20. Dez 2014 20:31

Delphi-Version: XE6

Qualität tImage
 
Hallo zusammen,

ich habe gerade eine Anwendung fertig gestellt, welche in einem tImage feinliniege Bilder darstellt. Die Bilder werden mit Stretch und Proportional angepaßt. Leider ist die Qualität der Darstellung teilweise so schlecht, dass man kaum noch etwas erkennen kann. Wenn ich so ein Bild im Windows Bildbetrachter in der selben Grösse daneben halte, ist die Qualität deutlich besser. Das Thema ist wie ich weiß nicht neu, so eine richtige Lösung habe ich bislang aber nicht gefunden. So endet diese DP-Thema

http://www.delphipraxis.net/170323-k...erbessern.html

aus dem Jahr 2012 mit den schönen Worten: "Jetzt muß nur noch jemand die beiden DrawingCanvas.StretchDraw(DestRect, Picture.Graphic); ersetzen und Testen ob es wirklich funktioniert."

All dies vorausgeschickt: Hat jemand aktuelle Erkenntnisse zu diesem Thema (vozugsweise ohne Nutzung einer externen Komponente)?


Alles Gute
striderx

Perlsau 20. Dez 2014 21:49

AW: Qualität tImage
 
Zitat:

Zitat von striderx (Beitrag 1284228)
Die Bilder werden mit Stretch und Proportional angepaßt. Leider ist die Qualität der Darstellung teilweise so schlecht, dass man kaum noch etwas erkennen kann.

Das ist wenig überraschend. Probier es doch einfach mal in deiner Lieblings-Bildbearbeitungs-Anwendung aus: Vergrößere und verkleinere Bitmaps ohne AntiAliasing. Dann hast du genau denselben Effekt. Damit hast du auch schon die Lösung: Du mußt die Bild-Verzerrungen mit Antialias glätten.

striderx 20. Dez 2014 22:27

AW: Qualität tImage
 
Ich habe mein Problem bislang nicht mit dem Thema Kantenglättung in Verbindung gebracht. Ich werde mir das auf jeden Fall einmal anschauen.

Jens01 20. Dez 2014 23:08

AW: Qualität tImage
 
Das Problem hatte ich mal mit einer TMSKomponente TAdvPicture (oder ähnlicher Name).
Dort mußte ich über einen Eingriff in Paint, die Verzerrung selbst übernehmen. Es ging dabei um Strichzeichnungen.
War aber nur mit einer Fremdkomponente -Graphics32- möglich.

Perlsau 21. Dez 2014 00:17

AW: Qualität tImage
 
Zitat:

Zitat von striderx (Beitrag 1284238)
Ich habe mein Problem bislang nicht mit dem Thema Kantenglättung in Verbindung gebracht. Ich werde mir das auf jeden Fall einmal anschauen.

AntiAlias hilft nicht bei allen Problemen. Hast du z.B. in deiner Ursprungsgrafik Linien mit geringer Breite, könnten die z.B. beim verkleinern verlorengehen, was logisch ist, denn halbe Pixel kann der Bildschirm nicht darstellen. In solchen Fällen achte ich darauf, daß Linien, die auch bei starker Verkleinerung noch zu sehen sein sollen, eine entsprechende Ursprungs-Stärke aufweisen. Zu beachten ist auch, daß der Qualitätsverlust bei Verkleinerung meist geringer ist als bei Vergrößerung, wo das Bild dann oft verpixelt wirkt, wenn man kein AntiAlias dazwischenschaltet. Daher ist darauf zu achten, das Ursprungsbild möglichst groß zu wählen, am besten annähernd so groß wie die größte in deiner Anwendung erlaubte Größe der TImage-Komponente.

Lade doch mal einen Screenshot von der Ursprungsgrafik und der beanstandeten Verzerrung hier hoch, dann kann man sich das besser vorstellen.

striderx 21. Dez 2014 12:48

AW: Qualität tImage
 
>>Lade doch mal einen Screenshot von der Ursprungsgrafik und der beanstandeten Verzerrung hier hoch, dann kann man sich das besser vorstellen. <<

Mach ich, sobald ich ein Muster vom Kunden besorgt habe.

Dejan Vu 21. Dez 2014 13:27

AW: Qualität tImage
 
Für das Vergrößern bzw. Verkleinern von Bildern gibt es diverse Verfahren, die den Qualitätsverlust mehr oder minder gut kompensieren.

Hier ein Thread

http://www.delphipraxis.net/157776-b...gorithmus.html

Thomasl 21. Dez 2014 23:03

AW: Qualität tImage
 
Bei GDI+ kann das Antialiasing eingestellt werden

Der schöne Günther 22. Dez 2014 10:05

AW: Qualität tImage
 
Ohne die verlinkten Threads gelesen zu haben:
Das TImage scheint bei
Delphi-Quellcode:
Stretch=True
einfach eine "Nächster Nachbar"-Berechnung zu machen- Das sieht natürlich absolut unzumutbar aus.

Ich gehe immer entweder hin und rechne es mit Vcl.GraphUtil.ScaleImage(..) schön oder nehme die TImage32-Komponenten aus dem Graphics32-Package. Da kann man wirklich alle möglichen tollen Filter einstellen, wie Bilder skaliert werden sollen.


Warum man so etwas in der VCL immer noch von Hand machen (bzw. Fremdkomponenten installlieren) muss habe ich nie verstanden aber ich habe sonst heute ja noch nicht gemeckert.

striderx 22. Dez 2014 10:55

AW: Qualität tImage
 
Kannst Du bitte ein Beispiel für die Verwendung von ScaleImage hochladen?

Perlsau 22. Dez 2014 11:26

AW: Qualität tImage
 
Die Syntax der Procedure steht doch in der Online-Hilfe, auf die Günther verlinkt hat. Der folgende Befehl vergrößert das OriginalBitMap um den Faktor 2 und liefert das Ergebnis in ResultBitMap zurück:

Delphi-Quellcode:
ScaleImage(OriginalBitMap, ResultBitMap,2);

Der schöne Günther 22. Dez 2014 11:49

AW: Qualität tImage
 
Oder auch hier nochmal:

Delphi-Quellcode:
unit Unit6;

interface uses Vcl.ExtCtrls, Vcl.Graphics;

type
   TImageHelper = class helper for Vcl.ExtCtrls.TImage
      public procedure makePretty(const withOriginalImage: TGraphic);
   end;

implementation uses Vcl.GraphUtil;

{ TImageHelper }

procedure TImageHelper.makePretty(const withOriginalImage: TGraphic);
var
   srcBitmap: TBitmap; // Enthölt das Originalbild
   dstBitmap: TBitmap; // Speziell für die aktuellen Abmessungen
begin
   srcBitmap := TBitmap.Create();
   try
      srcBitmap.Width := withOriginalImage.Width;
      srcBitmap.Height := withOriginalImage.Height;
      srcBitmap.Canvas.Draw(0, 0, withOriginalImage);

      dstBitmap := TBitmap.Create();
      try
         dstBitmap.Width := self.Width;
         dstBitmap.Height := self.Height;

         // Skalierte Version in neues Bitmap zeichnen
         if self.Height < self.Width then
            Vcl.GraphUtil.ScaleImage(
               srcBitmap,
               dstBitmap,
               self.Height / srcBitmap.Height
            )
         else
            Vcl.GraphUtil.ScaleImage(
               srcBitmap,
               dstBitmap,
               self.Width / srcBitmap.Width
            )
         ;

         // imageComponent mit neuem Bild bestücken
         self.Picture.Bitmap := dstBitmap;
      finally
         dstBitmap.Free();
      end;
   finally
      srcBitmap.Free();
   end;
end;

end.
Du musst dir natürlich noch eine Kopie des Originalbildes vorhalten um es dann in
Delphi-Quellcode:
makePretty(..)
reinstecken zu können. Dann kannst du, wenn du es brauchst, einfach sagen
Delphi-Quellcode:
image1.makePretty(originalImage)
.

striderx 22. Dez 2014 17:20

AW: Qualität tImage
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt habe ich endlich ein Beispielbild bekommen.

Das Original ist das JPG-Bild, die Dartstellung im tImage das andere. Der Unterschied ist schon recht krass.

striderx 22. Dez 2014 17:26

AW: Qualität tImage
 
Hallo Günther, vielen Dank für das Code-Beispiel. Ich werde es sobald wie möglich ausprobieren.

/edit:

So, ich habe es mittlerweile ausprobiert, und die Qualitätsverbesserung ist wirklich dramatisch (und das ohne Fremdkomponente).

>>Warum man so etwas in der VCL immer noch von Hand machen (bzw. Fremdkomponenten installlieren) muss ... <<

Dem kann man nur zustimmen.


Vielen Dank für die Hilfe!


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