Entwickler-Ecke

Multimedia / Grafik - Monochrom-Bitmap


Mathematiker - So 05.02.12 14:21
Titel: Monochrom-Bitmap
Hallo Delphi-Gemeinde,
mein aktuelles Problem besteht darin, dass ich aus einem Image heraus ein monochromes Bitmap speichern möchte.
Zu Beginn wird in das Image ein GIF-Bild geladen. Dieses kann, muss aber nicht, schwarz/weiß sein.
Im gespeicherten, zweifarbigen Bitmap soll aber stets Schwarz und nicht Weiß als Hintergrundfarbe gesetzt werden. Mit

Delphi-Quelltext
1:
2:
image1.Picture.Bitmap.PixelFormat := pf1bit;
image1.Picture.savetofile(dateiname);

erreiche ich zwar, dass das Bitmap zweifarbig wird, allerdings ist Weiß die Hintergrundfarbe.
Meine Idee mit

Delphi-Quelltext
1:
  image1.Picture.Bitmap.transparentcolor := clblack;                    

bringt auch nichts, ebenso nicht

Delphi-Quelltext
1:
  image1.Picture.Bitmap.monochrome := true;                    

Hat jemand eine Idee? Vielen Dank schon im voraus.

Beste Grüße
Mathematiker


platzwart - So 05.02.12 20:24

Bild anschließend invertieren?


Mathematiker - So 05.02.12 21:03

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Bild anschließend invertieren?

Danke für die Idee, nur leider bringt es mir nichts.
Die Bitmaps enthalten schwarze Strecken und Kurven, die weiße Bereiche umschließen. Diese sollen anschließend nach dem Vierfarbensatz gefärbt werden.
Aus optischen Gründen sehen weiße Bereiche mit schwarzen Linien irgendwie besser aus, als schwarze mit weißen Rändern.

Grüße
Mathematiker


Martok - So 05.02.12 22:45

In einem 1-Bit-Bitmap gibt es nur die TColor-Werte $FFFFFF und $000000 (wenn man das mit .Pixels[] abfragt, das macht ja immer RGB draus). Alles was nicht exakt $FFFFFF (weiß) ist wird auf Schwarz gemappt.

Wenn also bei dir der "Hintergrund" schwarz ist, hast du ihn "nicht weiß" gezeichnet :nixweiss:
Beim Konvertieren bietet es sich also an, vorher per ScanLine alle Pixel durchzugehen und direkt auf Schwarz/Weiß umzufärben und erst dann zu konvertieren. So gibt's klare Verhältnisse und GDI muss nicht raten.


Oder versteh ich grad das Problem falsch? :gruebel:


Mathematiker - So 05.02.12 23:35

Im Prinzip ist dies mir mit den mehrfarbigen GIFs schon klar. Diese sind auch nicht das Hauptproblem. Die 1-Bit-GIFs sind es.
Im Moment sieht es auch so aus, als ob das Problem von der Art des geladenen GIFs abhängt.
Ist es ein monochromes GIF87, so erfolgt die Umwandlung korrekt, d.h. das gepeicherte Bitmap wird mit schwarzer Hintergrundfarbe gespeichert.
Ist das monochrome GIF aber GIF89, so steht nach dem Laden und anschließenden Speichern im gespeicherten Bitmap Weiß als Hintergrundfarbe.
D.h., es muss mir irgendwie gelingen, das Bitmap unabhängig vom GIF-Format, wie gewünscht, zu speichern.

Beste Grüße
Mathematiker


Delete - Mo 06.02.12 21:44

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Bild anschließend invertieren?

Danke für die Idee, nur leider bringt es mir nichts.
Die Bitmaps enthalten schwarze Strecken und Kurven, die weiße Bereiche umschließen. Diese sollen anschließend nach dem Vierfarbensatz gefärbt werden.
Aus optischen Gründen sehen weiße Bereiche mit schwarzen Linien irgendwie besser aus, als schwarze mit weißen Rändern.


Verstehe ich nicht: Wenn du B&W-Bild invertierst, werden alle schwarzen Punkte weiß und alle weißen schwarz. Somit hast du doch genau das, was du wolltest, oder etwa nicht? Tip: Scanline.


Mathematiker - Di 07.02.12 08:59

Vielen Dank für die Tipps.
Ich habe mein Problem gelöst. "Invertieren" ist gut, allerdings nicht das Bitmap an sich, sondern nur die Bitmapdaten, ohne den Bitmap-Header und die Farbpalette zu verändern.
D.h., ich lese die Bitmapdaten in ein Feld und invertiere diese, wenn in der Farbpalette Weiß als 1.Farbe gesetzt ist und nicht Schwarz.
Für mich war neu, dass es von einem 1-Bit-Bitmap zwei verschiedene Typen gibt. Steht in der Palette Weiß aus Platz 1, so werden weiße Bildpunkte mit Bit = 0 kodiert, ist Schwarz die 1.Farbe, wird ein weißer Bildpunkt mit Bit = 1 gespeichert.

Beste Grüße
Mathematiker