Kuvaa bmp, mistä se koostuu. BMP-tietomuoto (bittikartta)

Tarkastelimme pienen ohjelman, joka siirtää spriten ruudulla, mutta valitettavasti se ei näyttänyt siltä, ​​miltä haluaisimme. Tässä artikkelissa yritämme "siivota" spriten.

Saimme sprite-kuvan Bmp-tiedostosta, samoista tiedostoista voit ottaa taustakuvan, hiiren kursorin ja käyttöliittymäelementit. Näytöllä ei kuitenkaan näy aivan sitä, mitä odotimme: kuva osoittautui käänteiseksi ja lisäksi eri väreiksi kuin vaadittiin. Joten opetellaan lukemaan Bmp-tiedostoja oikein ja käännä kuva ylösalaisin.

Kehittäjien päätöksellä Bmp-tiedostomuotoa ei ole sidottu tiettyyn laitteistoalustaan. Tässä tiedostossa on neljä osaa: otsikko, tietootsikko, väritaulukko (paletti) ja kuvatiedot. Jos tiedosto sisältää kuvan, jonka värisyvyys on 24 bittiä (16 miljoonaa väriä), väritaulukko saattaa puuttua, mutta meidän 256-värisessä tapauksessa on. Jokaisen 256-värisen kuvan tallentavan tiedoston osan rakenne on annettu ja vastaavat tietuetyypit on annettu sisään.

Tiedoston otsikko alkaa allekirjoituksia"BM", jota seuraa tiedoston pituus tavuina. Seuraavat 4 tavua on varattu muita muotolaajennuksia varten, ja tämä otsikko päättyy siirtymä tiedoston alusta tallennettuun kuvatietoon. 256 värillä tämä siirtymä on 1078 - juuri tämän verran meidän piti ohittaa viimeisessä ohjelmassamme päästäksemme tietoihin.

Tietootsikko alkaa omalla pituudellaan (se voi muuttua, mutta 256 värin tiedostossa se on 40 tavua) ja sisältää kuvan mitat, resoluution, värien esitysominaisuudet ja muut parametrit.

Kuvan leveys ja korkeus on asetettu rasterin pisteisiin eivätkä ehkä vaadi selityksiä.

Lentokoneiden lukumäärä voidaan käyttää tiedostoissa, joiden värisyvyys on pieni. Jos värejä on 256 tai enemmän, se on aina yhtä suuri kuin 1, joten nyt tätä kenttää voidaan pitää jo vanhentuneena, mutta yhteensopivuuden vuoksi se säilytetään.

Värisyvyys Sitä pidetään tärkeimpänä ominaisuutena, jolla väri esitetään tiedostossa, ja se mitataan bitteinä pistettä kohti. Tässä tapauksessa se on 8.

Puristus. Ei yleensä käytetä BMP-tiedostoissa, mutta sille on otsikkokenttä. Yleensä se on 0, mikä tarkoittaa, että kuvaa ei ole pakattu. Jatkossa käytämme vain tällaisia ​​tiedostoja.

Kuvan koko- tämän kuvan tallentamiseen tarvittavan muistin tavumäärä, ei sisällä palettitietoja.

Vaaka- ja pystyresoluutio mitattuna rasteripisteinä metriä kohti. Ne ovat erityisen tärkeitä skannattujen kuvien mittakaavan säilyttämiseksi. Graafisilla muokkausohjelmilla luoduissa kuvissa näissä kentissä on yleensä nollia.

Värien lukumäärä Voit pienentää palettitaulukon kokoa, jos kuva todella sisältää vähemmän värejä kuin valittu värisyvyys sallii. Käytännössä tällaisia ​​tiedostoja ei kuitenkaan juuri koskaan tavata. Jos värien määrä on värisyvyyden sallima enimmäismäärä, esimerkiksi 256 väriä 8 bitissä, kenttä asetetaan nollaan.

Päävärien lukumäärä- alkaa paletin alusta, ja on toivottavaa näyttää se ilman vääristymiä. Tämä kenttä on tärkeä, kun näytön värien enimmäismäärä oli pienempi kuin BMP-tiedoston paletti. Muotoa kehitettäessä oletettiin luonnollisesti, että yleisimmät värit löytyvät taulukon alussa. Nyt tätä vaatimusta ei käytännössä noudateta, eli värejä ei järjestetä sen mukaan, kuinka usein ne esiintyvät tiedostossa. Tämä on erittäin tärkeää, koska kahden eri tiedoston paletit, jopa samoista väreistä koostuvat, sisältäisivät ne (värit) eri järjestyksessä, mikä voisi merkittävästi vaikeuttaa tällaisten kuvien samanaikaista näyttämistä näytöllä.

Tietootsikkoa seuraa väritaulukko, joka on 256 (värien lukumäärän mukaan) 4-tavuisen kentän joukko. Jokainen kenttä vastaa omaa väriään paletissa, ja kolme neljästä tavusta vastaa tämän värin sinisen, vihreän ja punaisen komponentin komponentteja. Kunkin kentän viimeinen, merkittävin tavu on varattu ja on yhtä kuin 0.

Väritaulukon jälkeen on kuvatiedot, jotka kirjoitetaan alhaalta ylös rasterin viivoja pitkin ja rivin sisällä - vasemmalta oikealle. Koska joillakin alustoilla on mahdotonta lukea alle 4 tavua olevaa tietoyksikköä, jokaisen rivin pituus kohdistetaan 4-tavun rajaan, eli jos rivin pituus ei ole neljän kerrannainen, se on pehmustettu nolilla. Tämä seikka on otettava huomioon tiedostoa luettaessa, vaikka voi olla parempi varmistaa etukäteen, että kaikkien kuvien vaakasuuntaiset mitat ovat neljän kerrannaisia.

Kuten jo totesimme, tiedostomuoto on suunniteltu universaaliksi eri alustoille, joten ei ole yllättävää, että paletin värit tallentuvat siihen eri tavalla kuin VGA:lle tavallista. Lukutoimenpiteen suorittamisen aikana suoritetaan tarvittava uudelleenkoodaus. (Puhumme seuraavissa artikkeleissa siitä, mikä VGA-paletti on ja kuinka sen kanssa työskentelee.)

