Windows bitmap | |
---|---|
Udvidelse | .bmp[1] , [1] eller [1].dib.rle |
MIME -type | billede/bmp [2] [3] |
Udvikler | Microsoft [4] [5] |
Formattype | raster grafik |
Mediefiler på Wikimedia Commons |
BMP (fra engelsk. B it m ap P icture ) er et bitmap -lagringsformatudviklet af Microsoft . Filer i BMP-format kan have filtypenavnene .bmp , .dib og .rle .
Et stort antal programmer arbejder med BMP-formatet, da dets understøttelse er integreret i Windows og OS/2 -operativsystemer . Derudover er data i dette format inkluderet i binære RES-ressourcefiler og i PE-filer .
Kun enkeltlags raster kan gemmes i dette format. Hver pixel i forskellige filer kan have et forskelligt antal bits (farvedybde). Microsoft tilbyder bitdybder på 1, 2, 4, 8, 16, 24, 32, 48 og 64. I bitdybder på 8 og derunder er farven angivet med et indeks fra farvetabellen (paletten) og for større dem, med en direkte værdi. Under alle omstændigheder kan en farve kun angives i RGB -farvemodellen (både når den er direkte angivet i en pixel og i en farvetabel), men i 16 og 32 bit kan du få en gråtone med en dybde på op til 16 og 32 bits, henholdsvis. Delvis gennemsigtighed implementeres af alfakanalen med bitdybder fra 16 bit og højere.
I de fleste tilfælde lagres pixels som et relativt simpelt todimensionelt array. For bitdybder 4 og 8 er RLE- kodning tilgængelig, som kan reducere deres størrelse. BMP-formatet understøtter også indlejring af JPEG- og PNG -data . Men sidstnævnte er mere sandsynligt ikke beregnet til kompakt lagring, men til at omgå begrænsningerne af GDI- arkitekturen , som ikke giver mulighed for direkte arbejde med andre billeder end BMP-formater. De seneste versioner af BMP-formatet introducerede også farvestyringsfunktioner. Især kan du angive slutpunkter, udføre gammakorrektion og integrere ICC-farveprofiler.
Når du bruger DIB-formatet ( Device Independent Bitmap ) , kan en programmør få adgang til alle elementer af strukturer, der beskriver et billede, ved hjælp af en almindelig markør. Men disse data bruges ikke til direkte skærmstyring, da de altid er gemt i systemhukommelsen, ikke i dedikeret videohukommelse . Pixelformatet i RAM kan afvige fra det format, der skal gemmes i videohukommelsen for at angive en prik af samme farve. For eksempel kan DIB-formatet bruge 24 bit til at specificere en pixel , og grafikadapteren på det tidspunkt kan fungere i HiColor -tilstand med en farvedybde på 16 bit. I dette tilfælde vil en lys rød prik i et hardwareuafhængigt format blive specificeret med tre bytes 0000FF 16 og i videohukommelsen - med ordet F800 16 . Når du kopierer et billede til skærmen, vil systemet bruge ekstra tid på at konvertere farvekoder fra 24-bit format til videobufferformat .
DDB-formatet ( Device Dependent Bitmap ) indeholder altid farvekoder, der matcher videobufferkoderne , men det kan lagres både i system- og videohukommelsen. I begge tilfælde indeholder det kun farvekoder i et format, der sikrer, at billedet overføres fra RAM til videohukommelse ved hjælp af simpel kopiering [6] .
Officielle oplysninger om BMP-formatet kan findes i MSDN eller Microsoft Windows SDK-hjælpen (kan være bundtet med nogle IDE'er). WinGDI.h-filen fra Microsoft har alle C++- erklæringerne for dette format. Denne artikel indeholdt dog ikke typeangivelser, da det kan gøre det for besværligt. Derudover kan nogle udviklere finde officielle meddelelser ubelejlige, og derfor er deres relevans tvivlsom. Hvis du har brug for de originale navne på konstanter, strukturer, typer og deres felter, så er de alle i teksten til denne artikel.
Den maksimale størrelse af udelelige celler (eksklusive felter med bitstrukturer): 32 bit, og formatet kan derfor klassificeres som 32 bit. En undtagelse kan være 64-bit pixels, men deres kanalværdier kan også behandles med 16-bit ord. Rækkefølgen af bytes i 16-bit og 32-bit celler er overalt fra lav til høj (little-endian). Heltal skrives i direkte kode med et ekstra log-in . Sammenlignet med hardwarearkitekturer svarer byterækkefølgen og nummerformatet til x86 .
Denne artikel bruger WinAPI -typenavnene som i Microsoft-dokumentationen til at angive typer. Ud over specifikke (beskrevet separat i artiklens tekst) kan der findes fire numeriske typer:
I Windows Bitmap-formatet forstås strukturer som en blok med på hinanden følgende celler af forskellige faste størrelser, som har betingede navne (der er i mange programmeringssprog), og ikke noget mere kompliceret (for eksempel en kommandostrøm af vilkårlig størrelse).
Nogle formatelementer har en version af Windows, hvorfra den understøttes. Vi taler primært om de vigtigste WinAPI-biblioteker såsom gdi32.dll, shell32.dll, user32.dll og kernel32.dll. Andre operativsystemkomponenter (f.eks. GDI+, .NET, DirectX) kan have andre, mere avancerede funktioner.
Data i BMP-format består af tre hovedblokke i forskellige størrelser:
Når de er gemt i en fil, kommer alle overskrifter fra den allerførste byte. Pixeldata kan lokaliseres på en vilkårlig position i filen (det er angivet i OffBits-feltet i BITMAPFILEHEADER-strukturen), inklusive i en afstand fra overskrifterne. En valgfri farveprofil dukkede op i version 5, og den kan også placeres frit, men dens position er angivet fra begyndelsen af BITMAPINFO (i feltet ProfileData).
I RAM (for eksempel ved interaktion med GDI WinAPI-funktioner) er BITMAPFILEHEADER-strukturen udelukket fra overskrifterne. Samtidig anbefaler Microsoft at placere farveprofilen umiddelbart efter overskrifterne i en enkelt blok [7] . Pixeldata kan have en vilkårlig placering i hukommelsen, og deres adresse er angivet i procedureparametrene. Under alle omstændigheder anbefales det at holde alle blokke i hukommelsen på adresser delelige med fire: der er 32-bit celler i overskrifterne, og et sådant krav til pixeldata er specificeret i dokumentationen [8] . Dette krav er kun gyldigt for RAM: når det er gemt i en fil, er det ikke nødvendigt at overholde det.
BITMAPFILEHEADER er en 14-byte struktur, der er placeret helt i begyndelsen af filen. Bemærk venligst, at lige fra begyndelsen af strukturen går justeringen af cellerne tabt. Hvis det er vigtigt for dig, skal du placere denne header i RAM på lige adresser, der ikke er et multiplum af fire (så falder 32-bit celler i justerede positioner).
Pos. (hex) |
Størrelse (bytes) |
Navn | WinAPI type | Beskrivelse |
---|---|---|---|---|
00 | 2 | bfType | ORD | Et mærke til at skelne et format fra andre (formatsignatur). Kan indeholde den enkelte værdi 4D42 16 /424D 16 (little-endian/big-endian). |
02 | fire | bfStørrelse | DWORD | Filstørrelse i bytes. |
06 | 2 | bfReserveret1 | ORD | Reserveret og skal være nul. |
08 | 2 | bfReserveret2 | ORD | |
0A | fire | bfOffBits | DWORD | Placeringen af pixeldataene i forhold til starten af denne struktur (i bytes). |
Formatsignaturen, når du ser indholdet af en fil som tekst i binær tilstand, ligner et par ASCII-tegn "BM".
BITMAPINFO kommer umiddelbart efter BITMAPFILEHEADER i filen. Adressen på denne blok i hukommelsen sendes også direkte til nogle WinAPI-funktioner (for eksempel SetDIBitsToDevice eller CreateDIBitmap). Derudover bruges den samme blok i Windows- ikon- og markørformater, men dette punkt er ikke taget i betragtning i denne artikel (se separate beskrivelser af disse formater). Denne struktur er grundlæggende og beskrivende i BMP-formatet, og så når et feltnavn blot nævnes, så er det et felt i denne struktur.
BITMAPINFO-blokken består af tre dele:
Om bitmasker og farvetabellen, se nedenfor i separate afsnit. Her følger beskrivelsen af strukturen med informationsfelter.
På tidspunktet for skrivning af denne artikel havde strukturen med informationsfelter fire versioner [9] : CORE, 3, 4 og 5 (versionsbetegnelserne er betingede i denne artikel for kortheds skyld). For hver version har Microsoft erklæret fire separate strukturer med forskellige feltnavne. I denne artikel, når man nævner et felt, der er til stede i flere strukturer, tages den del, der er fælles for alle strukturer, i slutningen af navnet (for eksempel BitCount i stedet for bcBitCount, biBitCount, bV4BitCount eller bV5BitCount). Strukturversionen kan bestemmes af den første 32-bit celle (WinAPI DWORD type), som indeholder dens størrelse i bytes (et heltal uden fortegn). CORE-versionen adskiller sig fra alle i dens kompakthed og brugen af udelukkende 16-bit usignerede felter. De resterende tre indeholder identiske celler, hvortil der blev tilføjet nye i hver ny version.
Nedenfor er en oversigtstabel over informationsstrukturer:
Version | Størrelse (bytes) |
Struktur navn | Windows 9x / NT version [10] | Windows CE / Mobile version [11] | Noter |
---|---|---|---|---|---|
KERNE | 12 | BITMAPCOREHEADER | 95/NT 3.1 og ældre | CE 2.0/Mobil 5.0 og nyere | Indeholder kun rasterets bredde, højde og bitdybde. |
3 | 40 | BITMAPINFOHEADER | 95/NT 3.1 og ældre | CE 1.0/Mobil 5.0 og nyere | Indeholder bredden, højden og bitdybden af et raster samt oplysninger om pixelformat, farvetabel og opløsning. |
fire | 108 | BITMAPV4HEADER | 95/NT 4.0 og ældre | ikke understøttet | Separat udvalgte kanalmasker, tilføjet information om farverum og gamma. |
5 | 124 | BITMAPV5HEADER | 98/2000 og ældre | ikke understøttet | Tilføjet præferencevisningsstrategi og understøttelse af ICC-profiler. |
På grund af identiteten af felterne i version 3, 4 og 5, kan det se ud til, at feltet Størrelse kan styre antallet af felter og fjerne ubrugte. Det er faktisk ikke korrekt, da størrelsen her spiller versionens rolle (i CORE-versionen, selvom felterne også er identiske, men af en anden størrelse og type). Ingen garanterer, at du ikke får mindre eller større overskrifter med et andet sæt felter. Adobe Photoshop kan dog gemme 52-byte og 56-byte informationsfeltstrukturer, når du gemmer BMP-filer. Faktisk er dette en trunkeret 4. version, som kun indeholder bitmasker af kanaler (56 bytes - version med alfakanal).
16-bit informationsfelter (CORE version)Bemærk, at bredde- og højdefelterne her indeholder heltal uden fortegn, mens 32-bit strukturerne gemmer fortegnsværdier.
Position i fil (hex) |
Position i struktur (hex) |
Størrelse (bytes) |
Navn | WinAPI type | Beskrivelse |
---|---|---|---|---|---|
0E | 00 | fire | bcStørrelse | DWORD | Størrelsen af denne struktur i bytes, hvilket også angiver strukturens version (skal være 12 her). |
12 | 04 | 2 | bcWidth | ORD | Bredde (bcWidth) og højde (bcHeight) af rasteret i pixels. Angivet som et heltal uden fortegn. Værdien 0 er ikke dokumenteret. |
fjorten | 06 | 2 | bc Højde | ORD | |
16 | 08 | 2 | bcPlanes | ORD | Den eneste gyldige værdi i BMP er 1. Dette felt bruges i Windows ikoner og markører. |
atten | 0A | 2 | bcBitCount | ORD | Antallet af bits pr. pixel (se listen over understøttede bits i et separat afsnit nedenfor). |
Tabellen nedenfor giver et overblik over felterne. Du kan finde detaljerede oplysninger i sektionerne nedenfor.
Position i fil (hex) |
Position i struktur (hex) |
Størrelse (bytes) |
Navn (version 3/4/5) |
WinAPI type | Beskrivelse |
---|---|---|---|---|---|
0E | 00 | fire | biSize bV4Size bV5Size |
DWORD | Størrelsen af denne struktur i bytes, der også angiver versionen af strukturen (se versionstabellen ovenfor). |
12 | 04 | fire | biWidth bV4Width bV5Width |
LANG | Bredden af rasteret i pixels. Angivet som et signeret heltal. Nul og negativ er ikke dokumenteret. |
16 | 08 | fire | biHøjde bV4Højde bV5Højde |
LANG | Et heltal med fortegn, der indeholder to parametre: rasterhøjden i pixels (den absolutte værdi af tallet) og rækkefølgen, hvori strenge vises i todimensionelle arrays (tallets fortegn). Nulværdien er ikke dokumenteret. |
1A | 0C | 2 | biPlanes bV4Planes bV5Planes |
ORD | Den eneste gyldige værdi i BMP er 1. Dette felt bruges i Windows ikoner og markører. |
1C | 0E | 2 | biBitCount bV4BitCount bV5BitCount |
ORD | Antallet af bits pr. pixel (se listen over understøttede bits i et separat afsnit nedenfor ). |
1E | ti | fire | biCompression bV4V4Compression [12] bV5Compression |
DWORD | Angiver, hvordan pixels gemmes (se afsnittet nedenfor ). |
22 | fjorten | fire | biSizeImage bV4SizeImage bV5SizeImage |
DWORD | Størrelsen af pixeldataene i bytes. Kan indstilles til nul, hvis lageret er et todimensionalt array. |
26 | atten | fire | biXPelsPerMeter bV4XPelsPerMeter bV5XPelsPerMeter |
LANG | Antallet af pixels pr. meter vandret og lodret (se afsnittet " Billedopløsning " i denne artikel). |
2A | 1C | fire | biYPelsPerMeter bV4YPelsPerMeter bV5YPelsPerMeter |
LANG | |
2E | tyve | fire | biClrUsed bV4ClrUsed bV5ClrUsed |
DWORD | Størrelsen af farvetabellen i celler. |
32 | 24 | fire | biClrImportant bV4ClrImportant bV5ClrImportant |
DWORD | Antallet af celler fra begyndelsen af farvetabellen til den sidst brugte (inklusive sig selv). |
Tilføjet i version 4 | |||||
Position i fil (hex) |
Position i struktur (hex) |
Størrelse (bytes) |
Navn (version 4/5) |
WinAPI type | Beskrivelse |
36 | 28 | fire | bV4RedMask bV5RedMask |
DWORD | Bitmasker til at udtrække kanalværdier : rød, grøn, blå intensitet og alfakanalværdi. |
3A | 2C | fire | bV4GreenMask bV5GreenMask |
DWORD | |
3E | tredive | fire | bV4BlueMask bV5BlueMask |
DWORD | |
42 | 34 | fire | bV4AlphaMask bV5AlphaMask |
DWORD | |
46 | 38 | fire | bV4CSType bV5CSType |
DWORD | Slags farverum . |
4A | 3C | 36 | bV4Endpoints bV5Endpoints |
CIEXYZTRIPLE | Værdien af disse fire felter tages kun i betragtning, hvis CSType-feltet indeholder 0 (LCS_CALIBRATED_RGB). Derefter er slutpunkterne og gammaværdierne for de tre farvekomponenter angivet i disse felter. |
6E | 60 | fire | bV4GammaRed bV5GammaRed |
DWORD [13] | |
72 | 64 | fire | bV4GammaGreen bV5GammaGreen |
DWORD [13] | |
76 | 68 | fire | bV4GammaBlue bV5GammaBlue |
DWORD [13] | |
Tilføjet i version 5 | |||||
Position i fil (hex) |
Position i struktur (hex) |
Størrelse (bytes) |
Navn | WinAPI type | Beskrivelse |
7A | 6C | fire | bV5 Hensigt | DWORD | Rastergengivelsespræferencer . |
7E | 70 | fire | bV5ProfileData | DWORD | Byteforskydningen af farveprofilen fra starten af BITMAPINFO (se også afsnittet Farveprofil senere i denne artikel). |
82 | 74 | fire | bV5Profilstørrelse | DWORD | Hvis en farveprofil er direkte inkluderet i BMP, så er dens størrelse i bytes angivet her. |
86 | 78 | fire | bV5Reserveret | DWORD | Reserveret og skal sættes til nul. |
BitCount-feltet indeholder antallet af bits pr. pixel. Hvis der er angivet en værdi, der ikke er nul, er dette den reelle bitdybde. Nulindholdet i BitCount-feltet er angivet, hvis pixels er gemt i JPEG- eller PNG-format. Så vil den faktiske bitdybde blive bestemt af disse formater. Bits af rent BMP-format er præsenteret i tabellen nedenfor:
Bit | Byte | BITMAPINFO | RLE | Kanalmasker | Software support | ||||
---|---|---|---|---|---|---|---|---|---|
KERNE | 3, 4, 5 | Windows 9x og NT | Windows CE og Mobile | GDI+ og .NET | |||||
en | ⅛ | Ja | Ja | Ikke | Ikke | Ja | Ja | Ja | |
2 | ¼ | Ja | Ja | Ikke | Ikke | Ikke | Ja | Ikke | |
fire | ½ | Ja | Ja | Ja | Ikke | Ja | Ja | Ja | |
otte | en | Ja | Ja | Ja | Ikke | Ja | Ja | Ja | |
16 | 2 | Ikke | Ja | Ikke | Ja | Ja | Ja | Ja | |
24 | 3 | Ja | Ja | Ikke | Ikke | Ja | Ja | Ja | |
32 | fire | Ikke | Ja | Ikke | Ja | Ja | Ja | Ja | |
48 | 6 | Ikke | Ja | Ikke | Ikke | Ikke | Ikke | Ja | |
64 | otte | Ikke | Ja | Ikke | Ikke | Ikke | Ikke | Ja |
Bemærkninger til tabellen:
1. Kolonnen "BITMAPINFO" viser kun bitdybdeunderstøttelse fra Microsoft.
2. Windows CE 1.0 og 1.01 understøtter kun bitdybder 1 og 2 [14] .
3. GDI+ version 1.0 16-bit farvekanaler kan kun læses, idet de straks konverteres til 8-bit [15] .
I bitdybder på 8 og derunder er farven på en pixel angivet med et indeks i farvetabellen, i højere bits: med en direkte værdi i RGB -farvemodellen . En alfakanal kan eventuelt tilføjes i 16 og 32 bit, og i 64 bit er den permanent til stede.
Tabellen viser kun den bithed, som Microsoft har dokumenteret. Formatet i sig selv indeholder ingen grundlæggende begrænsninger for brugen af bitness, der ikke er nævnt her.
1-bit BMP-filer med ren sort (bit off) og hvid (bit on) kaldes monokrome. Sådanne filer bruges normalt som masker til andre bitmaps. Måske stødte du konstant på netop sådanne 1-bit rastere. Faktisk pålægger Windows Bitmap-formatet ingen begrænsninger for, hvilke farver der vil blive brugt til hver af bitværdierne.
Du kan også støde på følgende bitnavne: CGA for to bit, EGA for fire, HiColor (HighColor) for 16 bit, TrueColor for 24 og 32 bit med gennemskinnelighed, DeepColor for høje bits og muligvis andre. Disse navne går tilbage til udviklingen af farve bitmap-skærme og henviser mere til deres farvedybde . På det tidspunkt, hvor denne artikel blev skrevet (2014), har sådanne navne ikke været brugt i lang tid på grund af den stærke udbredelse af 24-bit enheder (i stedet er farvedybden i bits eller deres antal blot angivet). Og BMP-filer i lavere bitness gemmes i højere grad ikke til visning på CGA- eller EGA-enheder, men for kompakthed sammenlignet med 24-bit og 32-bit formater, hvis der bruges et lille antal farver.
Separate begrænsede komprimeringsværdier bruges for hver bitgruppe, men samlet set er deres værdier unikke. Microsoft har dokumenteret følgende værdier (tabellen viser navnene på konstanterne fra denne virksomhed):
Betyder | Konstant navn | Gælder for BitCount |
Pixel-opbevaring | Højde tegn | Windows version | |
---|---|---|---|---|---|---|
9x/NT | CE | |||||
0 | BI_RGB | andet end nul | todimensionelt array | +/− | 95/NT3.1 | CE 1.0 |
en | BI_RLE8 | otte | RLE-kodning | + | 95/NT3.1 | (ikke sub.) |
2 | BI_RLE4 | fire | RLE-kodning | + | 95/NT3.1 | (ikke sub.) |
3 | BI_BITFIELDS | 16 og 32 | 2D-array med farvekanalmasker | +/− | 95/NT3.1 | CE 2.0 |
fire | BI_JPEG | 0 | i indlejret jpeg-fil | ?/− [16] | 98/2000 | (ikke sub.) |
5 | BI_PNG | 0 | i indlejret PNG-fil | ?/− [16] | 98/2000 | (ikke sub.) |
6 | BI_ALPHABITFIELDS | 16 og 32 | 2D-array med farve- og alfakanalmasker | +/− | (ikke sub.) | .NET 4.0 |
Farvetabellen er en del af BITMAPINFO-blokken og kan bruges på to måder:
Placeringen af farvetabellen er angivet fra begyndelsen af BITMAPINFO-blokken. Som standard kommer det umiddelbart efter informationsstrukturen (dets usignerede størrelse i bytes kan læses fra det første 32-bit felt). Men mellem strukturen med felter og farvetabellen kan fire-byte bitmasker bruges til at udtrække farvekanaler (gælder kun 16 og 32 bit). De er der kun, hvis informationsstruktur version 3 (Størrelse = 40) bruges, og feltet Komprimering indeholder 3 (BI_BITFIELDS) eller 6 (BI_ALPHABITFIELDS). Derefter skal der tilføjes 12 bytes (hvis BI_BITFIELDS er angivet) eller 16 bytes (hvis BI_ALPHABITFIELDS er angivet) [17] til størrelsen af informationsfelterne . Det viser sig 6 muligheder for placeringen af bordet:
Header- version |
Position (hex) | Noter | |
---|---|---|---|
I fil | I BITMAPINFO | ||
KERNE | 1A | 0C | kanalmasker understøttes ikke |
3 | 36 | 28 | Kompression indeholder ikke 3 eller 6 |
42 | 34 | Kompression = 3 (BI_BITFIELDS) | |
46 | 38 | Kompression = 6 (BI_ALPHABITFIELDS) | |
fire | 7A | 6C | kanalmasker er indlejret i informationsfelterne |
5 | 8A | 7B |
Antallet af celler i tabellen bestemmes af felterne BitCount og ClrUsed. Med bitdybder på 8 og derunder tages det maksimale antal celler i tabellen som 2 bits : 2 i et en-bit raster, 4 i et to-bit et, 16 i et 4-bit et og 256 i et 8. -bid en. I den givne bithed indeholder tabellen altid dette maksimale antal celler, hvis CORE-versionsheaderen (Størrelse = 12) bruges, eller hvis ClrUsed-feltet indeholder 0 i andre versioner. I alle andre tilfælde, uanset bitheden, indeholder tabellen så mange celler som angivet i feltet ClrUsed [18] .
Selve tabellen er en endimensionel matrix, der kan indeholde tre typer celler:
Ikke alle celler kan bruges i hele tabellen, og feltet ClrImportant indeholder antallet af celler fra begyndelsen af tabellen til den sidst brugte (inklusive sig selv). En værdi på 0 i ClrImportant-feltet angiver, at hele tabellen er brugt. Det er bedre at placere de involverede celler helt i begyndelsen af tabellen, og det anbefales at sortere dem i faldende rækkefølge efter vigtighed (i tilfælde af at du bliver nødt til at reducere deres antal).
Hvis billedet er 16 eller 32 bit, kan 32-bit masker specificeres til at udtrække farvekanaler. Dette skyldes, at 16 ikke er et multiplum af 3, og derfor kan bits allokeres på forskellige måder. For nemheds skyld bruger 32-bit billeder 8-bit kanaler, og understøttelse af dem kan derfor virke overflødig. Faktisk her gør masken det muligt at aktivere/deaktivere alfakanalen eller indstille rækkefølgen af komponenterne, der passer dig, og ikke bare justere deres opløsning. Ved anvendelse af masker læses pixelcellen i sin helhed som det tilsvarende maskinord i little-endian.
Tilstedeværelsen af bitmasker afhænger af versionen af informationsfelterne i BITMAPINFO-strukturen og komprimeringsfeltet i den. For CORE-versionen kan vilkårlige masker ikke angives, da der ikke er noget komprimeringsfelt og separate maskefelter. I andre versioner er farvemasker aktiveret, hvis komprimering indeholder 3 (BI_BITFIELDS). Alfakanalmasken bruges altid i version 4 og 5. Da Windows CE ikke understøtter disse to versioner, hvor der er et særligt felt til den, blev værdien 6 (BI_ALPHABITFIELDS) af feltet Komprimering introduceret for den tredje version, som tilføjer både farvemasker og en maske-alfakanal (understøttet siden Windows CE .NET 4.0).
Bitmaskernes position er fast uanset headerversionen: 36 timer i hele filen eller 28 timer fra begyndelsen af BITMAPINFO-blokken. I version 4 og 5 er felter designet specielt til dem placeret på dette sted. I version 3 skal bitmasker være placeret umiddelbart efter informationsfelterne, og de falder således nøjagtigt ind i de tilsvarende felters positioner i ældre versioner. Bemærk venligst, at i den tredje version, hvis der er masker, flyttes farvetabellen 12 eller 16 bytes frem, placeret umiddelbart efter dem. De 4-byte farvemasker er i rækkefølgen rød, grøn, blå. Alfakanalmasken er allerede bag dem.
Microsofts dokumentation gælder kun for ét obligatorisk krav til bitmasker: hver maske skal være sammenhængende. Om tilfældet med skæring af masker siges der, at det er ønskeligt ikke at gøre dette [19] . Microsoft siger også, at det ikke er nødvendigt at bruge alle bits af en pixel [20] . Der er ingen krav til indholdet af ubrugte bits.
Bemærk, at ingen garanterer, at masker bredere end 8 bit kan bruges. Og der bliver ikke sagt noget om sagen, når en kanal vil have en nulmaske (f.eks. når den virkelig ikke bruges). Her er en situation mulig, hvor alle komponenter vil have nul masker, og en alfakanal vil forblive (som i dette tilfælde kan optage alle bits). En farvekanals nulmaske kan fortolkes på to måder: dens værdi tages som nul, eller pixels på denne kanal påvirkes ikke, når der tegnes. Hvis vi tager den første fortolkning med en enkelt alfakanal, så vil alfakanalen i det væsentlige indstille graden af sortfarvning af pixlen. Ud over vage muligheder er der også en interessant. Da kryds ikke er forbudt, er det muligt at sætte alle kanaler til én position og derved få en gråtone .
Noget software har et begrænset sæt understøttede bitmasker. Tabellen nedenfor viser de tilgængelige muligheder i disse begrænsede miljøer:
Bithed | * | Maskeværdier (hex) | Software support | |||||
---|---|---|---|---|---|---|---|---|
Rød | Grøn | Blå | Alfa | Ubrugt | Windows 9x [21] | GDI+ [22] og .NET [23] | ||
16 | (en) | 7C00 | 03E0 | 001F | 0000 | 8000 | Ja | Ja |
7C00 | 03E0 | 001F | 8000 | 0000 | Ikke | Ja | ||
F800 | 07E0 | 001F | 0000 | 0000 | Ja | Ja | ||
(b) | FFFF | FFFF | FFFF | 0000 | 0000 | Ikke | Ja | |
32 | (en) | 00FF:0000 | 0000:FF00 | 0000:00FF | 0000:0000 | FF00:0000 | Ja | Ja |
00FF:0000 | 0000:FF00 | 0000:00FF | FF00:0000 | 0000:0000 | Ikke | Ja |
Tabelnoter:
(a) Disse sæt bruges som standard ved 16 og 32 bit, hvis farveekstraktionsmasker ikke er specificeret.
(b) Dette sæt masker implementerer i sagens natur 16-bit gråtoner.
I filen kan placeringen af pixeldata findes i OffBits-feltet i BITMAPFILEHEADER-strukturen. Under køretid gemmer applikationen adressen på pixeldataene, hvor det er praktisk. Microsoft-dokumentationen nævner også de såkaldte pakkede bitmaps , som er angivet med en enkelt adresse på BITMAPINFO-blokken. For sådanne bitmaps følger pixeldataene umiddelbart efter overskriften (herunder, ud over informationsfelterne, bitmasker og en farvetabel) [24] .
Størrelsen af pixeldataene i bytes gemmes i feltet SizeImage i BITMAPINFO-strukturen. Det er den "rå" størrelse af den kontinuerlige blok, der indeholder data til dannelsen af pixels (uanset formatet), og ikke en udpakket, der er skrevet der. Som standard skal dette felt indeholde den aktuelle værdi, da det kan bruges til at finde ud af præcis hvor mange bytes der skal læses fra filen for at få pixels. Det er dog lovligt at beholde dette felt nul, når pixel lagres som todimensionelle arrays (når feltet Komprimering indeholder værdien 0 (BI_RGB), 3 (BI_BITFIELDS) eller 6 (BI_ALPHABITFIELDS) [25] ). Så kan størrelsen af pixels, hvis det er nødvendigt, relativt hurtigt beregnes ud fra bitdybden, bredden og højden af rasteret.
Der er tre måder at gemme pixels i Windows Bitmap-formatet (se også afsnittet Kompressionsfelt i denne artikel):
Underafsnittene nedenfor beskriver hver af dem separat.
Angivelse af farve og værdi for alfakanalenFor at angive en farve, når den gemmes i BMP-format, uanset hvordan den er angivet, bruges kun heltal uden fortegn. Selve pixelfarven kan indstilles på to måder:
Den anden er nyttig, når farvesættet er ret stort eller uforudsigeligt (f.eks. under billedbehandling). Den første metode giver både et kompakt layout med et lille sæt farver og en vis bekvemmelighed ved styring af de anvendte farver (bare skift farveværdien i paletten). Selve farvetabellen er angivet enten som 16-bit usignerede indekser i systempaletten (se afsnittet " Farvetabel " i denne artikel), eller i RGB som i en pixel, men udelukkende af 8-bit kanalværdier.
Indekset i farvetabellen er cellenummeret i den fra begyndelsen af tabellen (kontinuerlig nummerering, der starter fra nul, bruges). For hver bitdybde er det maksimale indeks grundlæggende begrænset af værdien 2 bitdybde - 1. I virkeligheden er det også begrænset af antallet af elementer i tabellen (detaljer i afsnittet " Farvetabel " i denne artikel). Microsoft har ikke dokumenteret adfærden, når et indeks uden for tabellen er angivet, men GDI tager sort i dette tilfælde.
I bitdybder over 8 er farven på en pixel angivet direkte i RGB-farvemodellen: niveauet af rød, grøn og blå er angivet separat. Nulværdien af enhver af kanalerne betyder det fuldstændige fravær af den tilsvarende skygge, og maksimum: dens fuldstændige tilstedeværelse. Opløsningen af kanalværdierne er variabel, og den har sin egen i hver bitdybde (for specifikke værdier, se afsnittet om lagring af pixels i et todimensionalt array i denne artikel). Samtidig kan der i bitdybder på 16 og 32 ikke kun indstilles vilkårlig opløsning, men også individuel for hver kanal (for eksempel 5 bits for rød og blå, men 6 bit for grøn). På trods af det store antal muligheder for at indstille opløsningen af værdier, siger Microsoft-dokumentationen ikke, hvordan man ændrer opløsningen af en værdi. På grund af dette kan forskellige softwareproducenter få forskellige resultater, når de ændrer bitdybden.
Når du direkte indstiller farven på en pixel, ud over RGB-værdier, giver Windows Bitmap-formatet dig eventuelt også mulighed for at indstille alfakanalværdier . Med hensyn til bithed og kodning af værdier er den identisk med farvekanaler: den har en vilkårlig bithed, og der bruges heltal uden fortegn. Hvad angår værdimatchning, svarer nul til fuld gennemsigtighed, og det maksimale antal tilgængelige svarer til fuld udfyldning.
Todimensionelt arrayPixels af enhver bithed kan lagres i et todimensionalt array. Med denne lagringsmetode indeholder feltet Komprimering værdien 0 (BI_RGB), 3 (BI_BITFIELDS) eller 6 (BI_ALPHABITFIELDS). Hvis CORE-versionens header bruges, gemmes pixels alligevel kun som et todimensionelt array.
I dette layout er rasterpixels skrevet som enkeltpixel vandrette striber, som Microsoft ofte kalder " scanninger " i sin dokumentation (på russisk er det nærmeste ord linjer ). I hukommelsen er disse rækker skrevet i rækkefølge, men med en positiv Højde: startende fra den nederste ( engelsk bottom-up bitmap ), og med en negativ Højde: helt fra toppen ( engelsk top-down bitmap ). Inden for hver vandret række skrives pixels kun fra venstre mod højre. Pixels mindre end 8 bits placeres i bytes, der fylder bitsene fra høj til lav, hvilket resulterer i, at de hexadecimale/binære numeriske værdier af pixels ligner outputbilledet mere. Hvis bitdybden er 16 eller 32, så udføres behandlingen af hele maskinord af samme størrelse med rækkefølgen af bit fra lav til høj (little-endian). Rækker, uanset cellestørrelse, skal udfyldes med nuller op til et multiplum af fire bytes størrelse [8] . På grund af dette, med en ikke-multiple billedbredde, kan ubrugte bits eller hele bytes vises i slutningen af rækkerne. Men takket være den garanterede mangfoldighed af rækkestørrelsen kan bearbejdning udføres med 8-, 16- eller 32-bit maskinord, som du vælger. Og Microsoft har stadig følgende tendens i bitdybder større end 8: den blå (blå) komponent er placeret i de nederste bits / første bytes, grøn (grøn) i den næste, og rød (rød) er ældre / længst, og hvis der er en alfakanal, så er den i de mest signifikante bits/sidste bytes.
Diagrammet nedenfor viser arrangementet af pixels i bits mindre end 8 :
stykker | 7 | 6 | 5 | fire | 3 | 2 | en | 0 |
1 bit | 0 | en | 2 | 3 | fire | 5 | 6 | 7 |
2 bits | 0 | en | 2 | 3 | ||||
4 bits | 0 | en |
Ved 16 og 32 bit behandles pixels af maskinord af samme størrelse (forudsat lille-endian byte-rækkefølge), som anvender kanalbitmasker . Hvis der ikke er givet individuelle bitmasker, vil strukturen være som følger. Ved 16 bit tildeles 5 bit til hver kanal. Blå er i de mindst signifikante bits (maske 001F 16 ), grøn er i position 5 (maske 03E0 16 ), rød: startende fra den 10. bit (maske 7C00 16 ), og den mest signifikante resterende bit 15 bruges ikke. Hvis der bruges 32 bit, er hver kanal som standard tildelt en byte (8 bit). Komponenterne er arrangeret på samme måde: blå i de lave bits (maske 0000:00FF 16 ), grøn startende ved bit 8 (maske 0000:FF00 16 ), rød startende ved bit 16 (maske 00FF:0000 16 ), og den høje byte er ikke brugt (den bruges kun som alfakanal, hvis du viser den direkte) [26] . Da det formodes at blive læst i little-endian byte rækkefølge, hvis du læser værdier fra hukommelsen byte for byte, vil de være i samme rækkefølge (blå kommer først).
Med en bitdybde på 24 , har hver kanal en byte, og med en bitdybde på 48 og 64 : et 16-bit maskinord. I alle tre tilfælde går farvekomponenterne i hukommelsen i rækkefølgen: blå, grøn, rød. I 64-bit BMP'er efterfølges farver desuden af en 16-bit alfakanal. Hvis du ønsker at behandle en 64-bit pixel med et enkelt maskinord, så vil i little-endian blå være i de nederste 16 bit, og alfakanalen vil være i de højere. Grøn, henholdsvis, vil være ved siden af rød, og blå - ved siden af alfa. Og du kan se, at i 24 bit svarer pixelformatet til RGBTRIPLE-strukturen fra farvetabellen.
RLE-kodningBrugen af RLE-kodning af Microsoft er kun dokumenteret for bitdybder 4 og 8. Når det bruges i BITMAPINFO, skal Kompressionsfeltet indeholde 2 (BI_RLE4) ved bitdybde 4 eller 1 (BI_RLE8) med otte-bit pixels. Rasterhøjden skal angives som et positivt tal.
I Windows Bitmap-formatet kan RLE-kodning sammenlignes med tegning med simple kommandoer. Tegningen starter fra den nederste venstre pixel (vær forsigtig: i raster generelt kan den øverste venstre pixel være mere kendt) og fortsætter til højre og op. Pixels uden for bitmapstørrelsen tegnes ikke (dette er ikke nævnt i dokumentationen, men GDI udviser denne adfærd). RLE-instruktioner giver dig mulighed for at afbryde tegningen af en vandret linje, hele billedet, og også flytte tegnemarkøren til en anden position. Som følge heraf kan nogle pixels muligvis ikke tegnes. Dokumentationen giver ikke eksplicit farver til uudtrukne pixels, som følge heraf kan fortolkningen variere: manglende pixels enten forbliver transparente eller får en farve med indeks 0. Hvis vi gør den første antagelse, så kan vi sige, at 4- og 8 -bit-tilstande skyldes, at RLE implicit understøtter gennemsigtighed, men denne adfærd er ikke garanteret.
Billeddannelse under RLE-kodning udføres af kommandoer. Hver kommando skal nødvendigvis begynde med en lige adresse (justeret til en 16-bit grænse). Der er fem kommandoer, som er defineret af et par bytes:
Byte 1 (hex) |
Byte 2 (hex) |
Beskrivelse |
---|---|---|
01..FF _ _ | 00..FF _ _ | Start fra den aktuelle position og flyt til højre, tegn så mange pixels som angivet i den første byte. Værdierne for pixels er taget fra den anden byte. I 8-bit BMP'er er hele byten en værdi. I 4-bit tages den højeste nibble fra den på skift, og derefter den laveste nibble (fire bits). |
00 | 00 | Flyt markøren til begyndelsen (længst til venstre) af den næste (øverste) vandrette. |
00 | 01 | Stop med at tegne (slut nået). |
00 | 02 | Flyt markøren til højre og op med værdierne angivet i de næste to bytes. Den første følgende byte indeholder værdien for det vandrette skift, og den næste byte indeholder værdien for det lodrette skift. Begge værdier: heltal uden fortegn (kan ikke flyttes til venstre eller ned). |
00 | 03..FF _ _ | Fra den aktuelle position og længere til højre skal du tegne pixels med de værdier, der kommer efter dette par af bytes. Den anden byte af kommandoen indeholder antallet af pixels, der skal males over (nemlig pixels, ikke bytes). I et 8-bit raster tages bytestrømmen som den er. I 4-bit læses nibbles allerede: de øverste 4 bits fra byten for den første pixel, de nederste 4 bits for den næste, og så videre fra efterfølgende bytes. Denne strøm kan ende med et ulige antal bytes, og instruktioner kræver 16-bit justering. Hvis dette sker, tilføjes en ekstra byte (dens indhold er ligegyldigt). |
Når højre kant af vandret nås, foretages der ingen oversættelse til den næste. Derfor skal du specifikt indsætte kommandoen for at afslutte rækken. Og som du kan se fra tabellen, tillader kommandosættet dig ikke at bevæge dig ned eller gå tilbage til vandret. Derfor kan du stoppe med at tegne, hvis den øverste kant nås.
Indlejring af data i JPEG- og PNG-formaterFra og med Windows 98/ME og 2000/XP giver systemfunktioner dig mulighed for at gemme pixels i JPEG- og PNG -formater . Intet er kendt om graden af understøttelse af disse to formater af systemet.
For at indlejre en JPEG eller PNG skal du nulstille feltet BitCount i BITMAPINFO og angive værdien 4 (BI_JPEG) eller 5 (PI_PNG) i komprimering. Værdien af feltet SizeImage vil i dette tilfælde være lig med størrelsen af JPEG- eller PNG-filen, der er indlejret i stedet for pixeldataene, som de er. Bredden og højden i overskriften er allerede angivet for det afkodede billede. Dokumentationen siger ikke direkte noget om fortegn for Højde-feltet for netop dette tilfælde, men det er tilsyneladende nødvendigt at nedskrive en negativ værdi [16] .
For at sammenligne dimensionsløse pixels med materialedimensioner bruges felterne XPelsPerMeter og YPelsPerMeter. I disse felter angiver et heltal, hvor mange pixels i dette billede, der falder på en lineær meter, separat vandret (XPelsPerMeter) og vertikalt (YPelsPerMeter). Microsoft erklærede disse to felter for at være en signeret numerisk type, men dokumentationen siger intet om negative værdier. Der siges heller ikke noget om værdien nul, men det er mere logisk at tage den for en ubestemt opløsning, når den er ukendt eller ikke har nogen værdi.
Opløsning er ofte angivet med henvisning ikke til metriske dimensioner, men i dots per inch ( DPI / PPI ). For oversættelse frem og tilbage tages en tomme svarende til 25,4 mm (engelsk tomme). Matematiske formler til konvertering af pixels/tommer (PPI) til pixels/meter (PPM) og omvendt:
Hvis du er interesseret i en nøjagtig heltalsoversættelse, kommer følgende udtryk ud:
PPM = (PPI * 5000 + 64) / 127 PPI = (PPM * 127 + 2500) / 5000Efter dem vil der blive afrundet til nærmeste heltal. Hvis du vil runde ned, så lad være med at tilføje halvdelen af divisoren. Hvis du vil op, så tilføj en divisor reduceret med én.
Nedenfor er de forudberegnede PPM-værdier for nogle PPI/DPI'er:
I informationsfelterne er hovedfeltet, der angiver farverum, feltet CSType. Dens tilladte værdier er vist i tabellen nedenfor:
Betyder | BITMAPINFO version [27] |
Konstant navn | Beskrivelse | |
---|---|---|---|---|
hex | Tekst | |||
0 | (Ingen) | fire | LCS_CALIBRATED_RGB | Justering baseret på Endpoints, GammaRed, GammaGreen og GammaBlue værdier. |
73524742 | 'sRGB' | fire | LCS_sRGB | sRGB -farverummet bruges . |
57696E20 | 'Vind' [28] | fire | LCS_WINDOWS_COLOR_SPACE | Standard systemplads (sRGB). |
4C494E4B | 'LINK' | 5 | PROFILE_LINKED | Farveprofil i en anden fil. |
4D424544 | 'MBED' | 5 | PROFILE_EMBEDDED | Farveprofilen inkluderet i denne fil. |
Microsoft erklærede værdierne af konstanterne ikke som numeriske værdier, men som fire-tegns tekstværdier [29] . I dette tilfælde danner tegnkoderne bytes af en 32-bit værdi (ASCII-koden for tegnet længst til højre er den lave byte, koden for tegnet længst til venstre er den høje byte). Når du ser det binære indhold af en fil som tekst, vil sådanne ASCII-kodede værdier blive vist baglæns (for eksempel "KNIL" i stedet for "LINK").
Slutpunkter og gammaværdierWindows Bitmap-formatet tillader farvekorrektion ved at angive røde, grønne og blå endepunkter samt gammaværdier . For at gøre dette skal CSType-feltet indeholde værdien 0 (LCS_CALIBRATED_RGB). De korrigerende værdier skrives til felterne Endpoints, GammaRed, GammaGreen og GammaBlue (for andre CSType-værdier ignoreres disse fire felter).
36-byte EndPoints-feltet er en CIEXYZTRIPLE-struktur, der består af tre felter ciexyzRed (rødt slutpunkt), ciexyzGreen (grønt punkt) og ciexyzBlue (blå). Disse tre felter er igen også CIEXYZ-strukturer med tre felter ciexyzX, ciexyzY og ciexyzZ af typen FXPT2DOT30. PXPT2DOT30 er et 32-bit usigneret fikspunktsnummer med 2 høje bits til heltalsdelen og 30 lave bits til brøkdelen.
Gammaværdien skrives til de tilsvarende felter for hver farvekanal separat: GammaRød (rød), GammaGrøn (grøn) og GammaBlå (blå). I erklæringen om informationsstrukturer specificerede Microsoft DWORD-typen for disse felter. Samtidig er der i WinGDI.h-filen en mere passende erklæring af typen FXPT16DOT16 (baseret på den lange type), som er et 32-bit usigneret tal med en brøkdel i de nederste 16 bit og et heltal del i de 16 højere. Det skal bemærkes, at i MSDN, på siderne om BITMAPV4HEADER- og BITMAPV5HEADER- strukturerne, er dette alt, hvad der er sagt. I artiklen om LOGCOLORSPACE-strukturen siges det, at den høje og lave byte skal sættes til nul i lignende felter (faktisk bruges i stedet for 16.16-formatet 8.8-formatet, som er placeret midt i en 32'er -bit celle) [30] .
Nedenfor er værdierne af de ovennævnte fire felter i henhold til sRGB [31] farverum :
Mark | Betyder | |
---|---|---|
Brøkdel | hex | |
EndPoints.ciexyzRed.ciexyzX | 0,64 | 28F5C28F |
EndPoints.ciexyzRed.ciexyzY | 0,33 | 151EB852 |
EndPoints.ciexyzRed.ciexyzZ | 0,03 | 01EB851F |
EndPoints.ciexyzGreen.ciexyzX | 0,30 | 13333333 |
EndPoints.ciexyzGreen.ciexyzY | 0,60 | 26666666 |
EndPoints.ciexyzGreen.ciexyzZ | 0,10 | 06666666 |
EndPoints.ciexyzBlue.ciexyzX | 0,15 | 0999999A |
EndPoints.ciexyzBlue.ciexyzY | 0,06 | 03D70A3D |
EndPoints.ciexyzBlue.ciexyzZ | 0,79 | 328F5C29 |
GammaRød GammaGrøn GammaBlå |
2,20 | 0002199A [32] |
I BMP-filen kan en farveprofil om nødvendigt angives enten ved direkte inkludering eller ved et link til en anden fil. Profiler dukkede op i den femte version af BMP, og indtil videre er der kun her felter, der er specielle for dem. Farveprofiler understøttes kun i ICC-format [33] [34] .
Når du bruger farveprofiler, skal du først angive følgende værdier for CSType-feltet:
Under alle omstændigheder specificerer ProfileData-feltet profilforskydningen i bytes fra begyndelsen af BITMAPINFO-blokken. Hvis profilen er indbygget, skal du i ProfileSize angive dens størrelse i bytes (hvis den kan tilsluttes, skal dette felt sættes til nul). Uanset varianten anbefaler Microsoft at placere profilen bag pixeldataene, når de er gemt i en fil, og umiddelbart efter overskriften [35] i RAM, når de interagerer med WinAPI-funktioner .
ICC-formatet bruger overvejende 32-bit celler eller multipla af denne cellestørrelse i sin header [36] . Baseret på dette, hvis profilen er direkte inkluderet i BMP, så anbefales det at gemme den i RAM på en adresse, der er et multiplum af fire bytes.
Når profilen er ekstern, i stedet for dens indhold, placeres en tekststreng med stien til filen i BMP. Det skal være i Windows 1252 single-byte-kodning (standardkodningen for vesteuropæiske sprog) og ende med en null-byte. Dokumentationen siger ikke noget om stikomponentseparatorer, og derfor kan du højst sandsynligt bruge både venstre skråstreger " \ " og "højre" "/" . Stien kan være både relativ og fuld og netværk [35] . Og da en enkelt-byte-kodning bruges til at angive stien, er det ikke nødvendigt at justere denne streng i RAM.
GengivelsespræferencerGengivelsespræferencer ( engelsk rendering intents ) blev introduceret af International Color Consortium (International Color Consortium) og bestemmer prioriteter i det tilfælde, hvor farverne, når man flytter fra et farveunderrum understøttet af en enhed ( engelsk gamut ) til et underrum i en anden brugt i billedet, mangler i målet. Der er også en definition fra ICC, som definerer gengivelsespræferencer som stilen til at kortlægge farveværdier fra en billedbeskrivelse til en anden (original på engelsk: "style of mapping farveværdier fra en billedbeskrivelse til en anden" ) [37 ] . Microsoft har inkluderet et særligt Intent-felt i BMP-formatet, som kan tage værdier helt i henhold til ICC-specifikationen. For mere information henvises der derfor til konsortiets dokumentation, hvis seneste version kan downloades fra color.org [38] . Hos Microsoft er disse præferencer kort beskrevet i artiklen Rendering Intents om MSDN.
Præferencen er angivet i Intent-feltet i BITMAPINFO-blokken og er kun tilgængelig med den 5. version af informationsfelterne. Værdierne kan være som følger:
Betyder | Konstant navn for BMP |
ICC navn |
Microsoft navn |
Konstant fra fil Icm.h |
Konstant for DEVMODE |
---|---|---|---|---|---|
en | LCS_GM_BUSINESS | mætning | Grafisk | INTENT_SATURATION(2) | DMICM_SATURATE(1) |
2 | LCS_GM_GRAPHICS | medierelativ kolorimetrisk | bevis | INTENT_RELATIVE_COLORIMETRIC(1) | DMICM_COLORIMETRIC(3) |
fire | LCS_GM_IMAGES | perceptuelle | billede | INTENT_PERCEPTUAL(0) | DMICM_CONTRAST(2) |
otte | LCS_GM_ABS_COLORIMETRIC | ICC-absolut kolorimetrisk (relativ kolometrisk) |
Match | INTENT_ABSOLUTE_COLORIMETRIC(3) | DMICM_ABS_COLORIMETRIC(4) |
Microsoft har erklæret mindst tre sæt konstanter for denne egenskab, som er forskellige i deres betydning og bruges forskellige steder [39] . Her er de, hvis du hurtigt skal sammenligne dem. Værdierne af konstanterne foran med "INTENT_" er nøjagtig de samme som dem, der bruges i ICC-profilfilerne [40] . Konstanterne foran med "DMICM_" er deklareret i filen WinGDI.h for DEVMODE-strukturen. "LCS_GM_" konstanterne, der bruges i BMP, er deklareret der og er primært beregnet til LOGCOLORSPACE strukturen. Der er også navne på printeregenskaber. De ligner dem i kolonnen "Microsoft Name", men med "Graphics" og "Pictures".
Standardværdien, som primært er egnet til fotos og billeder, kan være 4 (LCS_GM_IMAGES). Som sådan anbefales det af både Microsoft [41] og ICC [42] .
Følgende program åbner en 24-bit BMP-fil i et XWindow, farvedybden skal være 32-bit, men det virker ikke på en lavere farvegengivelse, da det komplicerer eksemplet:
/* Kompileret med linjen: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/keysym.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <math.h> #include "bitmap.h" /* BMP header definitioner her som beskrevet tidligere i denne artikel (strukturer skal være 2-byte pakket!) */ statisk XImage * CreateImageFromBuffer ( Display * , usigneret tegn * , int , int ); main ( int argc , char * argv []) { Display * dis ; Vindue vinder ; /* Vores vindue */ XEvent begivenhed ; /* Udviklingen */ GC gc ; /* Grafikkontekst */ XImage * billede ; int n , bredde , højde , fd , størrelse ; usigneret char * data ; BITMAPFILEHEADER bmp ; BITMAPINFOHEADER inf ; char * buf ; if ( arg < 2 ) { perror ( "brug: xtest fil.bmp \n " ); udgang ( 1 ); } if (( fd = åben ( argv [ 1 ], O_RDONLY )) == -1 ) { printf ( "Fejl ved åbning af bitmap \n " ); udgang ( 1 ); } læs ( fd , & bmp , sizeof ( BITMAPFILEHEADER )); læs ( fd , & inf , størrelse på ( BITMAPINFOHEADER )); bredde = inf . biWidth ; højde = inf . biHøjde ; if (( dis = XOpenDisplay ( getenv ( "DISPLAY" ))) == NULL ) { printf ( "Kan ikke oprette forbindelse til X-server:%s \n " , strerror ( errno )); udgang ( 1 ); } win = XCreateSimpleWindow ( dis , RootWindow ( dis , DefaultScreen ( dis )), 0 , 0 , width , height , 5 , BlackPixel ( dis , DefaultScreen ( dis )), WhitePixel ( dis , DefaultScreen ( dis ))); XSetStandardProperties ( dis , win , argv [ 1 ], argv [ 0 ], None , argv , argc , NULL ); gc = DefaultGC ( dis , DefaultScreen ( dis )); /* Nogle gange er dette sted ikke udfyldt i strukturen */ if ( inf . biSizeImage == 0 ) { /* Beregn størrelsen */ størrelse = bredde * 3 + bredde % 4 ; størrelse = størrelse * højde ; } andet { størrelse = inf . biSizeImage ; } buf = malloc ( størrelse ); if ( buf == NULL ) { perror ( "malloc" ); udgang ( 1 ); } printf ( "størrelse =%d bytes tildelt \n " , størrelse ); /* Flyt til begyndelsen af selve billedet */ lseek ( fd , bmp . bfOffBits , SEEK_SET ); /* Læs i buffer */ n = læst ( fd , buf , størrelse ); printf ( "størrelse =%d bytes læst \n " , n ); image = CreateImageFromBuffer ( dis , buf , width , height ); /* Slet bufferen - vi har ikke brug for den længere */ fri ( buf ); XMapWindow ( dis , vinde ); XSelectInput ( dis , win , ExposureMask | KeyPressMask ); mens ( 1 ) { XNextEvent ( dis , & begivenhed ); if ( hændelse . xany . vindue == vinde ) { switch ( hændelse . type ) { case Expose : XPutImage ( dis , win , gc , image , 0 , 0 , 0 , 0 , image -> width , image -> height ); bryde ; case Tastetryk : if ( XLookupKeysym ( & begivenhed . xkey , 0 ) == XK_q ) { XDestroyImage ( billede ); XCloseDisplay ( dis ); lukke ( fd ); exit ( EXIT_SUCCESS ); } bryde ; standard : bryde ; } } } } /* Opretter et Ximage fra en BMP-fil, da BMP-billedet er gemt på hovedet * og spejlsløjfe løser dette */ XImage * CreateImageFromBuffer ( Display * dis , usigneret char * buf , int width , int height ) { int dybde , skærm ; XImage * img = NULL ; int i , j ; int numBmpBytes ; størrelse_t antalImgBytes ; int32_t * imgBuf ; int ind = 0 ; int linje ; int temp ; int ih , iw ; /* Række- og kolonnenumre for at afspejle */ int ny_ind ; /* Nyt indeks */ skærm = DefaultScreen ( dis ); depth = DefaultDepth ( dis , skærm ); temp = bredde * 3 ; linje = temp + bredde % 4 ; /* Længde af streng inklusive justering */ numImgBytes = ( 4 * ( bredde * højde )); imgBuf = malloc ( antalImgBytes ); /* Størrelse tildelt for BMP i filen, inklusive justering */ numBmpBytes = linje * højde ; for ( i = 0 ; i < numBmpBytes ; i ++ ) { usigneret int r , g , b ; /* Spring over polstring */ if ( i >= temp && ( i % line ) >= temp ) fortsætte ; b = buf [ i ]; i ++ ; g = buf [ i ]; i ++ ; r = buf [ i ]; /* Beregn et nyt indeks til at afspejle lodret */ iw = ind % bredde ; ih = ind / bredde ; new_ind = iw + ( højde - ih - 1 ) * bredde ; imgBuf [ ny_ind ] = ( r | g << 8 | b << 16 ) << 8 ; ind ++ ; } img = XCreateImage ( dis , CopyFromParent , dybde , ZPixmap , 0 , ( char * ) imgBuf , width , height , 32 , 0 ); XInitImage ( img ); /* Rækkefølgen af bits og bytes på pc'en skal være som denne */ img -> byte_order = MSBFirst ; img -> bitmap_bit_order = MSBFirst ; returner img ; }Microsoft Windows SDK er et udviklersæt, der inkluderer hjælp og C++-filer. Om emnet for denne artikel er filerne WinGDI.h og Icm.h relevante, hvorfra værdierne af konstanterne blev taget i første omgang. Den seneste version af dette sæt kan downloades gratis fra Microsofts websted (version 6.0 og 7.1 blev brugt i denne artikel).
Microsoft har ikke særskilt specifik dokumentation specifikt til BMP-formatet. Men dens strukturer og andre elementer er beskrevet i GDI-undersystemet. Denne beskrivelse er i hjælpen, der er inkluderet i ovenstående SDK, og også på MSDN . Desuden er det i sidstnævnte til stede for forskellige platforme og uafhængigt i Visual Studio-hjælpen. I de fleste tilfælde er oplysningerne identiske, men nogle steder kan der være lidt flere fakta (f.eks. har SDK-hjælpen flere oplysninger om Windows-support).
For grundlæggende oplysninger, se GDI-hjælpen til Windows 9x- og NT-platformene. Links til sider i dette afsnit, der kun henviser til formatet og ikke til WinAPI-funktionerne til at arbejde med det:
Windows Compact 2013 (CE 6.0) og Mobile 6.5 platformene har kun beskrivelser af tre strukturer, men for disse platforme:
Links til andre sider fra MSDN relateret til BMP-formatet:
ICC-farvestyringsspecifikationen giver oplysninger om farveprofiler (inklusive ICC-filformatet) samt gengivelsespræferencer. Denne specifikation kan downloades fra den officielle hjemmeside for konsortiet color.org . I skrivende stund er den seneste version 4.3 (december 2010). Direkte links til PDF fra ICC's websted:
mediebeholdere | |
---|---|
Video/lyd | |
Lyd | |
musik |
|
Raster | |
Vektor | |
Kompleks |