| Herd Software Entwicklung
|=
DaVinci Grafikbibliothek
|==
DaVinci Dokumentation Home Search Order


Leonardo: Rastern von Bitmaps

Wenn Ihre Applikation auf einem Rechner mit standard-VGA-Einstellung ausgeführt wird, dann hilft auch keine Farbpalette mehr der Optik Ihrer Grafiken: Bilder mit einer Auflösung von mehr als 16 Farben werden vom GDI bei der Anzeige auf 16 Farben reduziert.

Aber GDI benutzt als Verfahren lediglich einen "Nearest Color Match", d.h. alle Schattierungen von Blau werden als einheitliche blaue Fläche dargestellt, was im allgemeinen sehr bescheiden aussieht. Zu allem Überfluß benutzten manche Bildschirmtreiber zur Anzeige von 24-Bit-Grafiken wirklich unglaublich schlecht optimierte Verfahren, so daß die Anzeige einer Grafik eine Minutenewigkeit dauern kann.

Darüber hinaus kann GDI 24-Bit-Grafiken auch auf Bildschirmen mit 256 Farben nicht befriedigend anzeigen, standardmäßig werden nur 20 Farben benutzt, was zu schlechten Ergebnissen führt.

Durch Wahl verschiedener Farben für nebeneinander liegende Punkte kann man aber das Auge zum Mischen der Farben veranlassen, so daß die Grafik schließlich wesentlich weniger schlecht aussieht.

Leonardo stellt die Funktionen DitherTo4, DitherTo8 und DitherTo1 zur Verfügung:

Funktion DitherTo4

HGLOBAL FAR PASCAL DitherTo4(LPBITMAPINFOHEADER lpbm);

lpbm LPBITMAPINFOHEADER
Zeiger auf eine Device-Independend Bitmap (Siehe API-Dokumenatation der BITMAPINFOHEADER -Struktur)

BITMAPINFOHEADER, Palette und Bitmap-Bits müssen wie im CF_DIB-Format direkt aufeinanderfolgen.
Zulässig sind DIBs mit 8, 16, 24 oder 32 Bit Farbtiefe.

Rückgabewert

Der Rückgabewert kennzeichnet eine neu erstelle DIB als globales Speicherhandle einer DIB mit 4 Bit Farbtiefe, er ist NULL, wenn die Konvertierung mißlang oder die DIB bereits im 4 -Bit-Format vorlag. Das Handle muß von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

Die Applikation muß die erzeugte DIB freigeben. Die Quell-DIB wird weder verändert noch verworfen. lpbm darf auf eine Bitmap aus einer Ressource zeigen.

Beispiel f. Borland OWL 2.x

{ TDib * 		theDib = new TDib( "MEINE.BMP");	// Lade Datei MEINE.BMP und erzeuge TDib-Objekt
  HGLOBAL 		hg = HANDLE( *theDib );
  LPBITMAPINFOHEADER	pbm = (LPBITMAPINFOHEADER) GlobalLock(hg);
  HGLOBAL		h4bit = DitherTo4(pbm);
  GlobalUnlock(hg); 
  if (h4bit) {
	delete theDib;
	theDib = new TDib( h4bit );
  } 
}
  

Sehen Sie auch die Beispielprogramme.

Funktion DitherTo1

HGLOBAL FAR PASCAL DitherTo1(
LPBITMAPINFOHEADER lpbm,
LPBYTE lpabGamma);

lpbm LPBITMAPINFOHEADER
Zeiger auf eine Device-Independend Bitmap (Siehe API-Dokumenatation der BITMAPINFOHEADER-Struktur)

BITMAPINFOHEADER, Palette und Bitmap-Bits müssen wie im CF_DIB-Format direkt aufeinanderfolgen.

Zulässig sind DIBs mit 4,8, 16,24 oder 32 Bit Farbtiefe.

lpabGamma LPBYTE NULL oder ein Zeiger auf ein von GammaCorrectionGetArray ausgefülltes Array von BYTEs zur Gamma-Korrektur der Helligkeitswerte vor dem Dither-Vorgang.

Rückgabewert

Der Rückgabewert kennzeichnet eine neu erstelle DIB als globales Speicherhandle einer DIB mit 1 Bit Farbtiefe, er ist NULL, wenn die Konvertierung mißlang oder die DIB bereits im 1 -Bit-Format vorlag. Das Handle muß von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

Die Applikation muß die erzeugte DIB freigeben. Die Quell-DIB wird weder verändert noch verworfen. lpbm darf auf eine Bitmap aus einer Ressource zeigen.

Diese Funktion eignet sich besonders gut zur hochqualitativen Aufbereitung von Grafiken zum Druck auf einem Schwarz/Weiß-Drucker. Viele Druckertreiber beherrschen nur das Ditherverfahren "Ordered Dither". Da die DitherTo1-Routine nach dem Fehlerdiffusionsverfahren dithert, erreicht sie meist eine höhere Qualität, unabhängig vom installierten Druckertreiber.

Funktion DitherTo8