256-värisessä BMP-tiedostonlukijassa on vain kaksi rutiinia. Kuten luettelosta näkyy, kuvan mitat on siirrettävä ReadBMP-tiedoston lukumenettelyyn. Tämä on kätevää, jos kuva on luettava epätäydellinen. Kun koot ovat tiedossa etukäteen, tämä ei aiheuta ongelmia, mutta olisi mukavaa, jos moduuliamme käyttämällä olisi mahdollista lukea mitä tahansa kuvia, myös sellaisia, joiden kokoa ei tiedetä etukäteen. Tätä varten tarjotaan ReadBMPheader-menettely, joka lukee vain tiedoston otsikon. Kutsumalla sitä voit tarkistaa, onko kuva tallennettu valitussa 256 värin formaatissa, selvittää sen mitat ja vasta sitten varata sille muistia ja sijoittaa sen varattuun puskuriin.

Yhdistetään nyt uusi moduuli ohjelmaamme. Tätä varten kirjoitamme sen nimen uses-direktiiviin ja tarjoamme myös taulukon paletin tietojen tallentamiseksi, joka voidaan kuvata seuraavasti:

P: tavutaulukko;

CreateSprite-menettelyä, joka kutsuu toiminnon tiedoston lukemiseksi uudesta moduulista, on yksinkertaistettu (katso).

Bmp-tiedostorakenne

Nimi Pituus Puolueellisuus Kuvaus
Tiedoston otsikko (BitMapFileHeader)
Tyyppi2 0 Allekirjoitus "BM"
Koko4 2 Tiedoston koko
Varattu 12 6 Varattu
Varattu 22 8 Varattu
OffsetBits4 10 Kuvan siirtymä tiedoston alusta
Tietootsikko (BitMapInfoHeader)
Koko4 14 Otsikon pituus
Leveys4 18 Kuvan leveys, pisteet
Korkeus4 22 Kuvan korkeus, pisteet
Lentokoneet2 26 Lentokoneiden lukumäärä
BitCount2 28 Värisyvyys, bittiä per piste
Puristus4 30 Pakkaustyyppi (0 - pakkaamaton kuva)
KokoKuva4 34 Kuvan koko, tavua
XpelsPerMeter4 38 Vaakaresoluutio, pistettä per metri
YpelsPerMeter4 42 Pystyresoluutio, pistettä per metri
Käytetyt värit4 46 Käytettyjen värien määrä (0 on suurin mahdollinen tietylle värisyvyydelle)
VäritTärkeää4 50 Päävärien lukumäärä
Väritaulukko
Väritaulukko1024 54 256 elementtiä 4 tavua
Kuvatiedot (BitMap Array)
KuvaKoko1078 Kuva tallennettu rivi riviltä vasemmalta oikealle ja alhaalta ylös

Listaus 1

yksikkö bmpread; (prosessit Bmp-työskentelyyn) rajapintatyyppi artype = arrayof tavu; arptr = ^ artype; bmFileHeader = tietue (tiedoston otsikko) Typf: sana; (allekirjoitus) Koko: longint; (tiedoston pituus tavuina) Res1: sana; (varattu) Res2: sana; (varattu) OfBm: longint; (kuvan siirtymä tavuissa (1078)) loppu; bmInfoHeader = tietue (tietojen otsikko) Koko: longint; (otsikon pituus tavuina (40)) Leveys: longint; (kuvan leveys (pisteinä)) Korkeus: longint; (kuvan korkeus (pisteinä)) Suunnitelma: sana; (tasojen lukumäärä (1)) BitC: sana; (värisyvyys (bittiä per piste) (8)) Comp: longint; (pakkaustyyppi (0 - ei)) SizI: longint; (kuvan koko tavuina) XppM: longint; (vaakaresoluutio) ((pistettä per metri - yleensä 0)) YppM: longint; (pystyresoluutio) ((pistettä per metri - yleensä 0)) NCoL: longint; (värien määrä) ((jos suurin sallittu on 0)) NCoI: longint; (päävärien lukumäärä) loppu; bmHeader = tietue (täysi tiedoston otsikko) f: bmFileHeader; (tiedoston otsikko) i: bmInfoHeader; (informaatiootsikko) p: tavun taulukko; (palettipöytä) loppu; bmhptr = ^ bmHeader; (lue kuva Bmp-tiedostosta) menettely ReadBMP (kuva: arptr; (matriisi kuvan kanssa) xim, yim: sana; (mitat) pal: arptr; (paletti) tiedostonimi: merkkijono); (tiedoston nimi) (lue Bmp-tiedoston otsikko) menettely ReadBMPheader (otsikko: bmhptr; tiedostonimi: merkkijono); toteutus ($ R-) (lue kuva Bmp-tiedostosta) menettely ReadBMP (kuva: arptr; xim, yim: sana; pal: arptr; tiedostonimi: merkkijono); var h: bmHeader; i: kokonaisluku; bmpfile: tiedosto; s: pitkä; aloita määritys (bmpfile, tiedostonimi); nollaa (bmpfile, 1); blockread (bmp-tiedosto, h, koko (h)); (lue otsikko) i:lle: = 0 - yim-1 aloita (lue rivi riviltä) blockread (bmp-tiedosto, kuva ^ [(yim-i-1) * xim], xim); jos (xim mod 4)<>0 sitten blockread (bmpfile, s, 4 - (xim mod 4)); loppu; sulje (bmpfile); jos i ^ = 0 - 255, aloita (paletin muunnos) pal ^: = h.p shr 2; (sininen) pal ^: = h.p shr 2; (vihreä) pal ^: = h.p shr 2; (punainen) pää; loppu; (lue Bmp-tiedoston otsikko) menettely ReadBMPheader (otsikko: bmhptr; tiedostonimi: merkkijono); var bmpfile: tiedosto; aloita määritys (bmpfile, tiedostonimi); nollaa (bmpfile, 1); blockread (bmp-tiedosto, otsikko ^, koko (otsikko ^)); sulje (bmpfile); loppu; loppu.

Listaus 2

(sprite)-menettely CreateSprite (s: merkkijono; x, y, dx, dy: kokonaisluku); var f: tiedosto; (Sprite-kuvatiedosto) begin getmem (Sprt.Img, sizeof (SpriteArrayType)); (varaa muistia spritelle) getmem (Sprt.Back, sizeof (SpriteArrayType)); (varaa muisti puskurille) Readbmp (@ (Sprt.Img ^), Xsize, Ysize, @ p, s); Sprt.x: = x; Sprt.y: = y; (aseta alkuarvot) Sprt.dx: = dx; (koordinaatit ja inkrementit) Sprt.dy: = dy; loppu;

BMP on suosittu pakkaamaton kuvamuoto. Pohditaan, mitä ohjelmia voit käyttää kuvien katseluun tällä laajennuksella.

