Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi GraphicEx Tiff m.256 Farben laden falsche Farbe (https://www.delphipraxis.net/129051-graphicex-tiff-m-256-farben-laden-falsche-farbe.html)

HPW 11. Feb 2009 18:49


GraphicEx Tiff m.256 Farben laden falsche Farbe
 
Hallo,

Ich versuche mit dem aktuellen Stand von GraphicEx eine 256 Farb-Tiff Datei zu laden.

Testdatei: http://www.hpwsoft.de/Wolf1.zip

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  I      : integer;
  Picture : TPicture;
begin
  if OpenPictureDialog1.Execute then
    with OpenPictureDialog1.Files do
      for I := 0 to Count - 1 do
      begin
         Picture := TPicture.Create;
         try
           Picture.LoadFromFile(Strings[I]);
           if not (Picture.Graphic is TBitmap) then
             BEGIN
              Picture.Graphic.Transparent := True;
              stampimage.Width := Picture.Width;
              stampimage.Height := Picture.Height;
              stampimageW := stampimage.Width;
              stampimageH := stampimage.Height;
              stampimage.Canvas.Draw(0, 0, Picture.Graphic);
             END
           Else
             BEGIN
              Picture.Bitmap.Transparent    := True;
              showmessage(IntToStr(Picture.Bitmap.canvas.pixels[0,0]));
              Picture.Bitmap.TransparentColor := Picture.Bitmap.canvas.pixels[0,0];
//              showmessage(IntToStr(clAqua));
//              Picture.Bitmap.TransparentColor := clAqua;
              Picture.Bitmap.TransparentMode := tmFixed;
//              Picture.Bitmap.TransparentMode := tmAuto;
              stampimage.Width := Picture.Width;
              stampimage.Height := Picture.Height;
              stampimageW := stampimage.Width;
              stampimageH := stampimage.Height;
              stampimage.Assign(Picture.Bitmap);
             END;
         except
           // no exceptions please, just ignore invalid images
           Application.ProcessMessages;
         end;
      end;
end;
Das Problem ist das die Hintergrundfarbe nicht korrekt aus der Palette gelesen wird.
Statt clAqua=16776960 hat der Hintergrund 16711168 also statt RGB 0,255,255 ist es 0,254,254.
Mit BMP,PNG in 256 Farben usw. ist das kein Problem.

Edit: Weitere Tests zeigen das die RGB-Werte immer um 1 kleiner sind. Nur 0 bleibt 0.

HPW 15. Feb 2009 08:46

Re: GraphicEx Tiff m.256 Farben laden falsche Farbe
 
Was kann man tun, wenn man ein Problem mit einer solchen OpenSource-Lib hat?

1. Selber in den Sourcen suchen.
Die GraphicEx ist nicht gerade einfach zu durchblicken.
Bislang habe ich es nicht verstanden wo die Tiff-Palette gelesen und ausgewertet wird.
(Und der RGB-Werte falsch umgerechnet wird)

2. Forum-Post hier und in:

http://support.soft-gems.net/forums/...pic.php?t=2213

Thema vielleicht zu speziell?

3. Mail an den Author:

http://www.soft-gems.net/index.php?o...ntact&Itemid=3

Bislang ohne Antwort.

4. Versuch ein Ticket im Bug-Tracker einzugeben:

http://www.soft-gems.net/support/mantis/login_page.php

Versuch einen neuen Account zu erstellen schlägt mit Fehlermeldung fehl.


Ich möchte aber deutlich machen das die GraphicEx ein sehr gute Biblithek ist und es sehr freundlich ist diese der Delphi-Community als Open-Source zur Verfügung zu stellen.

Was bleibt einem mit einem Problem dann:

Selber weiter den Fehler suchen?
Andere Kontakt-Möglichkeiten nutzen?
Wechseln auf eine andere Import-Biliothek (Kommerziell)?
Andere Ideen?


Grüsse,

Hans-Peter

Blup 18. Feb 2009 09:37

Re: GraphicEx Tiff m.256 Farben laden falsche Farbe
 
Ohne das genauer zu Prüfen ist mir in der Unit GraphicColor die Verwendung der Funktion "MulDiv16" aufgefallen.
Scheinbar wird diese an vielen Stellen verwendet um einen 16Bit-Wert gerundet als 8Bit-Wert abzubilden.
z.B. MulDiv16(Value, 255, 65535).
Die TIFF-Palette nutzt 16-Bit für jeweils Rot, Grün und Blau.
Vermulich wurden beim Speichern der Datei die jeweiligen Werte von RGB jeweils mit 256 multipliziert.
clAqua = 16776960 = $FF $FF $00 wurde als $FF00 $FF00 $0000 gespeichert.

($FF00 * 255) div 65535 = $FE

Eventuell genügt es die Funktion TColorManager.ComponentScaleConvert anzupassen:

Result := Value shr 8;

HPW 18. Feb 2009 15:32

Re: GraphicEx Tiff m.256 Farben laden falsche Farbe
 
Herzlichen Dank für den Tip!
:thumb:
Das funktioniert mit den Testdaten und gibt jetzt den richtigen Wert zurück.

Meine einzigen Bedenken sind jetzt noch ob die Änderung irgenwelchen Seiten-Effekte auf die anderen unterstützten Datenformate hat, da die Funktion ComponentScaleConvert ja an einigen Stellen verwendet wird.

Muss mal weiter testen.

:)


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