Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TImage als Bitmap speichern und Farbtiefe (https://www.delphipraxis.net/162053-timage-als-bitmap-speichern-und-farbtiefe.html)

mashutu 3. Aug 2011 17:12

TImage als Bitmap speichern und Farbtiefe
 
Servus,
mein Programm zeichnet Daten auf eine Canvas. Der aktuelle Zustand kann auch als Datei gespeichert werden, was durch ein simples
Code:
   Picture.Bitmap.SaveToFile(dlgSave.FileName);
   Picture.Graphic.SaveToFile(dlgSave.FileName);
bewerkstelligt wird (nachdem der anwender mit einem Save-dialog behelligt wurde).

Bis vor kurzem hat das auch Problemlos getan.
An diesem Code habe ich auch nichts geaendert.

Aber seit kurzer Zeit werden die Farben falsch dargestellt. Eine Vergleich der alten und neuen BitMaps ergab schon auf den ersten Blick, dass die Dateigroesse halbiert wurde.
Die Metadaten ergeben fuer die alten Bilder:
Original colors: 16,7 Millions (32 BitsPerPixel)

und fuer die neuen Bilder:
65536 (16 BitsPerPixel)

Leider finde ich keine Moeglichkeit die Farbtiefe zu forcieren.

Ich waere auch fuer einen Workaround dankbar, da die Bilder morgen in Druck gehen sollten.
(Bitte keine Hinweise auf kostenpflichtige Komponenten - bin gerade komplett pleite)
Das Ausgabedateiformat waere mir egal, da ich es ja noch umwandeln kann bevor es in Druck geht.

Thanks in Advance

DeddyH 3. Aug 2011 17:18

AW: TImage als Bitmap speichern und Farbtiefe
 
In der allergrößten Not könntest Du temporär eine Bitmap mit der benötigten Farbtiefe erzeugen, die Grafik da reinkopieren und die dann speichern (oder zunächst in ein anderes Format konvertieren). Allerdings kommt mir das Ganze schon etwas komisch vor. Zeichnest Du direkt auf einem TImage?

mashutu 3. Aug 2011 17:40

AW: TImage als Bitmap speichern und Farbtiefe
 
Danke erst mal.
Ja, ich zeichne direkt auf die Canvas des TImage.
Bzw. ich uebergebe den Zeichenroutinen TImage.Canvas und die arbeiten dann damit weiter.
Das ganze hat seit 8 Jahren hervorragend funktioniert und jetzt macht es ploetzlich so was ...
Dein Vorschlag ein Bitmap mit der entsprechenden Farbtiefe zu nehmen muss ich mal probieren.

Meinst du ich sollte eines der alten Bilder laden und da dann direkt drauf zeichnen?

Das geht vermutlich nicht auf die Schnelle - aber ich werde alles versuchen.

[Nachtrag:] Wie anders als durch das Verwenden eines alten Bitmaps koennte ich denn ein solches temporaer mit der gewuenschten Farbtiefe erzeugen?

DeddyH 3. Aug 2011 18:10

AW: TImage als Bitmap speichern und Farbtiefe
 
Sofern die Farbtiefe wirklich erst beim Speichern verloren geht, dachte ich mir das etwa so:
Delphi-Quellcode:
var temp: TBitmap;
begin
  temp := TBitmap.Create;
  try
    temp.PixelFormat := pf24Bit; //oder eben entsprechend
    temp.Assign(Grafik aus TImage);
    //ggf. anderes Grafikobjekt erzeugen und zuweisen (TJPEGImage oder so)
    temp.SaveToFile(...);
    //oder GrafikObjekt.SaveToFile, kommt halt darauf an
  finally
    temp.Free;
  end;

himitsu 3. Aug 2011 18:27

AW: TImage als Bitmap speichern und Farbtiefe
 
Delphi-Quellcode:
Picture.Bitmap.PixelFormat := pf...;
Picture.Bitmap.SaveToFile(...);
Achtung: Geht natürlich nur, wenn ein Picture.Bitmap.SaveToFile geht natürlich nur, wenn auch ein Bitmap in Picture enthalten ist.
Und da das PixelFormat auf das Original angewendet wird, wird bei zu geringer Farbtiefe auch das Originalbild verändert ... in soeinem Fall ist ein temporäres Bitmap natürlich besser.

Alternativ ein temporäres TPicture, diesem ein temporäres TBitmap zuweisen, Pixelformat anpassen, das andere Bild reinkopieren und am Ende TempPicture.SaveToFile,
falls nicht nur als Bitmap gespeichert werden soll.
PS: Picture.SaveToFile nutzt die Dateiendung, um den Typ der zu speichernden Datei zu bestimmen (ebenso wie LoadFromFile nur über die Dateiendung geht und dann natürlich bei einer unpassenden Endung fehl schlägt :wall: )

mashutu 3. Aug 2011 19:11

AW: TImage als Bitmap speichern und Farbtiefe
 
Also ich habe ein vorhandenes Bitmap mit der erforderlichen Farbtiefe geladen und dann da drauf gezeichnet.
Das Ergebnis ist das gewuenschte.

So habe ich es gemacht

Code:
var img:TImage;
begin
{...}
    img:=tImage.Create(self);

    img.Picture.LoadFromFile(exe_path + 'template.bmp');
    with img.Picture.Bitmap.Canvas do
    begin
       Brush.Style := bsSolid;
       Brush.Color := clWhite;
       Rectangle(0, 0, 4230,4230);{war noetig um einen weissen Hintergrund zu erhalten}
     

    end;//with
   
    draw_Map(0,img.Picture.Bitmap.Canvas      ,true); //die eigentliche Zeichenroutine

    img.Picture.Bitmap.SaveToFile(dlgSave.FileName);
    img.Free;
{...}
Vielen Dank erst mal, da es mich fuer heute zum gewuenschten Ergebnis gefuehrt hat.

Eine befriedigende Loesung ist es aber nicht - und die Ursache fuer die Aenderung ist mir auch noch unklar.

Wenn also noch jemand Ideen hat, wir ich das Problem langfristig handeln kann, immer her damit.
Und noch mal Danke an DeddyH

mashutu 3. Aug 2011 19:26

AW: TImage als Bitmap speichern und Farbtiefe
 
_img.Picture.Bitmap.PixelFormat := pf24Bit;

fuehrt bei mir dazu dass gar nichts mehr auf die Canvas gezeichnet wird. strange ...

himitsu 3. Aug 2011 19:29

AW: TImage als Bitmap speichern und Farbtiefe
 
Was macht draw_Map, bzw. wie zeichnet es?



Ein temporäres TImage ohne anzuzeigen ist übertrieben.
TPicture reicht da vollkommen aus.

mashutu 3. Aug 2011 19:43

Geloest TImage als Bitmap speichern und Farbtiefe
 
Himitsu hat mich mit seinen Antworten auf den richtigen Trichter gebracht.

Das Problem ist schlicht und einfach: Ich habe nur noch einen uralten Laptop mit Windows, den ich nur ganz selten (bspw. um dieses alte Programm zu warten) verwende - ansonsten arbeite ich mit Linux.

Da das Keyboard am alten Windows-Laptop defekt ist benutze ich ihn ueber remote desktop von meiner Linux-Maschine aus.

Tastatur an den alten Laptop und dort lokal versucht. Bingo. Ich habe genau den Output, den ich haben will.
(Uebrigens funktioniert auch die Exe unter Wine auf dem Linux-Rechner korrekt.)

Es lag wohl schlicht daran, dass die Darstellung ueber rdesktop eine geringere Farbtiefe verwendet.
Und das Speiuchern 'as is' dann auch diese geringere Farbtiefe benutzt. [Obwohl am Bildschirm die Farben korrekt angezeigt werden...]

Vielen Dank, die Ihr Euch den Kopf zerbrochen habt.

[Edit: wie kann ich den gesamten Thread als geloest markieren - sorry bin nicht mehr so oft hier...]

himitsu 3. Aug 2011 23:25

AW: TImage als Bitmap speichern und Farbtiefe
 
gelöst ... garnicht

das Nächste Mal könntest du die Frage / den Thread als "offene Frage" erstellen (häckchen beim Erstellen setzen) und dieses Flag nach der Lösung wieder entfernen.

Aber sonst einfach Schreiben daß es für dich gelöst ist ... das reicht schon aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.
Seite 1 von 2  1 2      

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