Luultavasti monet ovat jo aavistaneet, että koska BMP-muotoa käytetään kuvien näyttämiseen, voit tarkastella näiden tiedostojen sisältöä kuvankatseluohjelmilla ja graafisilla muokkausohjelmilla. Lisäksi jotkut muut sovellukset, kuten selaimet ja yleiset katseluohjelmat, voivat käsitellä tätä tehtävää. Seuraavaksi tarkastelemme algoritmia BMP-tiedostojen avaamiseksi tietyllä ohjelmistolla.

Tapa 1: FastStone Image Viewer

Aloitetaan suositusta FastStone Vieweristä.


Tapa 2: IrfanView

Katsotaanpa nyt BMP:n avaamisprosessia toisessa suositussa kuvankatseluohjelmassa IrfanView.


Tapa 3: XnView

Seuraava kuvankatseluohjelma, jossa käsitellään BMP-tiedoston avaamisen vaiheita, on XnView.


Tapa 4: Adobe Photoshop

Siirrytään nyt kuvaamaan algoritmia kuvatun ongelman ratkaisemiseksi graafisissa muokkausohjelmissa, alkaen suositusta Photoshop-sovelluksesta.


Tämän menetelmän suurin haitta on, että Photoshop-sovellus on maksettu.

Menetelmä 5: Gimp

Toinen grafiikkaeditori, joka voi näyttää BMP:tä, on Gimp-ohjelma.


Edelliseen menetelmään verrattuna tämä voittaa, koska Gimp-sovellus ei vaadi maksua käyttääkseen sitä.

Tapa 6: OpenOffice

Ilmaiseen OpenOffice-pakettiin sisältyvä graafinen editori Draw selviää myös onnistuneesti tehtävästä.


Tapa 7: Google Chrome

BMP voidaan avata paitsi graafisilla muokkausohjelmilla ja kuvien katseluohjelmilla, myös useilla selaimilla, kuten Google Chromella.


Tapa 8: Universal Viewer

Toinen ryhmä ohjelmia, jotka voivat toimia BMP:n kanssa, ovat yleiset katseluohjelmat, mukaan lukien Universal Viewer -sovellus.


Menetelmä 9: Maalaa

Yllä on lueteltu tapoja avata BMP käyttämällä kolmannen osapuolen asennettuja ohjelmia, mutta Windowsilla on oma grafiikkaeditori - Paint.


Tapa 10: Windowsin valokuvien katseluohjelma

Windowsissa on myös sisäänrakennettu vain kuvan katseluohjelma, joka voi suorittaa BMP:n. Katsotaanpa, kuinka tämä tehdään käyttämällä esimerkkinä Windows 7:ää.


Kuten näet, on olemassa melko suuri luettelo ohjelmista, jotka voivat avata BMP-kuvia. Ja tämä ei ole kaikki, vaan vain suosituimmat. Tietyn sovelluksen valinta riippuu käyttäjän henkilökohtaisista mieltymyksistä sekä asetetuista tavoitteista. Jos haluat vain nähdä piirustuksen tai valokuvan, on parempi käyttää kuvien katseluohjelmia ja käyttää kuvankäsittelyohjelmia muokkaamiseen. Lisäksi katseluun voidaan vaihtoehtona käyttää jopa selaimia. Jos käyttäjä ei halua asentaa tietokoneeseen lisäohjelmistoa toimiakseen BMP:n kanssa, hän voi käyttää sisäänrakennettua Windows-ohjelmistoa kuvien katseluun ja muokkaamiseen.

Bmp-tiedostomuoto on bittikartta ja erittäin suosittu. Sen "ymmärtää" kaikki Windows-käyttöjärjestelmät.

Bmp-tunnisteella varustetun tiedoston avaamisen tietokoneella pitäisi olla automaattinen - kaksoisnapsauta sitä hiiren vasemmalla painikkeella.

Jos näin ei tapahdu sinulle, tiedostojen yhdistäminen on todennäköisesti rikki, jolloin järjestelmän on ilmoitettava manuaalisesti, kuinka se avataan.

Voit tehdä tämän napsauttamalla hiiren oikealla painikkeella bmp-tiedostoasi, siirtämällä kohdistin riville "open with" ja valitsemalla haluamasi ohjelman (jos asennettu), esimerkiksi paintin.

Mikä ohjelma avata bmp-laajennuksen

Helpoin tapa avata bmp-muoto on Windows Photo Album -ohjelmalla. Sinun ei tarvitse ladata sitä - se tulee käyttöjärjestelmän mukana, eli kaikilla pitäisi olla se.

Toinen ohjelma on "maali". Sinun ei tarvitse myöskään ladata - se on oletusarvoisesti sisäänrakennettu Windowsiin, lisäksi et voi vain muokata bmp-laajennusta sillä, vaan sen avaamisen jälkeen tallentaa sen muuhun muotoon, esimerkiksi jpg - katselua varten puhelimessa .

Kolmas ohjelma on "PhotoScape". Sinun on ladattava se. Se on ilmainen, venäjäksi ja sen avulla voit katsella katselun lisäksi bmp-kuvia.

Neljäs sovellus on Paint.NET. Siinä on myös ilmainen venäläinen käyttöliittymä, kätevä ja erittäin helppokäyttöinen, ja siinä on monia työkaluja kuvien ja valokuvien korjaamiseen ja muokkaamiseen - se on kuin korvike standardille "Paint"

Viides ohjelma "GIMP". Se rinnastetaan photoshopiin. Tämä on ilmainen graafinen editori ammattikäyttöön kaikilla tarvittavilla toiminnoilla ja on yksinkertainen.

Yllä toimitetut ohjelmat, jotka avaavat tiedostot tässä muodossa, eivät ole kaukana kaikista. Niitä on kymmeniä, mutta nämä riittävät tavalliselle tietokoneen käyttäjälle. Onnea.

Nykyihminen työskentelee usein erimuotoisten digitaalisten kuvien kanssa. Niitä käytetään Internetissä, tietokoneessa, älypuhelimessa, digikamerassa, toimintakameroissa ja muissa laitteissa. Mutta on yksi muoto, joka voi hämmentää joitain käyttäjiä - BMP. Tämä ei ole kovin yleinen kuvatyyppi (ainakaan meidän aikanamme), mutta se löytyy silti. Siksi olisi mukavaa ymmärtää, mikä hän on. Yritetään vastata kysymykseen, mikä BMP-muoto on. Mutta ensin olisi tarpeen kertoa sen alkuperän historiasta. Tämä auttaa sinua ymmärtämään, miksi se ylipäätään luotiin. Joten aloitetaan BMP-muodon luomisen historiasta.

Tausta

