TIFF und PNG-Dateien können Pixeldaten in erhöhter Genauigkeit (16 Bits je Pixel) enthalten. Die Pro-Version von DaVinci kann eine solche RGB oder Grauwerte-TIFF-Datei ohne Datenverlust importieren und exportieren. Sie erstellt daraus eine DIB mit 48 Bits / Pixel bzw. 16 Bits / Pixel (biBitCount des BITMAPINFOHEADERs = 24 bzw 8).
Um die 16-Bit Versionen einer DIB problemlos mit Microsoft Windows einsetzen zu können, werden die höheren 8 Bits der DIB kompatibel zu 8 Bit/Pixel DIBs abgelegt. Die niederen 8 Bits werden nahtlos hinter den Daten der letzten Zeile der oberen 8 Bits abgelegt. Als Kennzeichen, dass weitere DIB-Daten vorhanden sind, wird das Feld biPlanes der BITMAPINFOHEADER-Struktur auf 2 gesetzt.
Solche DIBs sind außerhalb der Microsoft Spezifikation für DIBs und können daher nur innerhalb einiger Routinen des DaVinci APIs uneingeschränkt verwendet werden.
Zur Verwendung einer solchen DIB mit Microsoft Windows API Funktionen wie SetDIBits oder CreateDIBSection muss die Anwendung vor der Ausgabe zunächst das Feld biPlanes auf 1 zurücksetzen, in manchen Fällen kann es erforderlich sein, zusätzlich den Wert von biSizeImage zu halbieren. Da diese Veränderung lediglich den BITMAPINFOHEADER der DIB betreffen, sind sie leicht und schnell durchzuführen und wieder rückgängig zu machen.
Beim Import von Grauwerte-TIFF-Dateien ist biBitCount = 8 und biPlanes =2. Die Anwendung muss die erste Farbe in der RGBQUAD-Farbpalette auf 0 prüfen um festzustellen ob 0 oder 255 ein weißes Pixel kennzeichnet.
Folgende Funktionen können auch die unteren 8 Bit jedes Pixels korrekt verarbeiten: |
|
• |
ipImportInd / ipTiff2DIB / ipPng2DIB beim TIFF und PNG-Import mit dwDIBFlag IPDIBF_ALLOW_IMPORT_48BIT |
• |
ipExportInd / ipDIB2Tiff / ipDIB2Png erzeugt daraus wieder eine TIFF bzw PNG-Datei mit 16 Bits/Pixel |
• |
SaveDIBToFile die erstellte Datei kann nur von DaVinci Pro-basierten Programmen weiterverarbeitet werden. |
• |
|
• |
CreateDIB erzeugt bei BitCount = 48 eine RGB 16 Bit/Pixel DIB |
• |
|
• |
|
• |
|
• |
|
• |
|
• |
DIBRotate |
• |
die Funktionsgruppe um RWOpenDIB |
• |
|
• |
|
• |
|
• |
|
• |
|
• |
|
48-Bit teilkompatible DaVinci-Funktionen |
|
Alle von DaVinci und Leonardo exportierten Funktionen können DIBs mit 16 Bit / Pixel zumindst insoweit verarbeiten, dass die höhertwertigen 8 Bit korrekt verarbeitet werden. |
|
• |
|
• |
|
• |
|
• |
|
• |
|
• |
TransformDIB kann zur Umwandlung in andere Farbtiefe benutzt werden. |
• |
|
• |
|
• |
|
• |
|
• |
|
Adressieren von DIB-Daten |
|
Bei einer DIB mit biPlanes der BITMAPINFOHEADER-Struktur = 2 gibt das Feld biSizeImage die Größe des Datenbereichs für MSB und LSB zusammen an, so dass biSizeImage grundsätzlich immer gerade (durch 2 teilbar) ist. Das Feld biSizeImage ist bei dieser Art von DIBs grundsätzlich niemals 0. Der Abstand zwischen den oberen 8 Bit und den unteren 8 Bit kann also durch Division von biSizeImage durch zwei erfolgen. |
|
#ifndef MAKEWORD |
|
#define MAKEWORD(lo, hi) ((lo)|((hi)<<8) |
|
#endif |
WORD |
wRed, wGreen, wBlue; |
LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER) GlobalLock(hDIB); |
|
LPBYTE lpBitsLSB= (LPBYTE)DIBBITS(lpbmi), |
|
lpBitsMSB= lpBitsLSB + lpbmi->biSizeImage/2; |
|
wBlue = MAKEWORD(lpBitsLSB[0], lpBitsMSB[0]); |
|
wGreen = MAKEWORD(lpBitsLSB[1], lpBitsMSB[1]); |
|
wRed = MAKEWORD(lpBitsLSB[2], lpBitsMSB[2]); |
|
// nächstes Pixel |
|
lpBitsLSB += lpbmi->biBitCount/8; |
|
lpBitsMSB = hpBitsLSB + lpbmi->biSizeImage/2; |
|
wBlue = MAKEWORD(lpBitsLSB[0], lpBitsMSB[0]); |
|
wGreen = MAKEWORD(lpBitsLSB[1], lpBitsMSB[1]); |
|
wRed = MAKEWORD(lpBitsLSB[2], lpBitsMSB[2]); |