AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TImage als Bitmap speichern und Farbtiefe
Thema durchsuchen
Ansicht
Themen-Optionen

TImage als Bitmap speichern und Farbtiefe

Ein Thema von mashutu · begonnen am 3. Aug 2011 · letzter Beitrag vom 3. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#1

TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 17:12
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
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 17:18
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?
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
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#3

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 17:40
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?
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 18:10
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;
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 himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#5

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 18:27
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 )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#6

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 19:11
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
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#7

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 19:26
_img.Picture.Bitmap.PixelFormat := pf24Bit;

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

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#8

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 19:29
Was macht draw_Map, bzw. wie zeichnet es?



Ein temporäres TImage ohne anzuzeigen ist übertrieben.
TPicture reicht da vollkommen aus.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#9

Geloest TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 19:43
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...]
utu

if it was hard to write it should be hard to read

Geändert von mashutu ( 3. Aug 2011 um 19:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#10

AW: TImage als Bitmap speichern und Farbtiefe

  Alt 3. Aug 2011, 23:25
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:15 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