Windowsin bittikartta | |
---|---|
Laajennus | .bmp[1] , [1] tai [1].dib.rle |
MIME -tyyppinen | kuva/bmp [2] [3] |
Kehittäjä | Microsoft [4] [5] |
Muototyyppi | rasterigrafiikka |
Mediatiedostot Wikimedia Commonsissa |
BMP ( englannista. B it m ap P icture ) on Microsoftin kehittämäbittikarttatallennusmuoto . BMP-muotoisilla tiedostoilla voi olla .bmp- , .dib- ja .rle-päätteet .
Valtava määrä ohjelmia toimii BMP-muodon kanssa, koska sen tuki on integroitu Windows- ja OS / 2 -käyttöjärjestelmiin . Lisäksi tämän muodon tiedot sisältyvät binaarisiin RES-resurssitiedostoihin ja PE-tiedostoihin .
Vain yksikerroksisia rastereita voidaan tallentaa tähän muotoon. Jokaisella eri tiedostojen pikselillä voi olla eri määrä bittejä (värisyvyys). Microsoft tarjoaa bittisyvyydet 1, 2, 4, 8, 16, 24, 32, 48 ja 64. Jos bittisyvyydet ovat 8 ja alle, väri ilmoitetaan väritaulukon (paletin) indeksillä ja suuremmilla suoralla arvolla. Joka tapauksessa väri voidaan määrittää vain RGB -värimallissa (sekä suoraan pikselissä määritettynä että väritaulukossa), mutta 16- ja 32-bittisinä saat harmaasävyn , jonka syvyys on jopa 16 ja 32. bittiä, vastaavasti. Osittainen läpinäkyvyys toteutetaan alfa-kanavalla , jonka bittisyvyydet ovat 16 bittiä tai enemmän.
Useimmissa tapauksissa pikselit tallennetaan suhteellisen yksinkertaisena kaksiulotteisena taulukkona. Bitisyvyyksille 4 ja 8 on saatavana RLE- koodaus, joka voi pienentää niiden kokoa. BMP-muoto tukee myös JPEG- ja PNG -tietojen upottamista . Mutta jälkimmäistä ei todennäköisemmin ole tarkoitettu kompaktiin tallennustilaan, vaan se ohittaa GDI -arkkitehtuurin rajoitukset , sillä se ei mahdollista suoraa työtä muiden kuvien kuin BMP-muotojen kanssa. BMP-muodon uusimmat versiot esittelivät myös värinhallintaominaisuudet. Erityisesti voit määrittää päätepisteitä, suorittaa gammakorjauksen ja upottaa ICC-väriprofiileja.
Käytettäessä DIB ( Device Independent Bitmap ) -muotoa ohjelmoija voi käyttää kaikkia kuvaa kuvaavien rakenteiden elementtejä tavallisella osoittimella. Mutta näitä tietoja ei käytetä suoraan näytön ohjaukseen, koska ne tallennetaan aina järjestelmän muistiin, ei erilliseen videomuistiin . RAM - muistin pikselimuoto voi poiketa videomuistiin tallennettavasta muodosta, joka osoittaa samanvärisen pisteen. Esimerkiksi DIB-muoto voi käyttää 24 bittiä pikselin määrittämiseen , ja grafiikkasovitin voi tällä hetkellä toimia HiColor- tilassa 16 bitin värisyvyydellä. Tässä tapauksessa kirkkaan punainen piste laitteistosta riippumattomassa muodossa määritellään kolmella tavulla 0000FF 16 ja videomuistissa sanalla F800 16 . Kun kopioidaan kuvaa näytölle, järjestelmä käyttää lisäaikaa värikoodien muuntamiseen 24-bittisestä videopuskurimuotoon .
DDB ( Device Dependent Bitmap ) -muoto sisältää aina värikoodeja, jotka vastaavat videopuskurikoodeja , mutta se voidaan tallentaa sekä järjestelmä- että videomuistiin. Molemmissa tapauksissa se sisältää vain värikoodeja muodossa, joka varmistaa kuvan siirtämisen RAM -muistista videomuistiin yksinkertaisella kopioinnilla [6] .
Virallisia tietoja BMP-muodosta löytyy MSDN :stä tai Microsoft Windows SDK:n ohjeesta (voi olla mukana joidenkin IDE:iden kanssa). Microsoftin WinGDI.h-tiedostossa on kaikki tämän muodon C++- ilmoitukset. Tämä artikkeli ei kuitenkaan sisältänyt tyyppimäärityksiä, koska se voi tehdä siitä liian hankalaa. Lisäksi jotkut kehittäjät saattavat kokea viralliset ilmoitukset hankalia ja siksi niiden relevanssi on kyseenalainen. Jos tarvitset vakioiden, rakenteiden, tyyppien ja niiden kenttien alkuperäiset nimet, ne ovat kaikki tämän artikkelin tekstissä.
Jakamattomien solujen enimmäiskoko (pois lukien bittirakenteiden kentät): 32 bittiä ja siksi formaatti voidaan luokitella 32 bitiksi. Poikkeuksena voivat olla 64-bittiset pikselit, mutta niiden kanavaarvoja voidaan käsitellä myös 16-bittisillä sanoilla. Tavujen järjestys 16- ja 32-bittisissä soluissa on kaikkialla matalasta korkeaan (little-endian). Kokonaisluvut kirjoitetaan suoralla koodilla , johon on lisätty sisäänkirjautuminen . Verrattuna laitteistoarkkitehtuureihin tavujärjestys ja numeromuoto vastaavat x86 .
Tässä artikkelissa käytetään WinAPI -tyyppien nimiä kuten Microsoftin ohjeissa tyyppien määrittämiseen. Tiettyjen (jotka kuvataan erikseen artikkelin tekstissä) lisäksi löytyy neljä numeerista tyyppiä:
Windows Bitmap -muodossa rakenteet ymmärretään lohkoksi, jossa on peräkkäisiä erikokoisia soluja, joilla on ehdolliset nimet (niitä on monissa ohjelmointikielissä), eikä jotain monimutkaisempaa (esimerkiksi mielivaltaisen kokoinen komentovirta).
Joillakin muotoelementeillä on Windows-versio, josta alkaen sitä tuetaan. Puhumme ensisijaisesti tärkeimmistä WinAPI-kirjastoista, kuten gdi32.dll, shell32.dll, user32.dll ja kernel32.dll. Muilla käyttöjärjestelmän komponenteilla (esim. GDI+, .NET, DirectX) voi olla muita, kehittyneempiä ominaisuuksia.
BMP-muodossa oleva data koostuu kolmesta erikokoisesta päälohkosta:
Kun tiedosto tallennetaan, kaikki otsikot tulevat ensimmäisestä tavusta. Pikselidata voi sijaita mielivaltaisessa paikassa tiedostossa (se määritetään BITMAPFILEHEADER-rakenteen OffBits-kentässä), mukaan lukien etäisyys otsikoista. Valinnainen väriprofiili ilmestyi versiossa 5 ja se on myös vapaasti asemoitavissa, mutta sen sijainti määritetään BITMAPINFO:n alusta (Profiilitiedot-kentässä).
RAM-muistissa (esimerkiksi vuorovaikutuksessa GDI WinAPI -toimintojen kanssa) BITMAPFILEHEADER-rakenne jätetään pois otsikoista. Samaan aikaan Microsoft suosittelee väriprofiilin sijoittamista heti otsikoiden jälkeen yhteen lohkoon [7] . Pikselitiedoilla voi olla mielivaltainen paikka muistissa ja niiden osoite on määritelty prosessiparametreissa. Joka tapauksessa on suositeltavaa säilyttää kaikki lohkot muistissa neljällä jaollisissa osoitteissa: otsikoissa on 32-bittisiä soluja, ja tällainen pikselitiedon vaatimus on määritelty dokumentaatiossa [8] . Tämä vaatimus koskee vain RAM-muistia: kun se tallennetaan tiedostoon, sitä ei tarvitse noudattaa.
BITMAPFILEHEADER on 14-tavuinen rakenne, joka sijaitsee aivan tiedoston alussa. Huomaa, että rakenteen alusta lähtien solujen kohdistus menetetään. Jos se on sinulle tärkeää, sijoita tämä otsikko RAM-muistiin parillisiin osoitteisiin, jotka eivät ole neljän kerrannainen (silloin 32-bittiset solut putoavat tasattuihin paikkoihin).
Pos. (heksa) |
Koko (tavua) |
Nimi | WinAPI-tyyppi | Kuvaus |
---|---|---|---|---|
00 | 2 | bfType | SANA | Merkki, joka erottaa muodon muista (muodon allekirjoitus). Saattaa sisältää yksittäisen arvon 4D42 16 / 424D 16 (little-endian/big-endian). |
02 | neljä | bfSize | DWORD | Tiedoston koko tavuina. |
06 | 2 | bfVarattu1 | SANA | Varattu ja sen on oltava nolla. |
08 | 2 | bfReserved2 | SANA | |
0A | neljä | bfOffBits | DWORD | Pikselitietojen sijainti suhteessa tämän rakenteen alkuun (tavuina). |
Muoto-allekirjoitus, kun tarkastellaan tiedoston sisältöä tekstinä binääritilassa, näyttää ASCII-merkkiparilta "BM".
BITMAPINFO tulee heti tiedoston BITMAPFILEHEADER jälkeen. Tämän muistissa olevan lohkon osoite välitetään myös suoraan joillekin WinAPI-funktioille (esimerkiksi SetDIBitsToDevice tai CreateDIBitmap). Lisäksi samaa lohkoa käytetään Windowsin kuvake- ja kohdistinmuodoissa, mutta tätä kohtaa ei käsitellä tässä artikkelissa (katso näiden muotojen erilliset kuvaukset). Tämä rakenne on perus- ja kuvaava BMP-muodossa, joten kun kentän nimi yksinkertaisesti mainitaan, se on kenttä tässä rakenteessa.
BITMAPINFO-lohko koostuu kolmesta osasta:
Tietoja bitimaskeista ja väritaulukosta, katso alla erillisissä osioissa. Tästä seuraa rakenteen kuvaus tietokenttineen.
Tätä artikkelia kirjoitettaessa tietokenttiä sisältävällä rakenteella oli neljä versiota [9] : CORE, 3, 4 ja 5 (versioiden nimet ovat ehdollisia tässä artikkelissa lyhyyden vuoksi). Microsoft on ilmoittanut jokaiselle versiolle neljä erillistä rakennetta eri kenttien nimillä. Tässä artikkelissa mainittaessa kenttä, joka esiintyy useissa rakenteissa, kaikille rakenteille yhteinen osa otetaan nimen loppuun (esimerkiksi BitCount eikä bcBitCount, biBitCount, bV4BitCount tai bV5BitCount). Rakenneversio voidaan määrittää ensimmäisellä 32-bittisellä solulla (WinAPI DWORD-tyyppi), joka sisältää koon tavuina (etumerkitön kokonaisluku). CORE-versio eroaa kaikista kompaktiudellaan ja yksinomaan 16-bittisten allekirjoittamattomien kenttien käytöllä. Loput kolme sisältävät identtisiä soluja, joihin lisättiin uusia jokaisessa uudessa versiossa.
Alla on yleiskatsaus tietorakenteista:
Versio | Koko (tavua) |
Rakenteen nimi | Windows 9x / NT- versio [10] | Windows CE / Mobile -versio [11] | Huomautuksia |
---|---|---|---|---|---|
YDIN | 12 | BITMAPCOREHEADER | 95/NT 3.1 ja vanhempi | CE 2.0/Mobile 5.0 ja uudemmat | Sisältää vain rasterin leveyden, korkeuden ja bittisyvyyden. |
3 | 40 | BITMAPINFOHEADER | 95/NT 3.1 ja vanhempi | CE 1.0/Mobile 5.0 ja uudemmat | Sisältää rasterin leveyden, korkeuden ja bittisyvyyden sekä pikselimuodon, väritaulukon ja tarkkuustiedot. |
neljä | 108 | BITMAPV4HEADER | 95/NT 4.0 ja vanhempi | ei tueta | Erikseen valitut kanavamaskit, lisätty tietoa väriavaruudesta ja gammasta. |
5 | 124 | BITMAPV5HEADER | 98/2000 ja sitä vanhempia | ei tueta | Lisätty asetusten näyttöstrategia ja tuki ICC-profiileille. |
Versioiden 3, 4 ja 5 kenttien identiteetin vuoksi saattaa vaikuttaa siltä, että Koko-kenttä voi hallita kenttien määrää ja poistaa käyttämättömät. Itse asiassa tämä ei ole oikein, koska tässä koolla on version rooli (CORE-versiossa, vaikka kentät ovat myös identtisiä, mutta eri kokoisia ja tyyppisiä). Kukaan ei takaa, että et saa pienempiä tai suurempia otsikoita erilaisilla kentillä. Adobe Photoshop voi kuitenkin tallentaa 52- ja 56-tavuisia tietokenttärakenteita tallentaessaan BMP-tiedostoja. Itse asiassa tämä on katkaistu 4. versio, joka sisältää vain kanavien bitimaskit (56 tavua - alfakanavainen versio).
16-bittiset tietokentät (CORE-versio)Huomaa, että tässä leveys- ja korkeuskentät sisältävät etumerkittömiä kokonaislukuja, kun taas 32-bittiset rakenteet tallentavat etumerkityt arvot.
Sijainti tiedostossa (heksa) |
Sijainti rakenteessa (heksa) |
Koko (tavua) |
Nimi | WinAPI-tyyppi | Kuvaus |
---|---|---|---|---|---|
0E | 00 | neljä | bcSize | DWORD | Tämän rakenteen koko tavuina, joka kertoo myös rakenteen version (tämän tulee olla 12). |
12 | 04 | 2 | bcWidth | SANA | Rasterin leveys (bcWidth) ja korkeus (bcHeight) pikseleinä. Määritetty etumerkittömänä kokonaislukuna. Arvoa 0 ei ole dokumentoitu. |
neljätoista | 06 | 2 | bcKorkeus | SANA | |
16 | 08 | 2 | bcPlanes | SANA | Ainoa kelvollinen arvo BMP:ssä on 1. Tätä kenttää käytetään Windowsin kuvakkeissa ja kohdistimissa. |
kahdeksantoista | 0A | 2 | bcBitCount | SANA | Bittien määrä pikseliä kohden (katso tuettujen bittien luettelo erillisessä osiossa alla). |
Alla oleva taulukko tarjoaa yleiskatsauksen kentistä. Löydät yksityiskohtaiset tiedot alla olevista osioista.
Sijainti tiedostossa (heksa) |
Sijainti rakenteessa (heksa) |
Koko (tavua) |
Nimi (versiot 3/4/5) |
WinAPI-tyyppi | Kuvaus |
---|---|---|---|---|---|
0E | 00 | neljä | biSize bV4Size bV5Size |
DWORD | Tämän rakenteen koko tavuina, joka kertoo myös rakenteen version (katso versiotaulukko yllä). |
12 | 04 | neljä | biWidth bV4Width bV5Width |
PITKÄ | Rasterin leveys pikseleinä. Määritetty etumerkillisenä kokonaislukuna. Nollaa ja negatiivista ei ole dokumentoitu. |
16 | 08 | neljä | biHeight bV4Height bV5Height |
PITKÄ | Etumerkillinen kokonaisluku, joka sisältää kaksi parametria: rasterin korkeuden pikseleinä (luvun itseisarvo) ja järjestyksen, jossa merkkijonot esiintyvät kaksiulotteisissa taulukoissa (luvun etumerkki). Nolla-arvoa ei ole dokumentoitu. |
1A | 0C | 2 | biPlanes bV4Planes bV5Planes |
SANA | Ainoa kelvollinen arvo BMP:ssä on 1. Tätä kenttää käytetään Windowsin kuvakkeissa ja kohdistimissa. |
1C | 0E | 2 | biBitCount bV4BitCount bV5BitCount |
SANA | Bittien määrä pikseliä kohden (katso tuettujen bittien luettelo erillisessä osiossa alla ). |
1E | kymmenen | neljä | biCompression bV4V4Compression [12] bV5Compression |
DWORD | Määrittää, kuinka pikselit tallennetaan (katso alla oleva kohta ). |
22 | neljätoista | neljä | biSizeImage bV4SizeImage bV5SizeImage |
DWORD | Pikselitietojen koko tavuina. Voidaan asettaa nollaan, jos tallennustila on kaksiulotteinen matriisi. |
26 | kahdeksantoista | neljä | biXPelsPerMeter bV4XPelsPerMeter bV5XPelsPerMeter |
PITKÄ | Pikselien määrä metriä kohti vaaka- ja pystysuunnassa (katso tämän artikkelin " Kuvan tarkkuus " -osio). |
2A | 1C | neljä | biYPelsPerMeter bV4YPelsPerMeter bV5YPelsPerMeter |
PITKÄ | |
2E | kaksikymmentä | neljä | biClrUsed bV4ClrUsed bV5ClrUsed |
DWORD | Väritaulukon koko soluissa. |
32 | 24 | neljä | biClrImportant bV4ClrImportant bV5ClrImportant |
DWORD | Solujen lukumäärä väritaulukon alusta viimeiseen käytettyyn soluun (mukaan lukien itse). |
Lisätty versioon 4 | |||||
Sijainti tiedostossa (heksa) |
Sijainti rakenteessa (heksa) |
Koko (tavua) |
Nimi (versiot 4/5) |
WinAPI-tyyppi | Kuvaus |
36 | 28 | neljä | bV4RedMask bV5RedMask |
DWORD | Bittimaskit kanavaarvojen poimimiseen : punainen, vihreä, sininen intensiteetti ja alfakanavan arvo. |
3A | 2C | neljä | bV4GreenMask bV5GreenMask |
DWORD | |
3E | kolmekymmentä | neljä | bV4BlueMask bV5BlueMask |
DWORD | |
42 | 34 | neljä | bV4AlphaMask bV5AlphaMask |
DWORD | |
46 | 38 | neljä | bV4CSType bV5CSType |
DWORD | Eräänlainen väriavaruus . |
4A | 3C | 36 | bV4Endpoints bV5Endpoints |
CIEXYZTRIPLE | Näiden neljän kentän arvo otetaan huomioon vain, jos CSType-kenttä sisältää 0 (LCS_CALIBRATED_RGB). Sitten näissä kentissä määritetään kolmen värikomponentin päätepisteet ja gamma-arvot . |
6E | 60 | neljä | bV4GammaRed bV5GammaRed |
DWORD [13] | |
72 | 64 | neljä | bV4GammaGreen bV5GammaGreen |
DWORD [13] | |
76 | 68 | neljä | bV4GammaBlue bV5GammaBlue |
DWORD [13] | |
Lisätty versioon 5 | |||||
Sijainti tiedostossa (heksa) |
Sijainti rakenteessa (heksa) |
Koko (tavua) |
Nimi | WinAPI-tyyppi | Kuvaus |
7A | 6C | neljä | bV5Intent | DWORD | Raster renderöintiasetukset . |
7E | 70 | neljä | bV5ProfileData | DWORD | Väriprofiilin tavupoikkeama BITMAPINFO:n alusta (katso myös Väriprofiili- osio myöhemmin tässä artikkelissa). |
82 | 74 | neljä | bV5ProfileSize | DWORD | Jos väriprofiili sisältyy suoraan BMP:hen, sen koko tavuina ilmoitetaan tässä. |
86 | 78 | neljä | bV5 Varattu | DWORD | Varattu ja se on asetettava nollaan. |
BitCount-kenttä sisältää bittien määrän pikseliä kohden. Jos siellä ilmoitetaan nollasta poikkeava arvo, tämä on todellinen bittisyvyys. BitCount-kentän nollasisältö ilmoitetaan, jos pikselit on tallennettu JPEG- tai PNG-muodossa. Sitten todellinen bittisyvyys määräytyy näiden formaattien mukaan. Puhtaan BMP-muodon bitit on esitetty alla olevassa taulukossa:
Bitti | Tavu | BITIMAPINFO | RLE | Kanavan maskit | Ohjelmistotuki | ||||
---|---|---|---|---|---|---|---|---|---|
YDIN | 3, 4, 5 | Windows 9x ja NT | Windows CE ja Mobile | GDI+ ja .NET | |||||
yksi | ⅛ | Joo | Joo | Ei | Ei | Joo | Joo | Joo | |
2 | ¼ | Joo | Joo | Ei | Ei | Ei | Joo | Ei | |
neljä | ½ | Joo | Joo | Joo | Ei | Joo | Joo | Joo | |
kahdeksan | yksi | Joo | Joo | Joo | Ei | Joo | Joo | Joo | |
16 | 2 | Ei | Joo | Ei | Joo | Joo | Joo | Joo | |
24 | 3 | Joo | Joo | Ei | Ei | Joo | Joo | Joo | |
32 | neljä | Ei | Joo | Ei | Joo | Joo | Joo | Joo | |
48 | 6 | Ei | Joo | Ei | Ei | Ei | Ei | Joo | |
64 | kahdeksan | Ei | Joo | Ei | Ei | Ei | Ei | Joo |
Huomautuksia taulukkoon:
1. "BITMAPINFO"-sarake näyttää bittisyvyyden tuen vain Microsoftilta.
2. Windows CE 1.0 ja 1.01 tukevat vain bittisyvyyttä 1 ja 2 [14] .
3. GDI+ versio 1.0 16-bittisiä värikanavia voidaan vain lukea, jolloin ne muunnetaan välittömästi 8-bittisiksi [15] .
Kun bittisyvyys on 8 ja sitä pienempi, pikselin väri ilmaistaan väritaulukon indeksillä, korkeammissa biteissa: suoralla arvolla RGB -värimallissa . Alfa-kanava voidaan valinnaisesti lisätä 16- ja 32-bittisenä, 64-bittisenä se on jatkuvasti läsnä.
Taulukossa näkyy vain bittimäärä, jonka Microsoft on dokumentoinut. Formaatti itsessään ei sisällä mitään perustavanlaatuisia rajoituksia minkään tässä mainitsemattoman bittien käytölle.
1-bittisiä BMP-tiedostoja, joissa on puhdas musta (bitti pois) ja valkoinen (bitti päällä), kutsutaan yksivärisiksi. Tällaisia tiedostoja käytetään yleensä muiden bittikarttojen peitteinä. Ehkä törmäsit jatkuvasti juuri sellaisiin 1-bittisiin rastereihin. Itse asiassa Windowsin bittikarttamuoto ei aseta rajoituksia kullekin bittiarvolle käytettävälle värille.
Saatat myös törmätä seuraaviin bittinimiin: CGA kahdelle bitille, EGA neljälle, HiColor (HighColor) 16 bitille, TrueColor 24 ja 32 bitille läpikuultavalla bitillä, DeepColor korkeille biteille ja mahdollisesti muita. Nämä nimet juontavat juurensa väribittikarttanäyttöjen kehitykseen ja viittaavat enemmän niiden värisyvyyteen . Tämän artikkelin kirjoitushetkellä (2014) tällaisia nimiä ei ole käytetty pitkään aikaan 24-bittisten laitteiden suuren yleisyyden vuoksi (sen sijaan värisyvyys bitteinä tai niiden lukumäärä ilmoitetaan yksinkertaisesti). Ja pienemmällä bittimäärällä olevia BMP-tiedostoja ei tallenneta suuremmassa määrin näyttöä varten CGA- tai EGA-laitteissa, vaan kompaktimmaksi verrattuna 24- ja 32-bittisiin muotoihin, jos käytetään vähän värejä.
Jokaiselle bittiryhmälle käytetään erillisiä rajoitettuja pakkausarvoja, mutta yhdessä niiden arvot ovat ainutlaatuisia. Microsoft on dokumentoinut seuraavat arvot (taulukossa luetellaan tämän yrityksen vakioiden nimet):
Merkitys | Jatkuva nimi | Koskee BitCountia |
Pikselin tallennustila | Korkeuden merkki | Windows-versio | |
---|---|---|---|---|---|---|
9x/NT | CE | |||||
0 | BI_RGB | mikä tahansa paitsi nolla | kaksiulotteinen matriisi | +/− | 95/NT3.1 | CE 1.0 |
yksi | BI_RLE8 | kahdeksan | RLE-koodaus | + | 95/NT3.1 | (ei ala.) |
2 | BI_RLE4 | neljä | RLE-koodaus | + | 95/NT3.1 | (ei ala.) |
3 | BI_BITFIELDS | 16 ja 32 | 2D-taulukko värikanavamaskeilla | +/− | 95/NT3.1 | CE 2.0 |
neljä | BI_JPEG | 0 | upotetussa jpeg-tiedostossa | ?/− [16] | 98/2000 | (ei ala.) |
5 | BI_PNG | 0 | upotetussa PNG-tiedostossa | ?/− [16] | 98/2000 | (ei ala.) |
6 | BI_ALPHABITFIELDS | 16 ja 32 | 2D-taulukko väri- ja alfakanavamaskeilla | +/− | (ei ala.) | .NET 4.0 |
Väritaulukko on osa BITMAPINFO-lohkoa ja sitä voidaan käyttää kahdella tavalla:
Väritaulukon sijainti määritetään sen BITMAPINFO-lohkon alusta alkaen. Oletusarvoisesti se tulee heti tietorakenteen jälkeen (sen etumerkitön koko tavuina voidaan lukea ensimmäisestä 32-bittisestä kentästä). Mutta kentät sisältävän rakenteen ja väritaulukon välillä voidaan käyttää nelitavuisia bitimaskeja värikanavien poimimiseen (koskee vain 16 ja 32 bittiä). Ne ovat olemassa vain, jos käytetään tietorakenteen versiota 3 (koko = 40) ja pakkauskenttä sisältää 3 (BI_BITFIELDS) tai 6 (BI_ALPHABITFIELDS). Sitten tietokenttien kokoon on lisättävä 12 tavua (jos BI_BITFIELDS on määritetty) tai 16 tavua (jos BI_ALPHABITFIELDS on määritetty) [17] . Osoittautuu 6 vaihtoehtoa pöydän sijainnille:
Otsikkoversio _ |
Sijainti (heksa) | Huomautuksia | |
---|---|---|---|
Tiedostossa | BITMAPINFOssa | ||
YDIN | 1A | 0C | kanavamaskeja ei tueta |
3 | 36 | 28 | Pakkaus ei sisällä 3 tai 6 |
42 | 34 | Pakkaus = 3 (BI_BITFIELDS) | |
46 | 38 | Pakkaus = 6 (BI_ALPHABITFIELDS) | |
neljä | 7A | 6C | kanavamaskit on upotettu tietokenttiin |
5 | 8A | 7B |
Taulukon solujen lukumäärä määräytyy kenttien BitCount ja ClrUsed mukaan. Kun bittisyvyydet ovat 8 tai vähemmän, taulukon solujen enimmäismääräksi otetaan 2 bittiä : 2 yksibittisessä rasterissa, 4 kaksibittisessä rasterissa, 16 4-bittisessä ja 256 8-bitissä. -pala yksi. Annetussa bittimäärässä taulukko sisältää aina tämän enimmäismäärän soluja, jos käytetään CORE-version otsikkoa (Size = 12) tai jos ClrUsed-kentässä on muissa versioissa 0. Kaikissa muissa tapauksissa, bittimäärästä riippumatta, taulukko sisältää niin monta solua kuin on määritetty kentässä ClrUsed [18] .
Taulukko itsessään on yksiulotteinen taulukko, joka voi sisältää kolmenlaisia soluja:
Kaikkia soluja ei saa käyttää koko taulukossa, ja ClrImportant-kenttä sisältää solujen lukumäärän taulukon alusta viimeiseen käytettyyn soluun (mukaan lukien itsensä). Arvo 0 ClrImportant-kentässä osoittaa, että koko taulukko on käytössä. On parempi sijoittaa kyseiset solut aivan taulukon alkuun ja on suositeltavaa lajitella ne tärkeysjärjestykseen (jos joudut vähentämään niiden määrää).
Jos kuva on 16- tai 32-bittinen, voidaan määrittää 32-bittiset maskit värikanavien poimimiseksi. Tämä johtuu siitä, että 16 ei ole 3:n kerrannainen ja siksi bitit voidaan allokoida eri tavoin. Mukavuuden vuoksi 32-bittiset kuvat käyttävät 8-bittisiä kanavia, ja siksi niiden tuki saattaa tuntua tarpeettomalta. Itse asiassa tässä maski mahdollistaa alfa-kanavan käyttöönoton / poistamisen käytöstä tai sinulle sopivan komponenttien järjestyksen asettamisen, eikä vain säädä niiden resoluutiota. Maskeja käytettäessä pikselisolu luetaan kokonaisuudessaan vastaavana konesanana little-endianissa.
Bittimaskien olemassaolo riippuu BITMAPINFO-rakenteen tietokenttien ja siinä olevan pakkauskentän versiosta. CORE-versiolle ei voi määrittää mielivaltaisia maskeja, koska pakkauskenttää ja erillisiä maskikenttiä ei ole. Muissa versioissa värimaskit ovat käytössä, jos pakkaus sisältää 3 (BI_BITFIELDS). Alfakanavamaskia käytetään aina versioissa 4 ja 5. Koska Windows CE ei tue näitä kahta versiota, joissa sille on erityinen kenttä, pakkauksen arvo 6 (BI_ALPHABITFIELDS) otettiin käyttöön kolmannelle versiolle, joka lisää sekä värimaskit että maskin alfakanavan (tuettu Windows CE .NET 4.0:sta lähtien).
Bittimaskien sijainti on kiinteä otsikkoversiosta riippumatta: 36 h koko tiedostossa tai 28 h BITMAPINFO-lohkon alusta. Versioissa 4 ja 5 erityisesti niille suunnitellut kentät sijaitsevat tässä paikassa. Versiossa 3 bitimaskit tulisi sijoittaa välittömästi tietokenttien jälkeen ja siten ne osuvat täsmälleen vastaavien kenttien paikkoihin vanhemmissa versioissa. Huomaa, että kolmannessa versiossa, jos maskeja on, väritaulukkoa siirretään 12 tai 16 tavua eteenpäin heti niiden jälkeen. 4-tavuiset värinaamarit ovat järjestyksessä punainen, vihreä, sininen. Alfakanavamaski on jo niiden takana.
Microsoftin dokumentaatio koskee vain yhtä pakollista vaatimusta bitmaskeille: jokaisen maskin on oltava vierekkäinen. Naamarien leikkaustapauksesta siellä sanotaan, että tätä ei kannata tehdä [19] . Microsoft sanoo myös, että ei ole välttämätöntä käyttää kaikkia pikselin bittejä [20] . Käyttämättömien bittien sisällölle ei ole vaatimuksia.
Huomaa, että kukaan ei takaa, että yli 8 bitin peitteitä voidaan käyttää. Eikä mitään sanota tapauksesta, jossa millä tahansa kanavalla on nollamaski (esimerkiksi kun sitä ei todellakaan käytetä). Tässä on mahdollista tilanne, jossa kaikilla komponenteilla on nolla maskia ja yksi alfakanava jää jäljelle (joka tässä tapauksessa voi varata kaikki bitit). Värikanavan nollamaski voidaan tulkita kahdella tavalla: sen arvoksi otetaan nolla tai piirtäminen ei vaikuta tämän kanavan pikseleihin. Jos otamme ensimmäisen tulkinnan yhdellä alfa-kanavalla, niin alfa-kanava määrittää olennaisesti pikselin tummenemisasteen. Epämääräisten vaihtoehtojen lisäksi on myös mielenkiintoinen. Koska risteykset eivät ole kiellettyjä, on mahdollista asettaa kaikki kanavat yhteen paikkaan ja siten saada harmaasävy .
Joillakin ohjelmistoilla on rajoitettu joukko tuettuja bitimaskeja. Alla olevassa taulukossa on lueteltu näissä rajoitetuissa ympäristöissä käytettävissä olevat vaihtoehdot:
Bitness | * | Maskiarvot (heksadesimaali) | Ohjelmistotuki | |||||
---|---|---|---|---|---|---|---|---|
Punainen | Vihreä | Sininen | Alpha | Käyttämätön | Windows 9x [21] | GDI+ [22] ja .NET [23] | ||
16 | (a) | 7C00 | 03E0 | 001F | 0000 | 8000 | Joo | Joo |
7C00 | 03E0 | 001F | 8000 | 0000 | Ei | Joo | ||
F800 | 07E0 | 001F | 0000 | 0000 | Joo | Joo | ||
(b) | FFFF | FFFF | FFFF | 0000 | 0000 | Ei | Joo | |
32 | (a) | 00FF:0000 | 0000:FF00 | 0000:00FF | 0000:0000 | FF00:0000 | Joo | Joo |
00FF:0000 | 0000:FF00 | 0000:00FF | FF00:0000 | 0000:0000 | Ei | Joo |
Taulukon huomautukset:
(a) Näitä joukkoja käytetään oletusarvoisesti 16 ja 32 bittinä, jos värinpoistomaskeja ei ole määritetty.
(b) Tämä maskisarja toteuttaa luonnostaan 16-bittisen harmaasävyn.
Tiedostossa pikselitietojen sijainti löytyy BITMAPFILEHEADER-rakenteen OffBits-kentästä. Ajon aikana sovellus tallentaa pikselitietojen osoitteen sinne, missä se on kätevää. Microsoftin dokumentaatiossa mainitaan myös niin sanotut pakatut bittikartat , jotka ilmaistaan yhdellä BITMAPINFO-lohkon osoitteella. Tällaisissa bittikartoissa pikselidata seuraa välittömästi otsikkoa (sisältäen tietokenttien lisäksi bitimaskit ja väritaulukon) [24] .
Pikselitietojen koko tavuina tallennetaan BITMAPINFO-rakenteen SizeImage-kenttään. Sinne kirjoitetaan sen jatkuvan lohkon "raaka" koko, joka sisältää dataa pikselien muodostusta varten (muodosta riippumatta), eikä jotain pakkaamatonta. Oletuksena tämän kentän tulee sisältää nykyinen arvo, koska sen avulla voidaan selvittää tarkalleen kuinka monta tavua tiedostosta tulee lukea pikselien saamiseksi. Tämä kenttä on kuitenkin laillista pitää nollana tallennettaessa pikseleitä kaksiulotteisina taulukoina (kun pakkauskenttä sisältää arvon 0 (BI_RGB), 3 (BI_BITFIELDS) tai 6 (BI_ALPHABITFIELDS) [25] ). Tällöin pikselien koko voidaan tarvittaessa laskea suhteellisen nopeasti rasterin bittisyvyyden, leveyden ja korkeuden perusteella.
On kolme tapaa tallentaa pikseleitä Windowsin bittikarttamuodossa (katso myös tämän artikkelin Pakkauskenttä -osio ):
Alla olevissa alaosissa kuvataan jokainen niistä erikseen.
Alfa-kanavan värin ja arvon määrittäminenBMP-muodossa tallennetun värin määrittämiseen käytetään vain etumerkittömiä kokonaislukuja riippumatta siitä, miten se on määritetty. Itse pikselin väri voidaan asettaa kahdella tavalla:
Toinen on hyödyllinen, kun värisarja on melko suuri tai arvaamaton (esimerkiksi kuvankäsittelyn aikana). Ensimmäinen menetelmä tarjoaa sekä kompaktin asettelun pienellä joukolla värejä että jonkin verran mukavuutta käytettyjen värien hallinnassa (muuta vain väriarvoa paletissa). Itse väritaulukko määritellään joko 16-bittisinä etumerkittöminä indekseinä järjestelmäpaletissa (katso tämän artikkelin "Väritaulukko " -osio ) tai RGB-muodossa pikselinä, mutta yksinomaan 8-bittisillä kanavaarvoilla.
Väritaulukon indeksi on siinä oleva solunumero taulukon alusta alkaen (käytetään jatkuvaa nollasta alkavaa numerointia). Kunkin bittisyvyyden maksimiindeksiä rajoittaa pohjimmiltaan arvo 2 bitin syvyys - 1. Todellisuudessa sitä rajoittaa myös taulukon elementtien määrä (yksityiskohdat tämän artikkelin " Väritaulukko " -osiossa). Microsoft ei ole dokumentoinut toimintaa, kun taulukon ulkopuolella oleva indeksi on määritetty, mutta GDI on tässä tapauksessa musta.
Yli 8 bittisyvyydessä pikselin väri näkyy suoraan RGB-värimallissa: punaisen, vihreän ja sinisen taso ilmoitetaan erikseen. Minkä tahansa kanavan nolla-arvo tarkoittaa vastaavan sävyn täydellistä puuttumista ja maksimi: sen täydellistä läsnäoloa. Kanava-arvojen resoluutio on vaihteleva ja sillä on oma jokaisessa bittisyvyydessä (katso tietyt arvot tämän artikkelin kohdasta pikselien tallentamisesta kaksiulotteiseen taulukkoon). Samaan aikaan bittisyvyyksillä 16 ja 32 ei voida asettaa vain mielivaltaista resoluutiota, vaan myös yksittäisiä kullekin kanavalle (esimerkiksi 5 bittiä punaiselle ja siniselle, mutta 6 bittiä vihreälle). Huolimatta arvojen resoluution asetusvaihtoehtojen suuresta määrästä, Microsoftin dokumentaatiossa ei kerrota, kuinka arvon resoluutiota muutetaan. Tästä johtuen eri ohjelmistovalmistajat voivat saada erilaisia tuloksia bittisyvyyttä muuttaessaan.
Kun määrität pikselin värin suoraan, voit RGB-arvojen lisäksi valita Windowsin bittikarttamuodon myös alfakanava- arvojen asettamisen . Bititeettinä ja arvojen koodauksena se on identtinen värikanavien kanssa: sillä on mielivaltainen bittimäärä ja käytetään etumerkittömiä kokonaislukuja. Mitä tulee arvojen yhteensovittamiseen, nolla vastaa täydellistä läpinäkyvyyttä, ja käytettävissä oleva enimmäismäärä vastaa täyttä täyttöä.
Kaksiulotteinen taulukkoMinkä tahansa bittisyyden pikselit voidaan tallentaa kaksiulotteiseen taulukkoon. Tällä tallennusmenetelmällä pakkauskenttä sisältää arvon 0 (BI_RGB), 3 (BI_BITFIELDS) tai 6 (BI_ALPHABITFIELDS). Jos käytetään CORE-version otsikkoa, pikselit tallennetaan joka tapauksessa vain kaksiulotteisena taulukkona.
Tässä asettelussa rasteripikselit kirjoitetaan yhden pikselin vaakajuovina, joita Microsoft usein kutsuu " skannauksiksi " dokumentaatiossaan (venäjäksi lähin sana on rivit ). Nämä rivit kirjoitetaan muistissa järjestyksessä, mutta positiivisella Korkeudella: alkaen alhaalta ( englanniksi bottom-up bitmap ) ja negatiivisella Korkeudella: ylhäältä ( englanniksi top-down bitmap ). Jokaisella vaakarivillä pikselit kirjoitetaan tiukasti vain vasemmalta oikealle. Alle 8 bittiä pienemmät pikselit sijoitetaan tavuiksi, jolloin bitit täyttyvät korkeasta matalaan, jolloin pikselien heksadesimaali-/binaarilukuarvot ovat enemmän samankaltaisia kuin lähtökuva. Jos bittisyvyys on 16 tai 32, niin käsittely suoritetaan kokonaisilla samankokoisilla konesanoilla bittien järjestyksessä matalasta korkeaan (little-endian). Rivit, solukoosta riippumatta, on täytettävä nollilla neljän tavun koon kerrannaiseen asti [8] . Tästä johtuen, jos kuvan leveys ei ole useita, rivien lopussa voi näkyä käyttämättömiä bittejä tai kokonaisia tavuja. Mutta taatun rivikoon moninaisuuden ansiosta käsittely voidaan suorittaa 8-, 16- tai 32-bittisillä konesanoilla, kuten valitset. Ja Microsoftilla on edelleen seuraava trendi yli 8 bittisyvyyksissä: sininen (sininen) komponentti sijoitetaan alempiin bitteihin / ensimmäisiin tavuihin, vihreä (vihreä) seuraavaan ja punainen (punainen) on vanhempi / kauimpana, ja jos on alfakanava, silloin se on merkittävimmässä bitissä/viimeisissä tavuissa.
Alla oleva kaavio näyttää pikselien sijoittelun alle 8 bitteinä :
bittiä | 7 | 6 | 5 | neljä | 3 | 2 | yksi | 0 |
1 bittiä | 0 | yksi | 2 | 3 | neljä | 5 | 6 | 7 |
2 bittiä | 0 | yksi | 2 | 3 | ||||
4 bittiä | 0 | yksi |
16- ja 32 - bittisillä pikseleillä käsitellään samankokoisia konesanoja (olettaen, että tavujärjestys on pieni), jotka käyttävät kanavabittimaskeja . Jos yksittäisiä bitimaskeja ei anneta, rakenne on seuraava. 16 bitin kohdalla kullekin kanavalle osoitetaan 5 bittiä. Sininen on vähiten merkitsevissä biteissä (maski 001F 16 ), vihreä on paikassa 5 (maski 03E0 16 ), punainen: alkaen 10. bitistä (maski 7C00 16 ), ja merkittävintä jäljellä olevaa bittiä 15 ei käytetä. Jos käytetään 32 bittiä, jokaiselle kanavalle on oletusarvoisesti määritetty tavu (8 bittiä). Komponentit on järjestetty samalla tavalla: sininen alhaisissa biteissä (maski 0000:00FF 16 ), vihreä alkaen bitistä 8 (mask 0000:FF00 16 ), punainen alkaen bitistä 16 (maski 00FF:0000 16 ), ja korkea tavu on ei käytössä (käytetään alfakanavana vain, jos näytät sen suoraan) [26] . Koska se on tarkoitus lukea pikkutavujärjestyksessä, jos luet arvoja muistista tavu kerrallaan, ne ovat samassa järjestyksessä (sininen tulee ensin).
Bittisyvyydellä 24 jokaisella kanavalla on tavu, ja bittisyvyydellä 48 ja 64 : 16-bittinen konesana. Kaikissa kolmessa tapauksessa värikomponentit menevät muistissa järjestyksessä: sininen, vihreä, punainen. 64-bittisissä BMP:issä värejä seuraa lisäksi 16-bittinen alfakanava. Jos haluat käsitellä 64-bittistä pikseliä yhdellä konesanalla, niin little-endianissa sininen on alemmissa 16 bitissä ja alfakanava korkeammissa. Vihreä on punaisen vieressä ja sininen alfan vieressä. Ja voit nähdä, että 24-bittisenä pikselimuoto vastaa väritaulukon RGBTRIPLE-rakennetta.
RLE-koodausMicrosoftin RLE-koodauksen käyttö on dokumentoitu vain bittisyvyyksille 4 ja 8. Käytettäessä BITMAPINFO:ssa pakkauskentän tulee sisältää 2 (BI_RLE4) bittisyvyydellä 4 tai 1 (BI_RLE8) kahdeksan bitin pikseleillä. Rasterin korkeus on määritettävä positiivisena numerona.
Windowsin bittikarttamuodossa RLE-koodausta voidaan verrata piirtämiseen yksinkertaisilla komennoilla. Piirtäminen alkaa vasemmasta alakulmasta (ole varovainen: rastereissa yleensä vasen ylempi pikseli voi olla tutumpi) ja etenee oikealle ja ylöspäin. Bittikartan koon ulkopuolella olevia pikseleitä ei piirretä (tätä ei mainita dokumentaatiossa, mutta GDI käyttäytyy tällä tavalla). RLE-ohjeiden avulla voit keskeyttää vaakaviivan piirtämisen, koko kuvan ja siirtää piirtokohdistimen toiseen paikkaan. Tämän seurauksena joitain pikseleitä ei ehkä piirretä. Dokumentaatiossa ei nimenomaisesti esitetä värejä piirtämättömille pikseleille, minkä seurauksena tulkinta voi vaihdella: puuttuvat pikselit joko pysyvät läpinäkyvinä tai saavat värin indeksillä 0. Jos teemme ensimmäisen oletuksen, voidaan sanoa, että 4- ja 8 -bittitilat johtuvat siitä, että RLE tukee implisiittisesti läpinäkyvyyttä, mutta tätä toimintaa ei taata.
Kuvanmuodostus RLE-koodauksen aikana tapahtuu komennoilla. Jokaisen komennon on välttämättä aloitettava parillisella osoitteella (tasattu 16-bittiseen rajaan). On viisi komentoa, jotka määritellään tavuparilla:
Tavu 1 (heksadesimaaliluku) |
Tavu 2 (heksadesimaali) |
Kuvaus |
---|---|---|
01..FF _ _ | 00..FF _ _ | Aloita nykyisestä sijainnista ja siirry oikealle, piirrä niin monta pikseliä kuin ensimmäisessä tavussa on määritetty. Pikselien arvot otetaan toisesta tavusta. 8-bittisissä BMP:issä koko tavu on arvo. 4-bitissä siitä otetaan vuorotellen korkein nibble ja sitten alin nibble (neljä bittiä). |
00 | 00 | Siirrä kohdistin seuraavan (ylemmän) vaakatason alkuun (vasemmalle). |
00 | 01 | Lopeta piirtäminen (loppu saavutettu). |
00 | 02 | Siirrä kohdistinta oikealle ja ylöspäin seuraavien kahden tavun arvojen verran. Ensimmäinen seuraava tavu sisältää vaakasiirron arvon ja seuraava tavu pystysiirron arvon. Molemmat arvot: etumerkittömät kokonaisluvut (ei voi siirtää vasemmalle tai alas). |
00 | 03..FF _ _ | Piirrä nykyisestä paikasta ja edelleen oikealle pikselit arvoilla, jotka tulevat tämän tavuparin jälkeen. Komennon toinen tavu sisältää ylimaalattavien pikselien määrän (eli pikseleitä, ei tavuja). 8-bittisessä rasterissa tavuvirta otetaan sellaisenaan. 4-bitissä nibbles luetaan jo: ylemmät 4 bittiä tavusta ensimmäiselle pikselille, alemmat 4 bittiä seuraavalle ja niin edelleen seuraavista tavuista. Tämä tietovirta voi päättyä parittomaan määrään tavuja, ja ohjeet vaativat 16-bittisen kohdistuksen. Jos näin tapahtuu, lisätään ylimääräinen tavu (sen sisällöllä ei ole väliä). |
Kun vaakatason oikea reuna saavutetaan, ei käännöstä tehdä seuraavaan. Siksi sinun on erityisesti lisättävä komento rivin lopettamiseksi. Ja kuten taulukosta näet, komentosarja ei salli sinun siirtyä alas tai palata vaakatasoon. Siksi voit lopettaa piirtämisen, jos yläreuna saavutetaan.
Tietojen upottaminen JPEG- ja PNG-muodoissaWindows 98/ME:stä ja 2000/XP:stä alkaen järjestelmätoimintojen avulla voit tallentaa pikseleitä JPEG- ja PNG -muodoissa . Järjestelmän näiden kahden muodon tuesta ei tiedetä mitään.
Jos haluat upottaa JPEG- tai PNG-tiedoston, sinun on nollattava BitCount-kenttä BITMAPINFO-kohdassa ja määritettävä arvo 4 (BI_JPEG) tai 5 (PI_PNG) pakkauskohdassa. SizeImage-kentän arvo on tässä tapauksessa sama kuin JPEG- tai PNG-tiedoston koko, joka on upotettu pikselitietojen tilalle sellaisenaan. Otsikon leveys ja korkeus on jo ilmoitettu dekoodatulle kuvalle. Dokumentaatio ei kerro suoraan mitään Korkeus-kentän etumerkistä tässä tapauksessa, mutta ilmeisesti on tarpeen kirjoittaa negatiivinen arvo [16] .
Mitattomien pikselien vertaamiseen materiaalimittoihin käytetään XPelsPerMeter- ja YPelsPerMeter-kenttiä. Näissä kentissä kokonaisluku osoittaa, kuinka monta pikseliä tässä kuvassa putoaa yhdelle lineaarimetrille erikseen vaakasuunnassa (XPelsPerMeter) ja pystysuunnassa (YPelsPerMeter). Microsoft julisti nämä kaksi kenttää allekirjoitetuiksi numeerisiksi tyypeiksi, mutta dokumentaatio ei kerro mitään negatiivisista arvoista. Arvosta nolla ei myöskään puhuta mitään, mutta on loogisempaa ottaa se epämääräiseksi resoluutioksi, kun se on tuntematon tai sillä ei ole arvoa.
Resoluutio määritetään usein viitaten metrimitoihin, vaan pisteinä tuumalle ( DPI / PPI ). Edestakaisin käännöksissä tuuma on yhtä suuri kuin 25,4 mm (englanninkielinen tuuma). Matemaattiset kaavat pikselien/tuuman (PPI) muuntamiseksi pikseleiksi/metriksi (PPM) ja päinvastoin:
Jos olet kiinnostunut tarkasta kokonaisluvun käännöksestä, seuraavat lausekkeet tulevat esiin:
PPM = (PPI * 5000 + 64) / 127 PPI = (PPM * 127 + 2500) / 5000Niiden jälkeen pyöristetään lähimpään kokonaislukuun. Jos haluat pyöristää alaspäin, älä lisää puolta jakajasta. Jos haluat ylöspäin, lisää jakaja vähennettynä yhdellä.
Alla on joidenkin PPI/DPI:iden ennalta lasketut PPM-arvot:
Tietokentissä väriavaruuden määrittelevä pääkenttä on CSType-kenttä. Sen sallitut arvot on esitetty alla olevassa taulukossa:
Merkitys | BITMAPINFO- versio [27] |
Jatkuva nimi | Kuvaus | |
---|---|---|---|---|
hex | Teksti | |||
0 | (Ei) | neljä | LCS_CALIBRATED_RGB | Säätö perustuu päätepisteisiin, GammaRed-, GammaGreen- ja GammaBlue-arvoihin. |
73524742 | "sRGB" | neljä | LCS_sRGB | Käytetään sRGB - väriavaruutta . |
57696E20 | "Voitta" [28] | neljä | LCS_WINDOWS_COLOR_SPACE | Oletusjärjestelmätila (sRGB). |
4C494E4B | 'LINKKI' | 5 | PROFILE_LINKED | Väriprofiili toisessa tiedostossa. |
4D424544 | "MBED" | 5 | PROFILE_EMBEDDED | Tähän tiedostoon sisältyvä väriprofiili. |
Microsoft ei ilmoittanut vakioiden arvoja numeerisiksi arvoiksi, vaan nelimerkkisiksi tekstiarvoiksi [29] . Tässä tapauksessa merkkikoodit muodostavat 32-bittisen arvon tavut (oikeimman merkin ASCII-koodi on alempi tavu, vasemmanpuoleisimman merkin koodi on ylin tavu). Kun tarkastellaan tiedoston binaarisisältöä tekstinä, tällaiset ASCII-koodatut arvot näytetään taaksepäin (esimerkiksi "KNIL" eikä "LINK").
Päätepisteet ja gamma-arvotWindowsin bittikarttamuoto mahdollistaa värinkorjauksen määrittämällä punaiset, vihreät ja siniset päätepisteet sekä gamma -arvot . Tätä varten CSType-kentän on sisällettävä arvo 0 (LCS_CALIBRATED_RGB). Korjaavat arvot kirjoitetaan Endpoints-, GammaRed-, GammaGreen- ja GammaBlue-kenttiin (muissa CSType-arvoissa nämä neljä kenttää jätetään huomiotta).
36-tavuinen EndPoints-kenttä on CIEXYZTRIPLE-rakenne, joka koostuu kolmesta kentästä ciexyzRed (punainen päätepiste), ciexyzGreen (vihreä piste) ja ciexyzBlue (sininen). Nämä kolme kenttää ovat puolestaan myös CIEXYZ-rakenteita, joissa on kolme FXPT2DOT30-tyyppistä kenttää ciexyzX, ciexyzY ja ciexyzZ. PXPT2DOT30 on 32-bittinen etumerkitön kiinteän pisteen luku, jossa on 2 yläbittiä kokonaislukuosalle ja 30 matalaa bittiä murto-osalle.
Gamma-arvo kirjoitetaan kunkin värikanavan vastaaviin kenttiin erikseen: GammaRed (punainen), GammaGreen (vihreä) ja GammaBlue (sininen). Tietorakenteiden määrittelyssä Microsoft määritti näille kentille DWORD-tyypin. Samaan aikaan WinGDI.h-tiedostossa on tarkoituksenmukaisempi FXPT16DOT16-tyyppinen määritys (pitkän tyypin perusteella), joka on 32-bittinen etumerkitön luku, jonka murto-osa on alemmassa 16 bitissä ja kokonaisluku osa 16 korkeammasta. On huomattava, että MSDN:ssä BITMAPV4HEADER- ja BITMAPV5HEADER- rakenteita koskevilla sivuilla tämä on kaikki mitä sanotaan. LOGCOLORSPACE-rakennetta käsittelevässä artikkelissa sanotaan, että korkea ja matala tavu tulisi asettaa nollaan vastaavissa kentissä (itse asiassa 16.16-muodon sijaan käytetään 8.8-muotoa, joka sijaitsee keskellä 32 -bittinen solu) [30] .
Alla on yllä olevien neljän kentän arvot sRGB [31] -väriavaruuden mukaisesti :
Ala | Merkitys | |
---|---|---|
Murtoluku | 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 |
GammaRed GammaGreen GammaBlue |
2.20 | 0002199A [32] |
BMP-tiedostossa voidaan tarvittaessa määrittää väriprofiili joko suoraan sisällyttämällä tai linkittämällä toiseen tiedostoon. Profiilit ilmestyivät BMP:n viidennessä versiossa, ja toistaiseksi vain täällä on niille erityisiä kenttiä. Väriprofiileja tuetaan vain ICC-muodossa [33] [34] .
Kun käytät väriprofiileja, sinun on ensin määritettävä seuraavat arvot CSType-kenttään:
Joka tapauksessa ProfileData-kenttä määrittää profiilisiirtymän tavuina BITMAPINFO-lohkon alusta. Jos profiili on sisäänrakennettu, ProfileSize-kohdassa sinun on määritettävä sen koko tavuina (jos se on kytkettävä, tämän kentän arvoksi tulee asettaa nolla). Vaihteesta riippumatta Microsoft suosittelee profiilin sijoittamista pikselitietojen taakse, kun se tallennetaan tiedostoon, ja välittömästi otsikon [35] jälkeen RAM-muistiin, kun se on vuorovaikutuksessa WinAPI-toimintojen kanssa .
ICC-muoto käyttää otsikossaan pääasiassa 32-bittisiä soluja tai tämän solukoon kerrannaisia [36] . Tämän perusteella, jos profiili sisältyy suoraan BMP:hen, on suositeltavaa tallentaa se RAM-muistiin osoitteeseen, joka on neljän tavun kerrannainen.
Kun profiili on ulkoinen, sen sisällön sijaan BMP:hen sijoitetaan tekstimerkkijono, jossa on tiedoston polku. Sen on oltava yksitavuisella Windows 1252 -koodauksella (Länsi-Euroopan kielten vakiokoodaus) ja sen on päätyttävä nollatavuun. Dokumentaatio ei kerro mitään polun komponenttien erottimista, ja siksi voit todennäköisesti käyttää sekä vasenta kauttaviivaa " \ " että "oikeaa" "/" . Polku voi olla sekä suhteellinen että täydellinen ja verkko [35] . Ja koska polun määrittämisessä käytetään yksitavuista koodausta, tätä merkkijonoa ei tarvitse tasata RAM-muistissa.
RenderöintiasetuksetKansainvälinen värikonsortio (International Color Consortium) otti käyttöön renderöintiasetukset (englanniksi rendering intents) ja ne määrittävät prioriteetit siinä tapauksessa, että siirryttäessä yhden laitteen tukemasta värialiavaruudesta ( englanniksi gamut ) toisen aliavaruuteen värit ovat käytetty kuvassa, puuttuu kohteesta. ICC:stä on myös määritelmä, joka määrittelee renderöintiasetukset tyyliksi, jolla väriarvot kartoitetaan kuvakuvauksesta toiseen (alkuperäinen englanniksi: "tyyli väriarvojen kartoittamiseksi yhdestä kuvakuvauksesta toiseen" ) [37 ] . Microsoft on sisällyttänyt BMP-muotoon erityisen Intent-kentän, joka voi ottaa arvoja täysin ICC-spesifikaatioiden mukaisesti. Siksi lisätietoja saat konsortion dokumentaatiosta, jonka uusin versio voidaan ladata osoitteesta color.org [38] . Microsoftilla nämä asetukset on kuvattu lyhyesti MSDN :n Rendering Intents -artikkelissa.
Asetus ilmoitetaan BITMAPINFO-lohkon Tarkoitus-kentässä ja se on käytettävissä vain tietokenttien 5. versiossa. Arvot voivat olla seuraavat:
Merkitys | BMP :n vakionimi |
ICC nimi |
Microsoftin nimi |
Vakio tiedostosta Icm.h |
Vakio DEVMODElle |
---|---|---|---|---|---|
yksi | LCS_GM_BUSINESS | kylläisyys | Graafinen | INTENT_SATURATION(2) | DMICM_SATURATE(1) |
2 | LCS_GM_GRAPHICS | mediaan suhteellinen kolorimetrinen | todiste | INTENT_RELATIVE_COLORIMETRIC(1) | DMICM_COLORIMETRIC(3) |
neljä | LCS_GM_IMAGES | havainnollinen | kuva | INTENT_PERCEPTUAL(0) | DMICM_CONTRAST(2) |
kahdeksan | LCS_GM_ABS_COLORIMETRIC | ICC-absoluuttinen kolorimetrinen (suhteellinen kolometrinen) |
Ottelu | INTENT_ABSOLUTE_COLORIMETRIC(3) | DMICM_ABS_COLORIMETRIC(4) |
Microsoft on ilmoittanut tälle ominaisuudelle ainakin kolme vakiojoukkoa, jotka eroavat toisistaan merkitykseltään ja joita käytetään eri paikoissa [39] . Tässä ne siltä varalta, että sinun on verrattava niitä nopeasti. "INTENT_"-etuliitteellä olevien vakioiden arvot ovat täsmälleen samat kuin ICC-profiilitiedostoissa [40] . Vakiot, joiden etuliitteenä on "DMICM_", ilmoitetaan DEVMODE-rakenteen WinGDI.h-tiedostossa. BMP:ssä käytetyt "LCS_GM_"-vakiot on ilmoitettu siellä ja ne on tarkoitettu ensisijaisesti LOGCOLORSPACE-rakenteeseen. Tulostimen ominaisuuksille on myös nimiä. Ne ovat samanlaisia kuin "Microsoft Name" -sarakkeessa, mutta niissä on "Graphics" ja "Pictures".
Oletusarvo, joka sopii ensisijaisesti valokuville ja kuville, voi olla 4 (LCS_GM_IMAGES). Sellaisenaan sekä Microsoft [41] että ICC [42] suosittelevat sitä .
Seuraava ohjelma avaa 24-bittisen BMP-tiedoston XWindowissa, värisyvyyden on oltava 32-bittinen, mutta se ei toimi matalammalla värintoistolla, koska se vaikeuttaa esimerkkiä:
/* Käännetty rivillä: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */ #include <X11/Xlib.h> #include <X11/Xutil.h> #sisältää <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-otsikkomääritykset tässä artikkelissa aiemmin kuvatulla tavalla (rakenteiden on oltava 2-tavuisia!) */ staattinen XImage * CreateImageFromBuffer ( Display * , unsigned char * , int , int ); main ( int argc , char * argv []) { Näyttö * dis ; Window win ; /* Meidän ikkunamme */ XEvent- tapahtuma ; /* Kehitys */ GC gc ; /* Graafinen konteksti */ XImage * kuva ; int n , leveys , korkeus , fd , koko ; allekirjoittamaton char * data ; BITMAPFILEHEADER bmp ; BITMAPINFOHEADER inf ; char * buf ; if ( arg < 2 ) { perror ( "käytä: xtest file.bmp \n " ); uloskäynti ( 1 ); } if (( fd = avoin ( argv [ 1 ], O_RDONLY )) == -1 ) { printf ( "Virhe bittikartan avaamisessa \n " ); uloskäynti ( 1 ); } lue ( fd , & bmp , koko ( BITMAPFILEHEADER )); lue ( fd , & inf , koko ( BITMAPINFOHEADER )); leveys = inf . biWidth ; korkeus = inf . biHeight ; if (( dis = XOpenDisplay ( getenv ( "DISPLAY" ))) == NULL ) { printf ( "Ei voi muodostaa yhteyttä X-palvelimeen:%s \n " , strerror ( errno )); uloskäynti ( 1 ); } win = XCreateSimpleWindow ( dis , RootWindow ( dis , DefaultScreen ( dis )), 0 , 0 , leveys , korkeus , 5 , BlackPixel ( dis , DefaultScreen ( dis )), WhitePixel ( dis , DefaultScreen ( dis ))); XSetStandardProperties ( dis , win , argv [ 1 ], argv [ 0 ], ei mitään , argv , argc , NULL ); gc = OletusGC ( dis , DefaultScreen ( dis )); /* Joskus tätä kohtaa ei täytetty rakenteessa */ if ( inf . biSizeImage == 0 ) { /* Laske koko */ koko = leveys * 3 + leveys % 4 ; koko = koko * korkeus ; } muu { koko = info . biSizeImage ; } buf = malloc ( koko ); if ( buf == NULL ) { perror ( "malloc" ); uloskäynti ( 1 ); } printf ( "koko =%d tavua varattu \n " , koko ); /* Siirry itse kuvan alkuun */ lseek ( fd , bmp . bfOffBits , SEEK_SET ); /* Lue puskuriin */ n = lue ( fd , buf , koko ); printf ( "koko =%d tavua lue \n " , n ); image = CreateImageFromBuffer ( dis , buf , leveys , korkeus ); /* Poista puskuri - emme tarvitse sitä enää */ ilmainen ( buf ); XMapWindow ( dis , win ); XSelectInput ( dis , win , ExposureMask | KeyPressMask ); kun ( 1 ) { XNextEvent ( dis , & tapahtuma ); if ( tapahtuma . xany . ikkuna == voitto ) { kytkin ( tapahtuma . tyyppi ) { asia Expose : XPutImage ( dis , win , gc , kuva , 0 , 0 , 0 , 0 , kuva -> leveys , kuva -> korkeus ); tauko ; tapaus KeyPress : if ( XLookupKeysym ( & tapahtuma . xkey , 0 ) == XK_q ) { XDestroyImage ( kuva ); XCloseDisplay ( dis ); sulkea ( fd ); poistu ( EXIT_SUCCESS ); } tauko ; oletus : tauko ; } } } } /* Luo Ximagen BMP - tiedostosta , koska BMP - kuva tallennetaan ylösalaisin * ja peilattu silmukka korjaa tämän */ XImage * CreateImageFromBuffer ( Näyttö * dis , unsigned char * buf , int leveys , int korkeus ) { int syvyys , näyttö ; XImage * img = NULL ; int i , j ; int numBmpBytes ; size_t numImgBytes ; int32_t * imgBuf ; int ind = 0 ; int line ; int temp ; int ih , iw ; /* Rivi- ja sarakenumerot vastaavat */ int uusi_ind ; /* Uusi hakemisto */ näyttö = Oletusnäyttö ( dis ); syvyys = OletusSyvyys ( dis , näyttö ); lämpötila = leveys * 3 ; viiva = lämpötila + leveys % 4 ; /* Merkkijonon pituus tasaus mukaan lukien */ numImgBytes = ( 4 * ( leveys * korkeus )); imgBuf = malloc ( numImgBytes ); /* Tiedostossa BMP:lle varattu koko, mukaan lukien tasaus */ numBmpBytes = rivi * korkeus ; for ( i = 0 ; i < numBmpBytes ; i ++ ) { unsigned int r , g , b ; /* Ohita täyte */ if ( i >= lämpötila && ( i % rivi ) > = lämpötila jatkaa ; b = buf [ i ]; i ++ ; g = buf [ i ]; i ++ ; r = buf [ i ]; /* Laske uusi indeksi pystysuunnassa */ iw = ind % leveys ; ih = ind / leveys ; uusi_ind = iw + ( korkeus - ih - 1 ) * leveys ; imgBuf [ uusi_ind ] = ( r | g << 8 | b << 16 ) << 8 ; ind ++ ; } img = XCreateImage ( dis , CopyFromParent , syvyys , ZPixmap , 0 , ( char * ) imgBuf , leveys , korkeus , 32 , 0 ); XInitImage ( img ); /* PC:n bittien ja tavujen järjestyksen tulisi olla tämä */ img -> byte_order = MSBFirst ; img -> bittikartan_bittijärjestys = MSBFirst ; paluu img ; }Microsoft Windows SDK on kehittäjäpaketti, joka sisältää ohjeen ja C++-tiedostot. Tämän artikkelin aiheeseen liittyen tiedostot WinGDI.h ja Icm.h ovat merkityksellisiä, joista vakioiden arvot otettiin ensinnäkin. Tämän sarjan uusin versio voidaan ladata ilmaiseksi Microsoftin verkkosivustolta (tässä artikkelissa käytettiin versioita 6.0 ja 7.1).
Microsoftilla ei ole erillistä dokumentaatiota erityisesti BMP-muodolle. Mutta sen rakenteet ja muut elementit on kuvattu GDI-alijärjestelmässä. Tämä kuvaus on ohjeessa, joka sisältyy yllä olevaan SDK:han ja myös MSDN :ään . Lisäksi jälkimmäisessä se on läsnä eri alustoilla ja itsenäisesti Visual Studion ohjeessa. Useimmissa tapauksissa tiedot ovat identtisiä, mutta joissain paikoissa voi olla hieman enemmän faktoja (esimerkiksi SDK-ohjeessa on enemmän tietoa Windows-tuesta).
Katso perustiedot GDI-ohjeesta Windows 9x- ja NT-alustoille. Linkit tämän osion sivuille, jotka viittaavat vain muotoon, eivät sen kanssa työskenteleviin WinAPI-toimintoihin:
Windows Compact 2013 (CE 6.0)- ja Mobile 6.5 -alustoilla on kuvaukset vain kolmesta rakenteesta, mutta näille alustoille:
Linkkejä muille BMP-muotoon liittyville MSDN-sivuille:
ICC-värinhallintamääritykset tarjoavat tietoa väriprofiileista (mukaan lukien ICC-tiedostomuodosta) sekä renderöintiasetuksista. Tämä eritelmä voidaan ladata konsortion color.org viralliselta verkkosivustolta . Kirjoitushetkellä uusin versio on 4.3 (joulukuu 2010). Suorat linkit PDF-tiedostoon ICC:n verkkosivuilta:
mediasäiliöt | |
---|---|
Video/ääni | |
Audio | |
Musiikki |
|
Raster | |
Vektori | |
Monimutkainen |