Autor Beitrag
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 19.10.07 06:51 
Ich möchte eine 2-farbige Bitmap zeichnen. Die verwendeten Farben will ich vorgeben, es soll dabei um "normale" Farben von TColor gehen.
Bei zweifarbigen Bitmaps (pixelformat=pf1bit) kann man ja mit Hilfe von Scanline die Bytes direkt ansprechen und so pro Byte gleichzeitig 8 Punkte zeichnen.
Nun will ich also die Bitmap so zeichnen, aber die zwei Farben müssen beliebig sein, z.B. rot für gesetzte Punkte und gelb für gelöschte.
Ich raffe einfach nicht die Farbpaletten-Eigenschaft des TBitmap-Objektes.
Hat jemand einen Tipp, wie man bei einer 1-bit-Bitmap die beiden Farben der farbpalette direkt festlegen kann, so dass das Bitmuster der Bitmap entsprechend eingefärbt wird?

Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  p:^byte;
  y:integer;
  bmp:TBitmap;

const 
  pattern:array[0..7] of byte=(128,64,32,16,8,4,2,1);
  
...
bmp:=TBitmap.Create;
bmp.Pixelformat:=pf1bit;
bmp.height:=8;
bmp.width:=8;
... //Hier Festlegen der beiden Farben (wie????)
for y:=0 to bmp.height-1 do begin
  p:=bmp.ScanLine[i];
  p^:=pattern[y]; //Zeichnen von je 8 Punkten
end;
....
bmp.free;

_________________
Es gibt keine Probleme - nur Lösungen!
TProgger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148

XP
D6, D2007 prof
BeitragVerfasst: Fr 19.10.07 07:06 
bmp.Pixelformat:=pf1bit; <-- ist das nicht nur S/W?
Da gingen doch gar keine Farben.
Logikmensch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 19.10.07 07:20 
Das ist ja gerade die Frage.
Schwarzweiß ist doch über pfmonochrome (bin mir jetzt nicht sicher, aber ich glaube, das gibt es) o.ä. zu erreichen und muss demzufolge was anderes sein als pf1bit.

Es geht mir vor allem um Geschwindigkeitsoptimierung, da ich in meinem speziellen Fall wirklich nur zwei Farben benötige.

_________________
Es gibt keine Probleme - nur Lösungen!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 19.10.07 08:44 
Also ob es wirklich performater ist wenn man anstelle von 24/32 Bit eher zu 1 Bit greift sollte man eher mal umfangreich testen. Denn bei 1 Bit sind es zwar weniger Daten aber diese sind Speziell verpackt und müssen erst noch umständlich entpackt werden. Was bei 24/32 Bit entfallen würde. Aber ich vermute mal, dass es sich in der Wage hält.

Zum erstellen einer Farbpalette schaust du am Besten mal in diesem Beitrag. Und dann solltest du als Format 4 oder 8 Bit verwenden. 1 Bit ist eigentlich nur Schwarz und weiß.

Wieso das eigentlich. Nun ja. Monocrome Bitmaps haben eine Eigenart. Ich kann mir nicht erklären wieso genau das so ist und in den MSDNs habe ich so auch nichts darüber gefunden. Es gibt aber eine Möglichkeit die Farben zu definieren. Und zwar wenn du bei einem Bitmap das PixelFormat pfDevice einstellst wo zuvor das Pixelformat pf1Bit eingestellt war, dann berücksichtigt er beim Zeichnen die aktuelle Text (SetTextColor) und Hintergrundfarbe (SetBkColor). Wichtig aber du musst das Bild mit BitBlt zeichnen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  BMP: TBitmap;
begin
  BMP := TBitmap.Create;
  try
    BMP.PixelFormat := pf1bit;
    BMP.Width := 100;
    BMP.Height := 100;

    BMP.Canvas.Brush.Color := clBlack;
    BMP.Canvas.FillRect(Rect(10, 10, 65, 60));
    BMP.Canvas.FillRect(Rect(50, 50, 95, 95));

    BMP.PixelFormat := pfDevice;

    SetBkColor(Canvas.Handle, clMaroon);
    SetTextColor(Canvas.Handle, clGreen);
    BitBlt(Canvas.Handle, 10, 10, BMP.Width, BMP.Height, BMP.Canvas.Handle, 0, 0, SRCCOPY);
  finally
    BMP.Free;
  end;


Wie gesagt. Ich weiß nicht genau wie das zustande kommen kann und evtl wäre es sicherer, wenn du lieber auf 4 o. 8 Bit setzt und das Bild mit einer Palette versiehst.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Logikmensch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 19.10.07 10:21 
Ui, danke für diesen konstruktiven Tipp. Das probiere ich aus.

Du hast natürlich recht. Kleinere Bitmaps mit 1 bit zu zeichnen und dann wieder auf 24/32 bit-Bitmaps zu kopieren würde auch Zeit kosten, aber ich will umfangreiche Zeichenoperationen auf einer großen 1-Bit-Bitmap durchführen und danach alles in eine pfDevice-Bitmap umkopieren.

Aber wie gesagt: Ich probiere es aus, was Du schreibst, das ist ein völlig neuer Aspekt.

_________________
Es gibt keine Probleme - nur Lösungen!