TImage als Graustufen-BMP speichern



  • Hallo zusammen,

    Ich habe in einer Image-Komonente ein Graustufenbild generiert und möchte dieses als Graustufen-BMP abspeichern.
    Ziel ist es, Speicher zu sparen, da das Bild eine Größe von 7000x7000 Pixeln (und größer) besitzt.

    Die "normale" Methode speichert nach meinem Eindruck ein Farbild.

    Hier mal die zwei entscheidenden Zeilen (wie ich denke) der Bildgenerierung und des Speicherns:

    Form1->Imgage->Canvas->Pixels[S][Z]= RGB(gw,gw,gw);
    ...
    Form1->Imgage->Picture->SaveToFile("Test.bmp");
    

    Vielen Dank für die Hilfe,
    Der Horst



  • Ein Graustufenbild ist ein Farbbild.
    Zum Platzsparen setz das PixelFormat auf pf8bit, damit reduzierst du die Palette auf 256 Farben, was für Greyscale i.d.R. ausreicht.



  • 8-Bit ist genau das was ich suche, nur eben nicht für alle drei Farbkanäle, sondern nur für einen.

    mit:

    bild->Picture->Bitmap->PixelFormat=pf8bit;
    

    reduziere ich nur die Bitanzahl für alle drei Farbkanäle von 24bit auf 8bit.

    Oder ist es das gleiche? 😕

    Der Horst



  • Da bei einem Graubild alle drei Farbkanäle (RGB) den gleichen Wert aufweisen, ist das somit das gleiche! Du sparst dadurch also rund 2/3 des Farbbildes (wobei noch die Palette wieder hinzukommt: + 3*256 Bytes).



  • vielen Dank für eure Hilfe!
    Ich nehm dann die oben beschriebene Zeile.

    Spart allemal ne Menge Speicher!

    Bis zur nächsten Frage 😉

    Der Horst



  • Es ist nicht genau das Gleiche, da alle 3 Farbkanäle auf 8 Bit verteilt werden. Das Bild bleibt zwar in Grautönen, wenn es vorher schon nur so war, jedoch hat man ja nicht mehr 256 verschiedene Grautöne zur Auswahl, da pro Farbe ja viel weniger Bits zur Verfügung stehen, wodurch sich weiche Übergänge nicht mehr machen lassen.
    Wenn das nicht stört, ist das natürlich gut 😉



  • Powerpaule schrieb:

    jedoch hat man ja nicht mehr 256 verschiedene Grautöne zur Auswahl

    Bei einem 8-Bit-Bitmap stehen genau 256 Farben (z.B. Grautöne) zur Verfügung. Damit kann man schon einen annehmbaren (Ein)Farbverlauf darstellen.

    Th69 schrieb:

    (wobei noch die Palette wieder hinzukommt: + 3*256 Bytes).

    M.E. enthalten 8-Bit-BMPs nur eine Palette.
    /Edit: hatte dich wohl missverstanden. Die eine Palette besteht natürlich aus n*4 Bytes (RGB + Füll-Byte). n ist die Anzahl der Farben, bei 8-bit ist die Palette also 256*4=1024 Bytes gross.
    http://atlc.sourceforge.net/bmp.html#_toc381201084



  • Jansen schrieb:

    Powerpaule schrieb:

    jedoch hat man ja nicht mehr 256 verschiedene Grautöne zur Auswahl

    Bei einem 8-Bit-Bitmap stehen genau 256 Farben (z.B. Grautöne) zur Verfügung. Damit kann man schon einen annehmbaren (Ein)Farbverlauf darstellen.

    Ja, das wollte ich auch nicht in Frage stellen.^^
    Aber in dem speziellen Fall hier klappt das nicht so ganz. Wenn man das Pixelformat auf 8 Bit umstellt, quetscht er die Bilddaten auch auf die 8 Pixel zusammen. Macht er jedenfalls in meiner Builder-Version so, denn wenn ich gleich danach wieder auf 24 Bit umstelle und dann speichere, sieht das Bild immer noch so farbreduziert aus wie als wenn ich es bei 8 Bit gelassen hätte.
    Deswegen wird man mit dieser Methode auch bei einem Graustufenbild kein tolles Ergebnis bekommen, da dann 8 Bit für 3 Farben herhalten müssen, also hat man pro Farbe eine geringere Auflösung, was sich natürlich aufs Gesamtbild genauso auswirkt.

    Edit: Im Grunde wäre es natürlich logisch, dass die VCL bei einem schon grauen Bild, was ja dann nur 256 Farben hat, auch eine entsprechende Farbtabelle bei 8 Bit erstellt. Scheint aber nicht der Fall zu sein, jedenfalls bei mir nicht..



  • Hallo
    8 bit Farbtiefe?
    Da haben wir von geträumt, als wir noch Amigas hatten.
    lol
    Sorry für off topic...



  • Sorry Jansen, wußte nicht mehr, daß auch noch das Pseudo-Alpha-Byte (Füllbyte) abgespeichert wird (die 3 bezog ich auf die drei Bytes für RGB).



  • Powerpaule schrieb:

    Aber in dem speziellen Fall hier klappt das nicht so ganz. Wenn man das Pixelformat auf 8 Bit umstellt, quetscht er die Bilddaten auch auf die 8 Pixel zusammen. Macht er jedenfalls in meiner Builder-Version so, denn wenn ich gleich danach wieder auf 24 Bit umstelle und dann speichere, sieht das Bild immer noch so farbreduziert aus wie als wenn ich es bei 8 Bit gelassen hätte.
    Deswegen wird man mit dieser Methode auch bei einem Graustufenbild kein tolles Ergebnis bekommen, da dann 8 Bit für 3 Farben herhalten müssen, also hat man pro Farbe eine geringere Auflösung, was sich natürlich aufs Gesamtbild genauso auswirkt.

    Das Stimmt und genau dieses "Problem" mit dem Aufteilen der 3 Farbkanäle auf 8 bit- anstelle des einen (Grau-) Kanals will ich verhintern.
    Durch die Quetschung entstehen schon "recht ordentliche" Sprünge, die spätestens bei Filteroperationen auffällig werden.

    Ich hatte mal versucht, nur einen Kanal eines 24-bit "Graustufenbildes" in ein 8bit TImage zu zwängen - war aber auch nicht besser.

    Habe somit nur eine (für mich unpraktische) Lösung gefunden:
    Zur weiteren Verarbeitung einfach den einen Kanal des 24-Bit Bildes als Array in eine txt-datei zu speichern. Nicht schön, aber kein Datenverlust und weniger Speicherplatz, aber zäh in der Verarbeitung.

    Bleibe also doch erst mal bei 24-Bit-Image.


Anmelden zum Antworten