![]() |
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:
bewerkstelligt wird (nachdem der anwender mit einem Save-dialog behelligt wurde).
Picture.Bitmap.SaveToFile(dlgSave.FileName);
Picture.Graphic.SaveToFile(dlgSave.FileName); 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 |
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?
|
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? |
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; |
AW: TImage als Bitmap speichern und Farbtiefe
Delphi-Quellcode:
Achtung: Geht natürlich nur, wenn ein Picture.Bitmap.SaveToFile geht natürlich nur, wenn auch ein Bitmap in Picture enthalten ist.
Picture.Bitmap.PixelFormat := pf...;
Picture.Bitmap.SaveToFile(...); 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: ) |
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:
Vielen Dank erst mal, da es mich fuer heute zum gewuenschten Ergebnis gefuehrt hat.
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; {...} 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 |
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 ... |
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. |
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...] |
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 00:53 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