Herd Software Entwicklung
DaVinci Grafikbibliothek
DaVinci Dokumentation
Mit der RWxxxx – Gruppe von Leonardo – Funktionen können Sie DIBs leicht Pixel für Pixel lesen und schreiben ohne sich um Details der zugrundeliegenden Strukturen kümmern zu müssen.
Für die Bearbeitung von DIBs mit 48-Bit Farbtiefe oder im CMYK-Farbformat ist diese Funktionsgruppe die empfehlenswerte Methode.
HDIB hDIB; HDIBRW hRW = RWOpenDIB(hDIB);
Die Anwendung kann nun die Pixel in der DIB adressieren. Für den Zugriff auf Pixel-Ebene stehen folgende Funktionen zur Verfügung:
COLORREF cr; RGBQUAD16 rgbq16; // Beispiel: Pixelwert invertieren. cr = RWGetPixel(hRW, x, y); cr = RGB( 255 – GetRValue (cr),
255 – GetGValue (cr),
255 – GetBValue (cr) ); RWSetPixel(hRW, x, y, cr); // Dasselbe mit RGBQ16 RWGetPixelRGB16 (hRW, x, y, &rgbq16);
rgbq.rgb16Red = 65535 – rgbq.rgb16Red; rgbq.rgb16Green = 65535 – rgbq.rgb16Green; rgbq.rgb16Blue = 65535 – rgbq.rgb16Blue; RWSetPixelRGB16(hRW, x, y, &rgbq16);
Um noch schneller auf die Pixel einer DIB zugreifen zu können, kann die Anwendung auch eine ganze Zeile einer DIB oder Teile davon als RGBQUAD16-Strukturen bearbeiten.
#define BLOCK_SIZE 256
RGBQUAD16 argbq[BLOCK_SIZE];
BITMAPINFOHEADER bmi;
UINT x, i;
DIBInfo(hDib, &bmi, sizeof(bmi));
for (x=0; x<bmi.biWidth; ++x)
{
RWGetLineRGB16(hRW, x, y, BLOCK_SIZE, argbq);
for (i=0; i<BLOCK_SIZE; ++i)
{
argbq[i].rgbq16Red = 65535 – argbq[i].rgbq16Red
argbq[i].rgbq16Green = 65535 – argbq[i].rgbq16Green
argbq[i].rgbq16Blue = 65535 – argbq[i].rgbq16Blue
}
RWSetLineRGB16(hRW, x, y, BLOCK_SIZE, argbq);
}
Wenn die Anwendung keine weiteren DIB-Zugriffe ausführen will, muß sie das von RWOpenDIB zurückgelieferte Handle mit der Funktion RWClose freigeben.
Die Routinen der RWxxxx – Gruppe sind auf eine hohe Arbeitsgeschwindigkeit optimiert, erreichen aber natürlich nicht die Geschwindigkeit von Zugriffen, die die Anwendung direkt in den Speicher durchführt.
Besonders langsam ist das Setzen von Pixeln nach einem RGB-Wert in eine DIB mit Farbpalette (biBitCount=4 oder biBitCount=8) sowie bei monochromen DIBs bei denen die Farbpalette andere Werte als schwarz und weiß enthält. In diesem Fall muß die Funktion RWSetPixelRGB16 zunächst den besten Farbpaletteneintrag für den RGB-Wert bestimmen, ein sehr zeitraubender Vorgang. Ist der Wert für ein RGB-Pixel einmal bestimmt, wird er in einem 256 KByte großen Block für den nächsten möglichen Zugriff vorgehalten.
Für zwei besonders wichtige Sonderfällen von Farbpaletten enthält Leonardo Optimierungen, die das Setzen von Paletteneinträgen erheblich beschleunigen.