Directory Contents Search << >>


DaVinci 4: 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 dass 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 dass die Grafik schließlich wesentlich weniger schlecht aussieht.

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

Funktion DitherTo4

HGLOBAL WINAPI 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 muss von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

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

Sehen Sie auch die Beispielprogramme.

Funktion DitherTo1

HGLOBAL WINAPI 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 muss von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

Die Applikation muss 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 Schwarzweiß-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 WINAPI 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 muss von der Applikation mit der Funktion GlobalFree wieder freigegeben werden.

Die Applikation muss 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 dass die Gesamtanzahl der Farben aller angezeigen DIBs < 235 liegt

5

50

NULL

Umsetzung in Microsoft Windows NT/2000/XP

Unter Microsoft Windows NT/2000/XP 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. Diese Technik von Windows 9x/ME nicht unterstützt.

Es sollte die von CreateHalftonePalette erzeugte Farbpalette benutzt werden. Windows NT/2000/XP 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.

-


Valid HTML 4.01!