Vuoden 1994 tienoilla kehittäjät tarvitsivat uuden kuvaformaatin käytettäväksi ohjelmistotuotteissa. Kriteerit olivat tiukat. Formaatin piti toimia 256 värin paletin kanssa, ja sen koko oli järkevä. BMP-muoto otettiin pian käyttöön. Tämä oli todellinen läpimurto siihen aikaan. Sitä käytettiin laajalti lähes kaikkialla. Jopa Microsoftilla, joka kehitti sen.

Vuodet kuitenkin kuluivat, ja tämä muoto on lakannut olemasta kysyntää. Paljon kehittyneempiä pakkaustekniikoita on syntynyt. Samaan aikaan uusien formaattien värilaatu oli paljon parempi. Nyt BMP:tä käytetään vain joissakin ohjelmissa. Ja silloinkin vain niissä, joiden kehittäjät eivät "vaivautuneet" käyttöliittymään, esimerkiksi Windows-käyttöjärjestelmään. BMP-tiedosto on toivottoman vanhentunut. Mutta jostain syystä se on edelleen käytössä. Ja nyt yritetään ymmärtää, millainen eläin se on.

Mikä on BMP?

BMP on tiedostotyyppi bittikarttakuvien tallentamiseen. Vain rasteri. Vektorigrafiikka ei ole tätä muotoa varten. Tämän muodon erikoisuus on, että se ei käytä pakkausmekanismia. Teoriassa sen pitäisi tarjota paras kuvanlaatu. Mutta ongelma on, että tällaisen kuvan koko on vain jättimäinen. Tästä syystä tämä rasterikuvamuoto on menettänyt suosionsa. BMP alkoi pudota Olympuksesta PNG:n ilmestymisen jälkeen. Tämä muoto mahdollisti paitsi korkealaatuisten kuvien tallentamisen pienessä koossa, myös kerrosten kanssa työskentelyn, mikä on erittäin tärkeää nykymaailmassa.

BMP-tiedosto on kuitenkin edelleen olemassa ja sitä käytetään. Siksi on tärkeää, että käyttäjät tietävät, kuinka tällaiset tiedostot avataan ja miten ne muunnetaan kätevämpiin muotoihin. Keskustelemme tästä nyt. On heti sanottava, että tällaisia ​​ohjelmia on paljon. Ja kaikki he pystyvät toimimaan riittävästi tämän muodon kanssa, koska se on melko vanha. Mutta muuntamisessa on joitain vivahteita, jotka kannattaa mainita.

Kuinka avata BMP

Tällä hetkellä enemmän tai vähemmän edistynyt graafisten tiedostojen katseluohjelma selviytyy tästä tehtävästä. Kummallista kyllä, jopa tavallinen Windows-katseluohjelma voi avata tämän muodon, vaikkakin kamalilla jarruilla. Mutta FS Image Viewer ja ACDSee tekevät parhaansa tässä tehtävässä. Sellaiset edistyneet tuotteet, kuten "Photoshop" ja "Korel" -editorit, pystyvät myös työskentelemään tämän muotoisten tiedostojen kanssa. Yleensä kaikki nykyaikaiset katsojat voivat lukea tämän muodon, koska se on melko vanha.

Kaikki yllä oleva koskee kuitenkin vain Windows-perheen käyttöjärjestelmiä. Kuinka avata BMP-tiedosto Linuxissa tai Mac OS:ssä? On olemassa erityisiä ohjelmistotuotteita, jotka tukevat tätä muotoa. Ja niitä on paljon. Joten ongelmia ei tule. Ja "Mac OS" tukee myös "Photoshopia", joka on kaikkiruokainen. Muiden multimediaohjelmien lisäksi.

Muunna BMP

Kuinka muuntaa BMP JPG:ksi tai johonkin muuhun tutumpaan muotoon? Kaikki riippuu siitä, mitä kuvanlaatua tulostukseen vaaditaan. Jos häviöiden pitäisi olla minimaalisia, on parempi käyttää "Photoshopia" tai jotain vastaavaa näihin tarkoituksiin. Vain "Photoshop" mahdollistaa kuvan tallentamisen laadun heikkenemättä. Ja jos käytät PNG- tai PSD-muotoa tallentamiseen, voit myös tallentaa tasoja. Jos laadulla ei ole väliä, voidaan käyttää mitä tahansa muuntimia. Melkein kaikki ne tukevat muuntamista JPEG-, PNG-, BMP- ja muihin suosittuihin muotoihin.

Ja jälleen, vain Windows-ohjelmat lueteltiin yllä. Linuxissa tai Mac OS:ssä muuntaminen on hieman erilaista. Applen järjestelmä tukee "Photoshopia", joten ei ole ongelma ohittaa BMP-kuva nopeasti toiseen muotoon laadun heikkenemättä. Mutta "Linuxissa" on käytettävä erilaisia ​​muuntimia, jotka eivät usein pysty tarjoamaan maksimaalista laatua.

Mihin tätä muotoa voidaan käyttää?

Vaikka BMP-muoto on moraalisesti vanhentunut, sitä voidaan silti käyttää joissakin tapauksissa. Se, että koko Windows-käyttöliittymä perustuu tähän rasterimuotoon, riittää. Miksi niin? Koska se on erittäin kätevä käyttää BMP. Siinä on hyvä kromaattisuus ja ei puristusta ollenkaan. Myös tässä muodossa olevia kuvia voidaan muokata kuinka monta kertaa tahansa. Ja laatu ei kärsi siitä ollenkaan. Toisin kuin sama JPEG. Juuri tämä selittää tämän muodon elinvoimaisuuden. Monet Windows-ohjelmistokehittäjät käyttävät myös aktiivisesti BMP-kuvia tuotteissaan.

Toinen muodon sovellusalue on tietokoneen BIOS. Joissakin on melko hyviä kuvia (saattaa sisältää valmistajan logon, joitain käyttöliittymäelementtejä jne.). Kaikki ne on tehty BMP-muodossa. Tällaiset rasterikuvat toimivat hyvin järjestelmissä, joissa ei ole riittävää graafista käyttöliittymää. Siksi niitä käytetään BIOSissa.

Koko

On huomattava, että hyvä kuva BMP-muodossa "painottaa" paljon. Asia on siinä, että tämä tiedostomuoto ei käytä pakkausta. Siksi kokoa ei voi pienentää. Esimerkiksi korkealaatuinen valokuva, jonka resoluutio on 1280 x 720 pikseliä, on kooltaan noin 300 megatavua. Tämä on tämän muodon erikoisuus.

Sisäinen rakenne ja laajennus