Die Funktion DitherTo8 erstellt aus einer DIB mit einer Farbtiefe von 24 Bit (biBitCount =24) eine DIB mit einer Farbtiefe von 8 Bit mit einer geeigneten Farbpalette.

HDIB FAR PASCAL DitherTo8(
LPBITMAPINFOHEADER lpDib,
int std,
int More,
LPBITMAPINFOHEADER lpPal);

lpbm LPBITMAPINFOHEADER
Zeiger auf eine Device-Independend Bitmap (Siehe API-Dokumenatation der BITMAPINFOHEADER-Struktur)

BITMAPINFOHEADER, Palette und Bitmap-Bits müssen wie im CF_DIB-Format direkt aufeinanderfolgen.

Zulässig sind DIBs mit 16,24, 32 oder 48 Bit Farbtiefe.

std int Steuert die Anzahl der nicht optimierten Farben in der Farbpalette der neuen DIB:

0 - Keine
2 - 2*2*2 = 8 nichtoptimierte Farben
3 - 3*3*3 = 27 nichtoptimierte Farben
4 - 4*4*4 = 64 nichtoptimierte Farben
5 - 5*5*5 = 125 nichtoptimierte Farben
6 - 6*6*6 = 216 nichtoptimierte Farben

more int Anzahl der zusätzlichen optimierten Farben in der Farbpalette der neuen DIB.

lpPal LPBITMAPINFOHEADER
Zeiger auf eine DIB mit 8 Bit Farbtiefe (biBitCount =8), die die Farbpalette für die neu zu erstellende DIB enthält.

NULL, wenn die Farbpalette gemäß den Angaben in std und more zusammengestellt werden soll.

Für höchste Qualität beim Rastern können Sie eine von DIBSelectColors optimierte Farbpalette benutzen.

Rückgabewert

Der Rückgabewert kennzeichnet eine neu erstelle DIB als globales Speicherhandle einer DIB mit 8 Bit Farbtiefe, er ist NULL, wenn die Konvertierung mißlang. Das Handle muß von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

Die Applikation muß die erzeugte DIB freigeben. Die Quell-DIB wird weder verändert noch verworfen. lpbm darf auf eine Bitmap aus einer Ressource zeigen.

Verwendung von std, More und lpPal

DitherTo8 bestimmt die Palette der neu zu erstellenden DIB, aus einem optimierten und einem nicht optimierten Anteil. Alternativ kann die zu benutzende Farbpalette auch gemäß einer anderen DIB vorgegeben werden.

Der nicht optimierte Anteil bestimmt eine Anzahl von Farbwerten nach einem Festen Aufbau. Jeder Komponente (Rot, Grün, Blau) werden mehrere Helligkeitsstufen zugeordnet. Z.B. 0%,50%,100% = 3 Stufen. Da dies für alle drei Komponenten durchgeführt wird, erhält man 3*3*3 = 27 Farbwerte. Der std-Parameter gibt die Anzahl der Stufen je Komponente an.

Der optimierte Anteil wird nach einer Histogrammanalyse der Quell-DIB erstellt. DitherTo8 wählt die in der DIB häufigsten Farben zur Anzeige aus. Die Anzahl der auszuwählenden Farben wird durch den Parameter more bestimmt.

Bei der Wahl von std und more müssen Sie folgende Bedingung einhalten:
0 < std*std*std + more <= 236

Beispiele:

std more lpPal

1 Schnellstmögliches Rastern. Es werden nur nicht-optimierte Farben benutzt, die Geschwindigkeit ist damit ca. 3 mal so hoch wie bei einer optimierten Palette. 6 0 NULL
2 Optimierte Farbpalette. DitherTo8 bestimmt die Farbpalette gemäß der am häufigsten benötigten Farben. 0 236 NULL
3 Farbpalette einer anderen DIB übernehmen. Dies erfolgt schneller als das optimieren, dauert aber länger als eine nicht optimierte Palette. 0 0 lpPal
4 Kombination mehrerer DIBs zur gleichzeitigen Anzeige. Die Kombination von nicht-optimierten Farben mit einigen optimierten Farben, so daß die Gesamtanzahl der Farben aller angezeigen DIBs < 235 liegt 5 50 NULL

Umsetzung in Microsoft Windows NT

Unter Microsoft Windows NT kann das Rastern bei der Ausgabe einer DIB auf den Bildschirm mit StretchDIBits bzw. StretchDIBBlt direkt vom GDI durchgeführt werden. Dazu wird mit einem Aufruf von SetStretchBltMode der HALFTONE-Modus aktiviert, um dann mit SetColorAdjustment den Gamma-Wert einzustellen. Im Gegensatz zur Dokumentation wird diese Technik von Windows 95 nicht unterstützt, da ein von Microsoft bestätigter Fehler in Windows 95 und Windows 98 dies verhindert. Es sollte die von CreateHalftonePalette erzeugte Farbpalette benutzt werden. Windows NT beherrscht grundsätzlich nicht die Farbreduktion mit dem Fehlerdiffusionsverfahren sondern wendet einen "Ordered Dither" an, der nicht ganz die Qualität der Leonardo-Funktionen erreicht aber wesentlich schneller ausgeführt werden kann.