Device-Independent bitmappar
En enhetsoberoende bitmapp (DIB) innehåller en färgtabell. En färgtabell beskriver hur pixelvärden motsvarar RGB- färgvärden, som beskriver färger som skapas genom att avge ljus. Därför kan en DIB uppnå rätt färgschema på vilken enhet som helst. En DIB innehåller följande färg- och dimensionsinformation:
- Färgformatet för enheten där den rektangulära bilden skapades.
- Upplösningen på enheten där den rektangulära avbildningen skapades.
- Paletten för enheten där avbildningen skapades.
- En matris med bitar som mappar röda, gröna, blå ( RGB ) trillingar till bildpunkter i den rektangulära bilden.
- En datakomprimeringsidentifierare som anger datakomprimeringsschemat (om det finns något) som används för att minska storleken på matrisen med bitar.
Färg- och dimensionsinformationen lagras i en BITMAPINFO- struktur, som består av en BITMAPINFOHEADER- struktur följt av två eller flera RGBQUAD- strukturer. Den BITMAPINFOHEADER- struktur anger dimensionerna för pixelrektangeln, beskriver enhetens färgteknik och identifierar komprimeringsscheman som används för att minska bitmappens storlek. RGBQUAD- strukturer identifierar de färger som visas i pixelrektangeln.
Det finns två sorter av DIB:
- En NEDRE DIB, där ursprunget ligger i det nedre vänstra hörnet.
- En dib uppifrån och ned, där ursprunget ligger i det övre vänstra hörnet.
Om höjden på en DIB, som anges av Height medlem i bitmappens informationshuvudstruktur, är ett positivt värde, är det en dib nedifrån och upp. Om höjden är ett negativt värde är det en dib uppifrån och ned. Det går inte att komprimera de övre nederkants-DIB:erna.
Färgformatet anges när det gäller antalet färgplan och färgbitar. Antalet färgplan är alltid 1; antalet färgbitar är 1 för monokroma bitmappar, 4 för VGA-bitmappar och 8, 16, 24 eller 32 för bitmappar på andra färgenheter. Ett program hämtar antalet färgbitar som en viss skärm (eller skrivare) använder genom att anropa funktionen GetDeviceCaps och ange BITSPIXEL som det andra argumentet.
Upplösningen för en visningsenhet anges i bildpunkter per mätare. Ett program kan hämta den vågräta upplösningen för en videovisning eller skrivare genom att följa den här trestegsprocessen.
- Anropa funktionen GetDeviceCaps och ange HORZRES som det andra argumentet.
- Anropa GetDeviceCaps en andra gång och ange HORZSIZE som det andra argumentet.
- Dividera det första returvärdet med det andra returvärdet.
Programmet kan hämta den lodräta upplösningen med samma trestegsprocess med olika parametrar: VERTRES i stället för HORZRES och VERTSIZE i stället för HORZSIZE.
Paletten representeras av en matris med RGBQUAD strukturer som anger de röda, gröna och blå intensitetskomponenterna för varje färg i en visningsenhets färgpalett. Varje färgindex i palettematrisen mappas till en specifik pixel i den rektangulära region som är associerad med bitmappen. Storleken på den här matrisen i bitar motsvarar rektangelns bredd i bildpunkter multiplicerat med rektangelns höjd i bildpunkter multiplicerat med antalet färgbitar för enheten. Ett program kan hämta storleken på enhetens palett genom att anropa funktionen GetDeviceCaps och ange NUMCOLORS som det andra argumentet.
Windows stöder komprimering av palettmatrisen för 8-bpp och 4-bpp nedre upp-DIB. Dessa matriser kan komprimeras med hjälp av RLE-schemat (run-length encoding). RLE-schemat använder 2 byte-värden, den första byte som anger antalet på varandra följande bildpunkter som använder ett färgindex och den andra byte som anger indexet. Mer information om bitmappskomprimering finns i beskrivningen av strukturerna BITMAPINFOHEADER, BITMAPFILEHEADER, BITMAPV4HEADERoch BITMAPV5HEADER.
Ett program kan skapa en DIB från en DDB genom att initiera de nödvändiga strukturerna och anropa funktionen GetDIBits. För att avgöra om en enhet stöder den här funktionen anropar du funktionen GetDeviceCaps och anger RC_DI_BITMAP som RASTERCAPS-flaggan.
Ett program som behöver kopiera en bitmapp kan använda TransparentBlt- för att kopiera alla bildpunkter i en källbitmapp till en målbitmapp förutom de pixlar som matchar den transparenta färgen.
Ett program kan använda en DIB för att ange bildpunkter på visningsenheten genom att anropa funktionen SetDIBitsToDevice eller funktionen StretchDIBits. För att avgöra om en enhet stöder funktionen SetDIBitsToDevice anropar du funktionen GetDeviceCaps och anger RC_DIBTODEV som RASTERCAPS-flagga. Ange RC_STRETCHDIB som RASTERCAPS-flaggan för att avgöra om enheten stöder StretchDIBits.
Ett program som helt enkelt behöver visa en befintlig DIB kan använda funktionen SetDIBitsToDevice. Ett kalkylbladsprogram kan till exempel öppna befintliga diagram och visa dem i ett fönster med hjälp av funktionen SetDIBitsToDevice. Om du vill rita om en bitmapp upprepade gånger i ett fönster bör programmet dock använda funktionen BitBlt. Till exempel skulle ett multimediaprogram som kombinerar animerad grafik med ljud ha nytta av att anropa funktionen BitBlt eftersom den körs snabbare än SetDIBitsToDevice.