BMP-tiedoston rakennetta voidaan kuvata seuraavasti: se on yksikerroksinen bittikarttakuva, jolla on kunnollinen tiheys ja hyvä värintoisto. Tämä on muodon suurin haitta - se ei voi käyttää lisätasoja. Siksi ne on korvattu "verkossa" kehittyneemmillä muodoilla, jotka tukevat kerrostamista.

Johtopäätös

Joten tarkastelimme vanhaa, mutta paikoin edelleen käytettyä BMP-muotoa. Tämä on rasterikuvamuoto, jossa ei ole pakkausta ja joka on yhteensopiva lähes kaikkien ohjelmien kanssa, sekä katsojien että muokkaajien kanssa. Sitä voidaan käyttää nykyaikaisissa ohjelmissa saadakseen käyttöliittymän toimimaan. Ja Windows-käyttöjärjestelmässä sitä käytetään laajalti tähän päivään asti. Tämän muodon muuntaminen toiseksi ei ole vaikeaa. Tähän on olemassa valtava määrä sopivia ohjelmistoja. Eikä vain Windowsille. Yleensä tämä muoto säilyy edelleen kehittyneempien ja laadukkaampien syntymisestä huolimatta.

BMP(englannista. Bittikarttakuva) on Microsoftin kehittämä bittikarttatallennusmuoto.

Valtava määrä ohjelmia toimii BMP-muodon kanssa, koska sen tuki on integroitu Windows- ja OS / 2-käyttöjärjestelmiin. BMP-tiedostojen tunniste voi olla .bmp, .dib ja .rle. Lisäksi tässä muodossa olevat tiedot sisältyvät RES-binääriresurssitiedostoihin ja PE-tiedostoihin.

Microsoft kehitti heidän tarpeisiinsa myös ICO- ja CUR-formaatteja, joiden rakenne on samanlainen kuin BMP. Lisäksi jotkin GDI-alijärjestelmän WinAPI-toiminnot käyttävät tämän muodon rakenteita.

Värisyvyys tässä muodossa voi olla 1, 2, 4, 8, 16, 24, 32, 48 bittiä pikseliä kohden, mutta 2 bittiä pikseliä kohden ei ole virallisesti tuettu. Tässä tapauksessa alle 16 bitin värisyvyyksille käytetään palettia, jossa on täysvärikomponentteja, joiden syvyys on 24 bittiä.

BMP-muodossa kuvat voidaan tallentaa sellaisenaan tai käyttämällä joitain yleisiä pakkausalgoritmeja. Erityisesti BMP-muoto tukee RLE-häviötöntä pakkausta, ja nykyaikaiset käyttöjärjestelmät ja ohjelmistot mahdollistavat JPEG:n ja PNG:n käytön (nämä muodot on upotettu BMP:hen säilönä).

DIB ja DDB

Käytettäessä DIB-muotoa (eng. Laitteesta riippumaton bittikartta, laiteriippumaton rasteri) ohjelmoija pääsee käsiksi kaikkiin kuvaa kuvaavien rakenteiden elementteihin tavallisella osoittimella. Mutta näitä tietoja ei käytetä näytön ohjaamiseen suoraan, koska ne tallennetaan aina järjestelmän muistiin, ei omistettuun videomuistiin. RAM-muistin pikselimuoto voi poiketa formaatista, joka on syötettävä videomuistiin samanvärisen pisteen ilmaisemiseksi. Esimerkiksi DIB-muodossa pikselin määrittämiseen voidaan käyttää 24 bittiä ja grafiikkasovitin voi tällä hetkellä toimia HiColor-tilassa 16 bitin värisyvyydellä. Tässä tapauksessa kirkkaan punainen piste laitteesta riippumattomassa muodossa määritetään kolmella tavulla 0x0000ff ja videomuistissa sanalla 0xF800. Kun kopioidaan kuvaa näytölle, järjestelmä käyttää lisäaikaa värikoodien muuntamiseen 24-bittisestä videopuskurimuotoon.

Tiedostorakenteen yleiskatsaus

BMP-tiedosto koostuu neljästä osasta:

  1. Tiedoston otsikko (BITMAPFILEHEADER)
  2. Kuvan otsikko (BITMAPINFOHEADER, ei ehkä ole). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98 / Me, 2000 / XP)
  3. Paletti (ei ehkä ole mukana)
  4. Itse kuva

BITTIMAPFIHEADERI

Tämä rakenne sisältää tietoja tiedostossa olevien tietojen tyypistä, koosta ja esityksestä. Koko on 14 tavua.

