Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 05.02.12 14:21 
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
ausblenden 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
ausblenden Delphi-Quelltext
1:
  image1.Picture.Bitmap.transparentcolor := clblack;					

bringt auch nichts, ebenso nicht
ausblenden Delphi-Quelltext
1:
  image1.Picture.Bitmap.monochrome := true;					

Hat jemand eine Idee? Vielen Dank schon im voraus.

Beste Grüße
Mathematiker
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: So 05.02.12 20:24 
Bild anschließend invertieren?

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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