Typedef struct tagBITMAPFILEHEADER (WORD bfType; // siirtää 0 tavua tiedoston alusta DWORD bfSize; // offset 2 tavua tiedoston alusta, pituus 4 tavua WORD bfVarattu1; WORD bfReserved2; DWORD bfOffBits; // offset 10 tavua tiedoston alusta, pituus 4 tavua) BITMAPFILEHEADER, * PBITMAPFILEHEADER;

WORD-tyypin tulee olla 16-bittinen, DWORD- ja LONG-tyyppien on oltava 32-bittinen, LONG-tyypin on oltava allekirjoitettu, tavujärjestyksen oletetaan olevan little endian.

  • bfType - tiedostotyyppi, merkit "BM" (HEX-muodossa: 0x42 0x4d).
  • bfSize on koko tiedoston koko tavuina.
  • bfReserved1 ja bfReserved2 ovat varattuja, ja niissä on oltava nollia.
  • bfOffBits - sisältää siirtymän tavuina BITMAPFILEHEADER-rakenteen alusta kuvan varsinaisiin bitteihin.

Tiedoston otsikon jälkeen

BITMAPINFOHEADER

Yksinkertaisin otsikkovaihtoehto. Windows NT3.51 ja aiemmat sovellukset voivat käyttää vain tätä rakennetta. Koko on 40 tavua.

Typedef struct tagBITMAPINFOHEADER (DWORD biSize, LONG biWidth, LONG biHeight, WORD biplanes, WORD biBitCount, DWORD biCompression, DWORD biSizeImage, LONG biXPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter, LONG biYPelsPerMeter; LONG biYPelsPerMeter; DWFORD biClrUsed

BiSize Tämän rakenteen koko tavuina. BMP-muotoa on täydennetty ajan myötä ja tämän kentän arvo määrittää muodon version. biWidth Kuvan leveys pikseleinä. Win98 / Me ja Win2000 / XP: jos biCompression sisältää BI_JPEG:n tai BI_PNG:n, tämä on puretun kuvan leveys. biHeight Kuvan korkeus pikseleinä. Jos se sisältää positiivisen arvon, kuva kirjoitetaan alhaalta ylös -järjestyksessä (nolla pikseliä vasemmassa alakulmassa). Jos arvo on negatiivinen, kuva kirjoitetaan ylhäältä alas (nolla pikseliä kuvan vasemmassa yläkulmassa). BiCompression on oltava BI_RGB tai BI_BITFIELDS. Tällaista kuvaa ei voi pakata. biPlanes Väritasojen lukumäärä ja BMP-muodossa sisältää yhden. biBitCount Bittien määrä pikseliä kohden. Se voi ottaa seuraavat arvot:

  • 0 - sopii Win98 / Me / 2000 / XP: lle. Bittiä pikseliä kohden määrittää JPEG- tai PNG-muodon.
  • 1 - yksivärinen kuva. BITMAPINFO-rakenteen bmiColors-jäsen sisältää kaksi jäsentä. Kukin kuvan bitti edustaa yhtä pikseliä; jos bitti on nolla, pikselillä on bmiColors-taulukon ensimmäisen elementin väri, muussa tapauksessa toisen väri.
  • 4 - kuudentoista värin kuva. Pikselit määritellään 4-bittisillä indekseillä, jokainen kuvan tavu sisältää tietoa kahdesta pikselistä - tärkeimmät 4 bittiä ensimmäiselle, loput - toiselle.
  • 8 - paletti sisältää jopa 256 väriä, jokainen kuvan tavu tallentaa palettiin indeksin yhdelle pikselille.
  • 16 - jos biCompression sisältää BI_RGB:n, tiedosto ei sisällä palettia. Kuvan joka toinen tavu tallentaa yhden pikselin punaisen, vihreän ja sinisen komponentin intensiteetin. Tässä tapauksessa merkittävintä bittiä ei käytetä, jokaiselle komponentille varataan 5 bittiä: 0RRRRRGGGGGBBBBB.
    Jos biCompression sisältää BI_BITFIELDS, paletti tallentaa kolme neljän tavun arvoa, jotka määrittelevät maskin jokaiselle kolmelle värikomponentille. Kutakin kuvan pikseliä edustaa 2-tavuinen arvo, josta värikomponentit erotetaan maskien avulla. WinNT / 2000 / XP:ssä - kunkin komponentin bittisekvenssien on seurattava jatkuvasti, ilman päällekkäisyyttä tai leikkaamista muiden komponenttien sekvenssien kanssa. Win95 / 98 / Me - vain seuraavat maskit ovat tuettuja: 5-5-5, jossa sinisen komponentin maski on 0x001F, vihreä on 0x03E0 ja punainen on 0x7C00; ja 5-6-5, joissa sinisen komponentin maski on 0x001F, vihreä on 0x07E0 ja punainen on 0xF800.
  • 24 - palettia ei käytetä, kuvan jokainen kolme tavua edustaa yhtä pikseliä, yksi tavu sinisen, vihreän ja punaisen kanavan intensiteetille.
  • 32 - Jos biCompression sisältää BI_RGB:n, kuva ei sisällä palettia. Jokainen kuvan neljä tavua edustaa yhtä pikseliä, yksi tavu sinisen, vihreän ja punaisen kanavan intensiteetille. Jokaisen 4:n merkittävin tavu ei yleensä käytetä, mutta sen avulla voit tallentaa alfakanavan dataa.
    Jos biCompression-kenttä sisältää arvon BI_BITFIELDS, paletti tallentaa kolme nelitavuista värimaskia - punaiselle, vihreälle ja siniselle komponentille. Kutakin kuvan pikseliä edustaa neljä tavua. WinNT / 2000: komponentimaskit eivät saa mennä päällekkäin. Windows 95/98 / Me: järjestelmä tukee vain yhtä pakkaustilaa, täysin analoginen ei-pakkaustilan BI_RGB kanssa - joka neljän korkea tavu käytetään alfakanavana, seuraavat kolme on varattu siniselle, vihreälle ja punaiselle kanavat, vastaavasti: 0xARRGGBB.
biCompression Pakatun kuvan pakkaustyyppi:
Merkitys Tunniste Puristus
0 BI_RGB pakkaamaton kuva
1 BI_RLE8 RLE-pakkaus 8-bittisille kuville
2 BI_RLE4 RLE-pakkaus 4-bittisille kuville
3 BI_BITFIELDS kuvaa ei ole pakattu, paletti sisältää kolme 4-tavuista maskia punaiselle, vihreälle ja siniselle värikomponentille. Käytetään 16- ja 32-bittisille kuville
4 BI_JPEG Win98 / Me / 2000 / XP: JPEG-pakkaus
5 BI_PNG Win98 / Me / 2000 / XP: PNG-pakkaus
6 BI_ALPHABITFIELDS WinCE: kuvaa ei ole pakattu, paletti sisältää neljä 4-tavuista maskia punaiselle, vihreälle, siniselle ja läpinäkyvälle (alfakanava) värikomponentille. Käytetään 16- ja 32-bittisille kuville
biSizeImage Kuvan koko tavuina. Saattaa sisältää nollan BI_RGB-kuville. Win98 / Me / 2000 / XP: Jos biCompression sisältää BI_JPEG:n tai BI_PNG:n, biSizeImage ilmaisee BI_JPEG- tai BI_PNG-kuvapuskurin koon. biXPelsPerMeter Kohdelaitteen vaakasuuntainen resoluutio pikseleinä metriä kohti. Sovellus voi käyttää tätä arvoa valitakseen kuvaresurssien ryhmästä, joka sopii parhaiten nykyiselle laitteelle. DPI 96:lle, jonka Microsoft hyväksyy näytöille, se on 3780 (jos lasket kaavalla (96 / 25.4) * 1000). biYPelsPerMeter Kohdelaitteen pystyresoluutio pikseleinä metriä kohti. biClrUsed Paletissa käytettyjen väriindeksien määrä. Jos arvo on nolla, kuva käyttää enimmäismäärää indeksejä biBitCount-arvon ja biCompressionissa määritetyn pakkaustavan mukaisesti.
Jos nollasta poikkeava arvo ja biBitCount on alle 16, biClrUsed määrittää värien määrän, jota laiteohjain tai sovellus käyttää. Jos biBitCount on suurempi tai yhtä suuri kuin 16, biClrUsed on paletin koko, jota käytetään optimoimaan järjestelmäpalettien suorituskyky. Jos biBitCount on 16 tai 32, optimaalinen paletti seuraa heti kolmen 4-tavun maskin jälkeen.
Pakatussa kuvassa pikselitaulukko seuraa välittömästi BITMAPINFO-rakenteen jälkeen, biClrUsedin tulee sisältää nolla tai paletin todellinen koko. biClrImportant Kuvan näyttämiseen tarvittavien palettikohteiden määrä. Jos se sisältää nollan, kaikki indeksit ovat yhtä tärkeitä.

BITMAPINFO-kehys yhdistää BITMAPINFOHEADERin ja paletin, joka tarjoaa täydellisen kuvauksen kuvan mitoista ja väreistä.

Löytääkseen paletin BITMAPINFO-rakenteesta sovelluksen on käytettävä biSizeen tallennettuja tietoja seuraavasti:

PColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-> bmiHeader.biSize));

Rasteri tallennetaan yleensä pystysuoraan peilattuina. Mutta on myös mahdollista tallentaa rasteri ei-pystysuoraan peilatussa näkymässä. BiHeight-parametri määrittää, että BMP:n rasteria ei peilata pystysuunnassa.

BITMAPV4HEADER

Laajennettu versio yllä olevasta rakenteesta. Win NT 3.51:n ja sitä vanhempien versioiden on käytettävä BITMAPINFOHEADER-rakennetta. Win98 / Me / 2000 / XP voi käyttää BITMAPV5HEADER-rakennetta BITMAPV4HEADER-rakenteen sijaan.

Typedef struct (DWORD bV4Size, LONG bV4Width, LONG bV4Height, WORD bV4Planes, WORD bV4BitCount, DWORD bV4V4Compression, DWORD bV4SizeImage, LONG bV4XPelsPerMeter, LONG bV4YPelsPerMeter, DWORD bV4ClrUsed, DWORD bV4ClrImportant, DWORD bV4RedMask, DWORD bV4GreenMask, DWORD bV4BlueMask, DWORD bV4AlphaMask; DWORD bV4CSType CIEXYZTRIPLE bV4 Päätepisteet DWORD bV4GammaPunainen DWORD bV4GammaVihreä DWORD bV4GammaBlue BITMAPV4HEADER * PBITMAPV4HEADER;

Kentät rakenteen alusta bV4ClrImportant mukaan lukien ovat samat kuin vastaavat BITMAPINFOHEADER-rakenteen kentät.

  • bV4RedMask - kunkin pikselin punaisen komponentin värimaski, käytetään vain, jos bV4Compression sisältää arvon BI_BITFIELDS.
  • bV4GreenMask - kunkin pikselin vihreän komponentin värimaski, käytetään vain, jos bV4Compression sisältää BI_BITFIELDS-arvon.
  • bV4BlueMask - kunkin pikselin sinisen komponentin värimaski, käytetään vain, jos bV4Compression sisältää BI_BITFIELDS-arvon.
  • bV4AlphaMask - maski, joka määrittää alfakanavakomponentin.
  • bV4CSType - Määrittää kuvan väriavaruuden.
  • bV4Endpoints on CIEXYZTRIPLE-rakenne, joka määrittää x-, y- ja z-koordinaatit kolmelle värille, jotka vastaavat kuvalle määritetyn väriavaruuden päätepisteitä. Tämä kenttä ohitetaan, jos bV4CSType ei sisällä LCS_CALIBRATED_RGB-arvoa.
  • bV4GammaRed - Punaisen komponentin sävykäyrä. Ohitetaan, jos bV4CSType ei sisällä LCS_CALIBRATED_RGB-arvoa. Ilmoitettu 16x16-muodossa.
  • bV4GammaGreen - Vihreän komponentin sävykäyrä. Ohitetaan, jos bV4CSType ei sisällä LCS_CALIBRATED_RGB-arvoa.
  • bV4GammaBlue - Sinisen komponentin sävykäyrä. Ohitetaan, jos bV4CSType ei sisällä LCS_CALIBRATED_RGB-arvoa.

BITMAPV5HEADER

Win95 / NT 4.0: Sovellukset voivat käyttää BITMAPV4HEADERia. Win NT 3.51:n ja sitä vanhempien versioiden on käytettävä BITMAPINFOHEADER-rakennetta.

Typedef struct (DWORD bV5Size, LONG bV5Width, LONG bV5Height, WORD bV5Planes, WORD bV5BitCount, DWORD bV5Compression, DWORD bV5SizeImage, LONG bV5XPelsPerMeter, LONG bV5YPelsPerMeter, DWORD bV5ClrUsed, DWORD bV5ClrImportant, DWORD bV5RedMask, DWORD bV5GreenMask, DWORD bV5BlueMask, DWORD bV5AlphaMask; DWORD bV5CSType ; CIEXYZTRIPLE bV5Päätepisteet; DWORD bV5GammaRed; DWORD bV5GammaGreen; DWORD bV5GammaBlue; DWORD bV5Intent; DWORD bV5ProfileData; DWORD bV5ProfileSize; DWORD bVHEAP5TMPserved; DWORD bVHEBITM5)

Kenttien osalta rakenteen alusta bV5GammaBlue mukaan lukien, kuvataan vain erot aiemmista versioista - BITMAPINFOHEADER ja BITMAPV4HEADER.

  • bV5CSType - määrittää kuvan väriavaruuden, voi ottaa seuraavat arvot:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - voi ottaa seuraavat arvot:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData - siirtymä tavuina rakenteen alusta profiilitietojen alkuun (profiilitiedoston nimi, merkkijono, joka koostuu yksinomaan kooditaulukon 1252 merkeistä ja päättyy nollaan tavuun). Ohitetaan, jos bV5CSType sisältää muun arvon kuin PROFILE_LINKED ja PROFILE_EMBEDDED.
  • bV5ProfileSize - profiilitietojen koko tavuina.
  • bV5Varattu - varattu. Sisältää nollan.

Paletti

Paletti voi sisältää neljän tavun kenttien sarjan käytettävissä olevien värien määrän mukaan (256 8-bittiselle kuvalle). Kunkin kentän kolme alhaista tavua määräävät punaisen, vihreän ja sinisen värikomponenttien intensiteetin, korkeaa tavua ei käytetä. Tässä tapauksessa jokaista kuvan pikseliä kuvataan yhdellä tavulla, joka sisältää sen palettikentän numeron, johon tämän pikselin väri on tallennettu.

Jos kuvan pikseliä kuvataan 16-bittisellä numerolla, paletti voi tallentaa kolme 2-tavuista arvoa, joista jokainen määrittää maskin, joka poimii 16-bittisestä pikselistä punaisen, vihreän ja sinisen värikomponentin.

BMP-tiedosto ei saa sisältää palettia, jos se sisältää pakkaamattoman täysvärisen kuvan.

Kuvatiedot

Pikselien sarja, joka on tallennettu muodossa tai toisessa. Pikselit tallennetaan rivi riviltä alhaalta ylös. Kukin kuvan rivi on täytetty nolilla, joiden pituus on neljän tavun kerrannainen.

Bmp-tiedostoissa, joiden värisyvyys on 24 bittiä, kunkin pikselin väritavut tallennetaan BGR-järjestyksessä (sininen, vihreä, punainen)

BMP-tiedostoissa, joiden värisyvyys on 32 bittiä, kunkin pikselin väritavut tallennetaan BGRA-järjestyksessä (sininen, vihreä, punainen, alfa)

Kuvan bitti

Esitettyjen värien lukumäärästä riippuen jokainen piste on allokoitu 1 - 48 bittiä:

  • 1 bitti - yksivärinen kuva (kaksi väriä).
  • 2 bittiä - 4 mahdollista väriä (CGA-toimintatilat) (2-bittinen tila ei ole virallisesti standardoitu, mutta sitä käytetään).
  • 4 bittiä - 16-värinen kuva (EGA-käyttötilat).
  • 8 bittiä (1 tavu) - 256 väriä, viimeinen tila, joka tukee indeksoituja värejä (katso alla).
  • 16 bittiä (2 tavua) - HiColor-tila, 5-6-5 = 65536 mahdollista sävyä, 5-5-5 = 32768 mahdollista sävyä.
  • 24 bittiä (3 tavua) - TrueColor. Koska 3 tavua ei korreloi kovin hyvin kahden potenssien kanssa (etenkin tallennettaessa tietoja muistiin, missä sanan tasaus on tärkeää), sen sijaan käytetään usein 32-bittistä kuvaa. TrueColor-tilassa kullekin kolmelle kanavalle on varattu 1 tavu (256 mahdollista arvoa) (RGB-tilassa), värien kokonaismäärä on yhtä suuri.
  • 32 bittiä (4 tavua) - tämä tila on melkein samanlainen kuin TrueColor, neljättä tavua ei yleensä käytetä tai alfakanava (läpinäkyvyys) sijaitsee siinä.
  • 48 bittiä (6 tavua) on harvoin käytetty formaatti, jossa on suurempi väritarkkuus (16 bittiä kanavaa kohti), jota tukee suhteellisen pieni määrä ohjelmia ja laitteita.

Indeksoidut värit

Kun bittien määrä on 1 (2 väriä), 2 (4 väriä), 4 (16 väriä) tai 8 (256 väriä) pikseliä kohden, voidaan käyttää erityistä indeksoitua väritilaa. Tässä tapauksessa kutakin pikseliä vastaava numero ei osoita väriä, vaan värin numeroa paletissa. Paletin käytön ansiosta kuva on mahdollista mukauttaa kuvassa oleviin väreihin. Tässä tapauksessa kuvaa eivät rajoita määritetyt värit, vaan samanaikaisesti käytettyjen värien enimmäismäärä.

Esimerkkiohjelma

Seuraava ohjelma avaa 24-bittisen BMP-tiedoston XWindowissa, värisyvyyden tulee olla 32 bittiä, se ei toimi pienemmällä värintoistolla, koska tämä monimutkaistaa esimerkkiä:

/ * Käännetty rivillä: cc -o xtest xtest.c -I / usr / X11R6 / include -L / usr / X11R6 / lib -lX11 -lm * /#sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #sisältää #include "bitmap.h" / * Tässä ovat BMP-otsikoiden määritelmät, kuten aiemmin tässä artikkelissa on kuvattu * / staattinen XImage * CreateImageFromBuffer (Näyttö *, allekirjoittamaton merkki *, int, int); main (int argc, char * argv) (Näyttö * dis; Window win; / * Ikkunamme * / XEvent-tapahtuma; / * Tapahtumat * / GC gc; / * Graafinen konteksti * / XImage * kuva; int n, leveys, korkeus, fd, koko; allekirjoittamaton merkki * data; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; char * buf; jos (argc< 2 ) { perror ("use: xtest file.bmp\ n "); uloskäynti (1); ) if ((fd = avoin (argv [1], O_RDONLY)) == - 1) (printf ("Virhe bittikartan avaamisessa \ n "); uloskäynti (1); ) lukea (fd, & bmp, koko (BITMAPFILEHEADER)); lukea (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; ) else (koko = inf.biSizeImage;) buf = malloc (koko); if (buf == NULL) (error ("malloc"); exit (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 luettua \ n", n); image = CreateImageFromBuffer (dis, buf, leveys, korkeus); / * Poista puskuri - emme tarvitse sitä enää * / vapaa (buf); XMapWindow (dis, win); XSelectInput (dis, win, ExposureMask | KeyPressMask); while (1) (XNextEvent (dis, & tapahtuma); if (event.xany .window == win) (kytkin (tapahtuma.tyyppi) (case Expose: XPutImage (dis, win, gc, image, 0, 0, 0) , 0, kuva-> leveys, kuva-> korkeus); tauko; kirjainkoko KeyPress: if (XLookupKeysym (& event.xkey, 0) == XK_q) (XDestroyImage (kuva); XCloseDisplay (dis); sulje (fd); poistu (EXIT_SUCCESS);) tauko; oletus: tauko;)))) / * Luo X-kuvan BMP-tiedostosta, koska BMP-kuva tallennetaan kierrettynä * ja peilataan - tämä korjataan silmukassa * / XImage * CreateImageFromBuffer (Näyttö * dis, unsigned char * buf, int leveys, int korkeus) (int syvyys, näyttö; XImage * img = NULL; int i, j; int numBmpBytes; koko_t numImgBytes; int32_t * int intgBuf ; int line; int temp; int ih, iw; / * Rivi- ja sarakenumerot vastaamaan * / int uusi_ind; / * Uusi hakemisto * / näyttö = Oletusnäyttö (dis); syvyys = DefaultDepth (dis, näyttö); lämpötila = leveys * 3; viiva = lämpötila + leveys% 4; / * Viivan pituus, mukaan lukien kohdistus * / numImgBytes = (4 * (leveys * korkeus)); imgBuf = malloc (numImgBytes); / * Tiedostossa BMP:lle varattu koko ottaen huomioon kohdistuksen * / numBmpBytes = rivi * korkeus; for (i = 0; i< numBmpBytes; i++ ) { unsigned int r, g, b; / * Ohita täyte * / if (i> = temp && (i% rivi)> = lämpötila) jatka; b = buf [i]; i ++; g = buf [i]; i ++; r = buf [i]; / * Laske uusi indeksi pystyheijastukselle * / 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, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; / * PC:n bittien ja tavujen järjestyksen tulisi olla tämä * / img-> byte_order = MSBFirst; img-> bitmap_bit_order = MSBFirst; palauta img; )