Waaruit bestaat bmp? BMP-gegevensformaat (bitmap).

Er werd gedacht aan een klein programma dat de sprite over het scherm bewoog, maar helaas zag het er niet uit zoals we zouden willen. In dit artikel zullen we proberen de sprite “op te ruimen”.

We hebben de sprite-afbeelding verkregen uit een Bmp-bestand; uit dezelfde bestanden kunnen we de afbeelding van de achtergrond, muiscursor en interface-elementen halen. Wat we op het scherm zien is echter niet precies wat we hadden verwacht: het beeld bleek ondersteboven te staan ​​en bovendien met andere kleuren dan vereist. Laten we dus leren hoe we Bmp-bestanden correct kunnen lezen en de afbeelding “van top tot teen” kunnen draaien.

Door beslissing van de ontwikkelaars is het Bmp-bestandsformaat niet gebonden aan een specifiek hardwareplatform. Dit bestand bestaat uit vier delen: een koptekst, een informatiekop, een kleurentabel (palet) en afbeeldingsgegevens. Als het bestand een afbeelding opslaat met een kleurdiepte van 24 bits (16 miljoen kleuren), ontbreekt de kleurentabel mogelijk, maar in ons geval met 256 kleuren is deze er wel. De structuur van elk deel van een bestand waarin een afbeelding met 256 kleuren is opgeslagen, wordt gegeven in , en de overeenkomstige recordtypen worden gegeven in .

De bestandskop begint met handtekeningen"BM" gevolgd door de lengte van het bestand, uitgedrukt in bytes. De volgende 4 bytes zijn gereserveerd voor verdere formaatuitbreidingen, en deze header eindigt verplaatsing vanaf het begin van het bestand tot de beeldgegevens die erin zijn opgenomen. Met 256 kleuren is deze offset 1078 - dit is precies hoeveel we in ons vorige programma moesten overslaan om bij de gegevens te komen.

De informatiekop begint met zijn eigen lengte (dit kan variëren, maar voor een bestand met 256 kleuren is dit 40 bytes) en bevat de afbeeldingsafmetingen, resolutie, kleurpresentatiekenmerken en andere parameters.

Breedte en hoogte van afbeelding zijn gespecificeerd op rasterpunten en behoeven waarschijnlijk geen uitleg.

Aantal vliegtuigen kan worden gebruikt in bestanden met een lage kleurdiepte. Wanneer het aantal kleuren 256 of meer is, is het altijd gelijk aan 1, dus dit veld kan nu als verouderd worden beschouwd, maar vanwege de compatibiliteit blijft het behouden.

Kleuren diepte wordt beschouwd als het belangrijkste kenmerk van de manier waarop kleur in een bestand wordt weergegeven en wordt gemeten in bits per punt. In dit geval is het gelijk aan 8.

Compressie. Het wordt meestal niet gebruikt in Bmp-bestanden, maar er is wel een veld in de header voor voorzien. Meestal is dit 0, wat betekent dat de afbeelding niet is gecomprimeerd. In de toekomst zullen we alleen dergelijke bestanden gebruiken.

Afbeeldingsgrootte- het aantal bytes geheugen dat nodig is om deze afbeelding op te slaan, de paletgegevens niet meegerekend.

Horizontale en verticale resoluties gemeten in rasterpunten per meter. Ze zijn vooral belangrijk voor het behouden van de schaal van gescande afbeeldingen. Afbeeldingen die met grafische editors zijn gemaakt, hebben meestal nullen in deze velden.

Aantal kleuren Hiermee kunt u de grootte van de palettabel verkleinen als de afbeelding feitelijk minder kleuren bevat dan de geselecteerde kleurdiepte toestaat. In de praktijk worden dergelijke bestanden echter vrijwel nooit gevonden. Als het aantal kleuren het maximum is dat is toegestaan ​​door de kleurdiepte, bijvoorbeeld 256 kleuren bij 8 bits, wordt het veld op nul gezet.

Aantal primaire kleuren- komt uit het begin van het palet en het is raadzaam om het zonder vervorming weer te geven. Dit veld is belangrijk als het maximale aantal weergavekleuren kleiner was dan in het Bmp-bestandspalet. Bij de ontwikkeling van het formaat is er uiteraard van uitgegaan dat de meest voorkomende kleuren aan het begin van de tabel zouden staan. Nu wordt deze eis praktisch niet nageleefd, d.w.z. kleuren worden niet geordend op basis van de frequentie waarmee ze in het bestand voorkomen. Dit is erg belangrijk, omdat de paletten van twee verschillende bestanden, zelfs samengesteld uit dezelfde kleuren, deze (de kleuren) in een andere volgorde zouden bevatten, wat de gelijktijdige weergave van dergelijke afbeeldingen op het scherm aanzienlijk zou kunnen bemoeilijken.

De informatiekop wordt gevolgd door een kleurentabel, een array van 256 (in aantal kleuren) velden van 4 bytes. Elk veld komt overeen met een kleur in het palet, en drie van de vier bytes komen overeen met de blauwe, groene en rode componenten van die kleur. De laatste, meest significante byte van elk veld is gereserveerd en gelijk aan 0.

Na de kleurentabel bevinden zich afbeeldingsgegevens, die langs de rasterlijnen van onder naar boven en binnen de lijn worden geschreven - van links naar rechts. Omdat het op sommige platforms onmogelijk is om een ​​data-eenheid te lezen die kleiner is dan 4 bytes, wordt de lengte van elke lijn uitgelijnd met een grens van 4 bytes, d.w.z. als de lijnlengte geen veelvoud van vier is, wordt deze opgevuld met nullen. Met deze omstandigheid moet rekening worden gehouden bij het lezen van het bestand, hoewel het misschien beter is om er vooraf voor te zorgen dat de horizontale afmetingen van alle afbeeldingen een veelvoud van 4 zijn.

Zoals we al hebben gezegd, is het bestandsformaat ontworpen om universeel te zijn voor verschillende platforms, dus het is niet verrassend dat de paletkleuren daarin anders worden opgeslagen dan gebruikelijk is voor VGA. Tijdens de leesprocedure wordt de noodzakelijke hercodering uitgevoerd. (In de volgende artikelen zullen we bespreken wat het VGA-palet is en hoe u ermee kunt werken.)

De module voor het lezen van 256-kleuren Bmp-bestanden kent slechts twee procedures. Zoals uit de lijst blijkt, moeten de afbeeldingsafmetingen worden doorgegeven aan de ReadBMP-bestandleesprocedure. Dit is handig als de afbeelding niet volledig hoeft te worden gelezen. Wanneer de maten vooraf bekend zijn, levert dit geen problemen op, maar het zou goed zijn als met behulp van onze module alle afbeeldingen kunnen worden gelezen, ook afbeeldingen waarvan de grootte vooraf onbekend is. Voor dit doel is de ReadBMPheader-procedure beschikbaar, die alleen de bestandsheader leest. Door het aan te roepen, kunt u controleren of de afbeelding is opgenomen in het geselecteerde 256-kleurenformaat, de afmetingen ervan achterhalen en er vervolgens geheugen voor toewijzen en in de toegewezen buffer plaatsen.

Laten we nu een nieuwe module aan ons programma koppelen. Om dit te doen, schrijven we de naam ervan in de gebruiksrichtlijn en bieden we ook een array voor het opslaan van gegevens over het palet, die als volgt kan worden beschreven:

P: arrayvan byte;

De CreateSprite-procedure, die de bewerking van het lezen van een bestand uit een nieuwe module aanroept, is vereenvoudigd (zie).

Bmp-bestandsstructuur

Naam Lengte Vooroordeel Beschrijving
Bestandskop (BitMapFileHeader)
Type2 0 Handtekening "BM"
Maat4 2 bestandsgrootte
Gereserveerd 12 6 Gereserveerd
Gereserveerd 22 8 Gereserveerd
OffsetBits4 10 Afbeeldingsverschuiving vanaf het begin van het bestand
Informatiekop (BitMapInfoHeader)
Maat4 14 Lengte kop
Breedte4 18 Afbeeldingsbreedte, punten
Hoogte4 22 Beeldhoogte, punten
Vliegtuigen2 26 Aantal vliegtuigen
BitAantal2 28 Kleurdiepte, bits per punt
Compressie4 30 Compressietype (0 - ongecomprimeerde afbeelding)
GrootteAfbeelding4 34 Afbeeldingsgrootte, bytes
XpelsPerMeter4 38 Horizontale resolutie, dots per meter
JapelsPerMeter4 42 Verticale resolutie, dots per meter
KleurenGebruikt4 46 Aantal gebruikte kleuren (0 is het maximaal mogelijke voor een bepaalde kleurdiepte)
KleurenBelangrijk4 50 Aantal primaire kleuren
Kleurentabel (palet)
Kleurentabel1024 54 256 elementen van 4 bytes
Beeldgegevens (BitMap-array)
AfbeeldingMaat1078 Beeld opgenomen in rijen van links naar rechts en van onder naar boven

Lijst 1

eenheid bmpread; (procedures voor het werken met Bmp) interfacetype artype = arrayof byte; arptr = ^artype; bmFileHeader = record (bestandskop) Typf: woord; (handtekening) Maat: longint; (bestandslengte in bytes) Res1: woord; (gereserveerd) Res2: woord; (gereserveerd) OfBm: longint; (beeldverschuiving in bytes (1078)) einde; bmInfoHeader = record (informatiekop) Grootte: longint; (headerlengte in bytes (40)) Breedte: longint; (beeldbreedte (in pixels)) Heig: longint; (afbeeldingshoogte (in pixels)) Plattegrond: woord; (aantal vlakken (1)) BitC: woord; (kleurdiepte (bits per punt) (8)) Comp: longint; (compressietype (0 - nee)) Maat: longint; (afbeeldingsgrootte in bytes) XppM: longint; (horizontale resolutie) ((punten per meter - meestal 0)) YppM: longint; (verticale resolutie) ((dots per meter - meestal 0)) NCoL: longint; (aantal kleuren) ((als het toegestane maximum 0 is)) NCoI: longint; (aantal primaire kleuren) einde; bmHeader = record (volledige bestandskop) f: bmFileHeader; (bestandskop) i: bmInfoHeader; (informatiekop) p: arrayof byte; (palettafel) einde; bmhptr = ^bmHeader; (een afbeelding uit een Bmp-bestand lezen) procedure ReadBMP(afbeelding:arptr; (array met afbeelding) xim,yim:word; (afmetingen) pal:arptr; (palet) bestandsnaam:string); (bestandsnaam) (Bmp-bestandskop lezen) procedure ReadBMPheader(header:bmhptr;bestandsnaam:string); implementatie ($R-) (een afbeelding uit een Bmp-bestand lezen) procedure ReadBMP(image:arptr; xim,yim:word; pal:arptr; bestandsnaam:string); var h: bmHeader; ik:geheel getal; bmpbestand: bestand; s: longint; begin toewijzen(bmpbestand,bestandsnaam); reset(bmpbestand,1); blockread(bmpbestand,h,groottevan(h)); (lees header) for i:= 0 tot yim-1 do begin (lees regel voor regel) blockread(bmpfile,image^[(yim-i-1)*xim],xim); als (xim mod 4)<>0 en vervolgens blockread(bmpfile,s,4 - (xim mod 4)); einde;

close(bmpbestand); for i ^= 0 tot 255 do begin (palettransformatie) pal^ := h.p shr 2; (blauw) pal^ := h.p shr 2; (groen) pal^ := h.p shr 2; (rood) einde; einde; (de header van een Bmp-bestand lezen) procedure ReadBMPheader(header:bmhptr;bestandsnaam:string); var bmpbestand:bestand; begin toewijzen(bmpbestand,bestandsnaam); reset(bmpbestand,1); blockread(bmpbestand,koptekst^,groottevan(koptekst^)); close(bmpbestand); einde; einde.

( sprite) procedure CreateSprite(s:string; x,y,dx,dy:geheel getal); var f: bestand; (bestand met sprite-afbeelding) begin getmem(Sprt.Img,sizeof(SpriteArrayType)); (geheugen toewijzen voor de sprite) getmem(Sprt.Back,sizeof(SpriteArrayType)); (geheugen toewijzen voor de buffer) Readbmp(@(Sprt.Img^),Xsize,Ysize,@p,s); Sprt.x:= x; Sprt.y:=y; (stel de initiële waarden in) Sprt.dx:= dx; (coördinaten en stappen) Sprt.dy:= dy; einde;

BMP is een populair beeldformaat zonder datacompressie. Laten we eens kijken welke programma's u kunt gebruiken om afbeeldingen te bekijken met deze extensie.

Waarschijnlijk hebben velen al geraden dat, aangezien het BMP-formaat wordt gebruikt om afbeeldingen weer te geven, je de inhoud van deze bestanden kunt bekijken met behulp van afbeeldingsviewers en grafische editors. Bovendien kunnen enkele andere applicaties, zoals browsers en universele viewers, deze taak aan. Vervolgens zullen we kijken naar het algoritme voor het openen van BMP-bestanden met behulp van specifieke software.

Methode 1: FastStone Imageviewer

Laten we beginnen met de populaire afbeeldingsviewer FastStone Viewer.


Methode 2: IrfanView

Laten we nu eens kijken naar het proces van het openen van een BMP in een andere populaire afbeeldingsviewer IrfanView.


Methode 3: XnView

De volgende afbeeldingsviewer waarin we zullen kijken naar het openen van een BMP-bestand is XnView.


Methode 4: Adobe Photoshop

Laten we nu verder gaan met het beschrijven van het algoritme van acties voor het oplossen van het beschreven probleem in grafische editors, te beginnen met de populaire applicatie Photoshop.


Het grootste nadeel van deze methode is dat de Photoshop-applicatie betaald wordt.

Methode 5: Gimp

Een andere grafische editor die BMP kan weergeven is Gimp.


Vergeleken met de vorige methode profiteert deze van het feit dat de Gimp-applicatie geen betaling vereist voor het gebruik ervan.

Methode 6: OpenOffice

De grafische editor Draw, die is opgenomen in het gratis OpenOffice-pakket, kan deze taak ook met succes aan.


Methode 7: Google Chrome

Niet alleen grafische editors en afbeeldingsviewers kunnen BMP openen, maar ook een aantal browsers, bijvoorbeeld Google Chrome.


Methode 8: Universele kijker

Een andere groep programma's die met BMP kunnen werken zijn universele viewers, waaronder de Universal Viewer-applicatie.


Methode 9: Verf

De methoden voor het openen van BMP met geïnstalleerde programma's van derden zijn hierboven vermeld, maar Windows heeft zijn eigen grafische editor: Paint.


Methode 10: Windows Fotoviewer

Windows heeft ook een ingebouwde viewer voor alleen afbeeldingen die kan worden gebruikt om BMP te starten. Laten we eens kijken hoe we dit kunnen doen met Windows 7 als voorbeeld.


Zoals je kunt zien, is er een vrij grote lijst met programma's die BMP-afbeeldingen kunnen openen. En dit zijn niet allemaal, maar alleen de meest populaire. De keuze voor een specifieke applicatie hangt af van de persoonlijke voorkeuren van de gebruiker, maar ook van de gestelde doelen. Als u alleen maar naar een tekening of foto wilt kijken, is het beter om afbeeldingsviewers te gebruiken en voor het bewerken afbeeldingseditors te gebruiken. Bovendien kunnen zelfs browsers als alternatief voor weergave worden gebruikt. Als de gebruiker geen extra software op de computer wil installeren om met BMP te werken, kan hij de ingebouwde Windows-software gebruiken om afbeeldingen te bekijken en te bewerken.

Het bmp-bestandsformaat is een rasterafbeelding en is behoorlijk populair. Het wordt door elk Windows-besturingssysteem goed “begrepen”.

Het openen van een bestand met de extensie bmp op uw computer zou automatisch moeten gebeuren - dubbelklik er gewoon op met de linkermuisknop.

Als dit bij u niet gebeurt, is de bestandsassociatie hoogstwaarschijnlijk verbroken en moet het systeem handmatig opgeven waarmee het moet worden geopend.

Om dit te doen, klikt u met de rechtermuisknop op uw bmp-bestand, verplaatst u de cursor naar de regel "openen met" en selecteert u een programma (indien geïnstalleerd) van uw keuze, bijvoorbeeld Paint.

Welk programma om de bmp-extensie te openen

De eenvoudigste manier om het bmp-formaat te openen is in het Windows-fotoalbumprogramma. Het is niet nodig om het te downloaden - het wordt geleverd met het besturingssysteem, dat wil zeggen dat iedereen het zou moeten hebben.

Het tweede programma is “verf”. Het is ook niet nodig om het te downloaden - het is standaard in Windows ingebouwd, bovendien kun je niet alleen de bmp-extensie bewerken, maar na het openen ook opslaan in een ander formaat, bijvoorbeeld jpg - voor weergave op je telefoon .

Het derde programma is “PhotoScape”. Je zult het moeten downloaden. Het is gratis, in het Russisch en met zijn hulp kun je naast het bekijken ook bmp-afbeeldingen verwerken.

De vierde Paint.NET-applicatie. Het is ook gratis, heeft een Russische interface, is handig en heel gemakkelijk te gebruiken, met veel tools voor het aanpassen en bewerken van afbeeldingen en foto's - het is als een vervanging voor de standaard "Paint"

Vijfde programma "GIMP". Het wordt vergeleken met Photoshop. Dit is een gratis grafische editor voor professioneel gebruik die over alle benodigde functies beschikt en zich kenmerkt door eenvoud.

De hierboven genoemde programma's die bestanden in dit formaat openen, zijn niet allemaal. Er zijn er tientallen, maar deze zijn voldoende voor de gemiddelde computergebruiker. Succes.

Moderne mensen werken vaak met digitale afbeeldingen van verschillende formaten. Ze worden gebruikt op internet, op een computer, op een smartphone, in een digitale camera, in actiecamera's en andere apparaten. Maar er is één formaat dat sommige gebruikers in verwarring kan brengen: BMP. Dit is niet een bijzonder gebruikelijk type afbeelding (tenminste tegenwoordig), maar het is nog steeds te zien. Daarom zou het leuk zijn om te begrijpen wat hij is. Laten we proberen de vraag te beantwoorden wat het BMP-formaat is. Maar eerst moeten we het hebben over de geschiedenis van zijn oorsprong. Dit zal je helpen begrijpen waarom het überhaupt is gemaakt. Laten we dus beginnen met de geschiedenis van het creëren van het BMP-formaat.

Achtergrond

Rond 1994 hadden ontwikkelaars een nieuw afbeeldingsformaat nodig voor gebruik in softwareproducten. De criteria waren streng. Het formaat moest werken met een palet van 256 kleuren en een gezond formaat hebben. Het BMP-formaat werd al snel geïntroduceerd. Dit was destijds een echte doorbraak. Het werd bijna overal op grote schaal gebruikt. Zelfs bij Microsoft, die het heeft ontwikkeld.

Jaren gingen echter voorbij en er was geen vraag meer naar dit formaat. Er zijn veel geavanceerdere compressietechnologieën verschenen. Tegelijkertijd was de kleurkwaliteit van de nieuwe formaten veel beter. Nu wordt BMP alleen in sommige programma's gebruikt. En zelfs dan, alleen bij degenen wier ontwikkelaars zich niet druk maakten over de interface, bijvoorbeeld Windows OS. Het BMP-bestand is hopeloos verouderd. Maar om de een of andere reden gebruiken ze het nog steeds. Laten we nu proberen te begrijpen wat voor soort dier dit is.

Wat is BMP?

BMP is een bestandstype voor het opslaan van bitmapafbeeldingen. Alleen raster. Vectorafbeeldingen zijn niet voor dit formaat. De eigenaardigheid van dit formaat is dat het geen compressiemechanisme gebruikt. In theorie zou het de hoogste beeldkwaliteit moeten bieden. Maar het probleem is dat de omvang van zo'n afbeelding simpelweg gigantisch zal zijn. Dat is de reden waarom dit rasterafbeeldingsformaat aan populariteit heeft ingeboet. De val van BMP van Olympus begon na de verschijning van PNG. Dit formaat maakte het niet alleen mogelijk om afbeeldingen van hoge kwaliteit op klein formaat op te slaan, maar ook om met lagen te werken, wat erg belangrijk is in de moderne wereld.

Het BMP-bestand bestaat echter nog steeds en is in gebruik. Daarom is het belangrijk dat gebruikers weten hoe ze dergelijke bestanden moeten openen en hoe ze deze naar handiger formaten kunnen converteren. Dit is wat we nu zullen bespreken. Het is de moeite waard om meteen te zeggen dat er heel veel van dergelijke programma's zijn. En ze kunnen allemaal adequaat met dit formaat werken, omdat het vrij oud is. Maar de conversie heeft zijn eigen nuances die het vermelden waard zijn.

Hoe BMP te openen

Op dit moment kan een min of meer geavanceerde grafische bestandsviewer deze taak aan. Vreemd genoeg kan zelfs een standaard Windows-viewer dit formaat openen, zij het met vreselijke remmen. Maar FS Image Viewer en ACDSee kunnen deze taak het beste aan. Dergelijke geavanceerde producten als Photoshop en editors van Corel kunnen ook met bestanden van dit formaat werken. Over het algemeen kunnen alle moderne kijkers dit formaat lezen, omdat het vrij oud is.

Al het bovenstaande is echter alleen van toepassing op besturingssystemen uit de Windows-familie. Hoe open je een BMP-bestand in Linux of Mac OS? Er zijn gespecialiseerde softwareproducten die dit formaat ondersteunen. En dat zijn er veel. Er zullen dus geen problemen zijn. En Mac OS ondersteunt ook Photoshop, dat volledig omnivoor is. Naast andere multimediaprogramma's.

BMP-conversie

Hoe BMP naar JPG of een ander, gebruikelijker formaat converteren? Het hangt allemaal af van welke beeldkwaliteit vereist is bij de uitvoer. Als de verliezen minimaal moeten zijn, is het beter om voor deze doeleinden Photoshop of iets gelijkwaardigs te gebruiken. Alleen in Photoshop kun je een afbeelding opslaan zonder kwaliteitsverlies. En als u PNG- of PSD-formaten gebruikt om op te slaan, kunt u ook lagen opslaan. Als kwaliteit er niet toe doet, kunt u elke converter gebruiken. Bijna allemaal ondersteunen ze conversie naar JPEG, PNG, BMP en andere populaire formaten.

En nogmaals, hierboven werden alleen programma's voor Windows vermeld. In Linux of Mac OS zijn de zaken met conversie enigszins anders. Het systeem van Apple ondersteunt Photoshop, dus een BMP-afbeelding snel omzetten naar een ander formaat zonder kwaliteitsverlies is geen probleem. Maar in Linux moet je een verscheidenheid aan converters gebruiken, die vaak niet de maximale kwaliteit kunnen bieden.

Waar kan dit formaat voor worden gebruikt?

Hoewel het BMP-formaat verouderd is, kan het in sommige gevallen nog steeds worden gebruikt. Het is voldoende dat de gehele Windows-interface op dit rasterformaat is gebaseerd. Waarom is dat? Omdat het gebruik van BMP erg handig is. Het heeft een goede kleur en een volledig gebrek aan compressie. Bovendien kunnen afbeeldingen in dit formaat een onbeperkt aantal keren worden bewerkt. En de kwaliteit zal er helemaal niet onder lijden. In tegenstelling tot dezelfde JPEG. Dit is precies wat de vitaliteit van dit formaat verklaart. Veel ontwikkelaars van Windows-programma's gebruiken ook actief BMP-afbeeldingen in hun producten.

Een ander toepassingsgebied van het formaat zijn computer-BIOS. Sommigen van hen hebben zeer goede afbeeldingen (mogelijk bevatten ze het logo van de fabrikant, enkele interface-elementen, enz.). Ze zijn allemaal gemaakt in BMP-formaat. Rasterafbeeldingen van dit type presteren goed in systemen zonder een adequate grafische interface. Dat is de reden waarom ze in BIOS'en worden gebruikt.

Maat

Het is vermeldenswaard dat een goede foto in BMP-formaat veel zal "wegen". Het punt is dat dit bestandsformaat geen compressie gebruikt. Daarom kan de omvang niet worden verkleind. Een foto van hoge kwaliteit met een resolutie van 1280 bij 720 pixels heeft bijvoorbeeld een grootte van ongeveer 300 megabytes. Dit is de eigenaardigheid van dit formaat.

Interne structuur en uitbreiding

De structuur van een BMP-bestand kan als volgt worden beschreven: het is een rasterafbeelding met één laag en een behoorlijke dichtheid en goede kleurweergave. Dit is het belangrijkste nadeel van het formaat: er kunnen geen extra lagen worden gebruikt. Daarom werden ze op het ‘web’ verdrongen door geavanceerdere formaten die meerdere lagen ondersteunen.

Conclusie

We hebben dus gekeken naar het oude, maar op sommige plaatsen nog steeds gebruikte BMP-formaat. Dit is een rasterafbeeldingsformaat dat de afwezigheid van enige compressie kent en compatibel is met vrijwel alle programma's, zowel kijkers als editors. Het kan in moderne programma's worden gebruikt om ervoor te zorgen dat de interface werkt. En in het Windows-besturingssysteem wordt het tot op de dag van vandaag veel gebruikt. Het converteren van dit formaat naar een ander formaat is niet moeilijk. Hiervoor bestaat een enorme hoeveelheid geschikte software. En niet alleen voor Windows. Over het algemeen zal dit formaat nog steeds bestaan, ondanks de opkomst van meer geavanceerde en hoogwaardige formaten.

BMP(van Engels Bitmapafbeelding) is een opslagformaat voor rasterafbeeldingen ontwikkeld door Microsoft.

Een groot aantal programma's werken met het BMP-formaat, omdat de ondersteuning ervan is geïntegreerd in de Windows- en OS/2-besturingssystemen. BMP-bestanden kunnen de extensies .bmp, .dib en .rle hebben. Bovendien worden gegevens in dit formaat opgenomen in binaire RES-bronbestanden en PE-bestanden.

Microsoft heeft voor zijn behoeften ook ICO- en CUR-formaten ontwikkeld, die een structuur hebben die vergelijkbaar is met BMP. Bovendien worden structuren uit dit formaat gebruikt door sommige WinAPI-functies van het GDI-subsysteem.

Kleurdiepten in dit formaat kunnen 1, 2, 4, 8, 16, 24, 32, 48 bits per pixel zijn, maar 2 bits per pixel wordt officieel niet ondersteund. In dit geval wordt voor kleurdiepten van minder dan 16 bits een palet met full-color componenten met een diepte van 24 bits gebruikt.

In het BMP-formaat kunnen afbeeldingen worden opgeslagen zoals ze zijn of met behulp van enkele algemene compressie-algoritmen. In het bijzonder ondersteunt het BMP-formaat RLE-compressie zonder kwaliteitsverlies, en moderne besturingssystemen en software maken het gebruik van JPEG en PNG mogelijk (deze formaten zijn als container in BMP ingebouwd).

DIB en DDB

Bij gebruik van het DIB-formaat Apparaatonafhankelijke bitmap, apparaatonafhankelijk raster), heeft de programmeur toegang tot alle elementen van de structuren die de afbeelding beschrijven met behulp van een gewone aanwijzer. Maar deze gegevens worden niet gebruikt om het scherm rechtstreeks te bedienen, omdat deze altijd in het systeemgeheugen worden opgeslagen en niet in een speciaal videogeheugen. Het pixelformaat in RAM kan verschillen van het formaat dat in het videogeheugen moet worden opgeslagen om een ​​punt met dezelfde kleur weer te geven. Het DIB-formaat kan bijvoorbeeld 24 bits gebruiken om een ​​pixel te specificeren, en op dit moment kan de grafische adapter in HiColor-modus werken met een kleurdiepte van 16 bits. In dit geval wordt de heldere rode stip gespecificeerd in een hardware-onafhankelijk formaat met drie bytes 0x0000ff, en in het videogeheugen met het woord 0xF800. Bij het kopiëren van een afbeelding naar het scherm zal het systeem extra tijd besteden aan het converteren van kleurcodes van het 24-bits formaat naar het videobufferformaat.

Overzicht bestandsstructuur

Het BMP-bestand bestaat uit vier delen:

  1. Bestandskop (BITMAPFILEHEADER)
  2. Titel van afbeelding (BITMAPINFOHEADER, ontbreekt mogelijk). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Palet (misschien ontbreekt)
  4. Het beeld zelf

BITMABESTANDHEADER

Deze structuur bevat informatie over het type, de grootte en de weergave van de gegevens in het bestand. Grootte 14 bytes.

Typedef struct tagBITMAPFILEHEADER ( WORD bfType; // offset 0 bytes vanaf het begin van het bestand DWORD bfSize; // offset 2 bytes vanaf het begin van het bestand, lengte 4 bytes WORD bfGereserveerd1; WORD bfGereserveerd2; DWORD-bfOffBits; // offset 10 bytes vanaf het begin van het bestand, lengte 4 bytes) BITMAPFILEHEADER, * PBITMAPFILEHEADER;

Het WORD-type moet 16 bits zijn, de DWORD- en LONG-typen moeten 32 bits zijn, het LONG-type moet ondertekend zijn en er wordt aangenomen dat de bytevolgorde Little Endian is.

  • bfType - bestandstype, tekens "BM" (in HEX: 0x42 0x4d).
  • bfSize - de grootte van het gehele bestand in bytes.
  • bfReserved1 en bfReserved2 zijn gereserveerd en moeten nullen bevatten.
  • bfOffBits - bevat de offset in bytes vanaf het begin van de BITMAPFILEHEADER-structuur tot de afbeeldingsbits zelf.

Na de bestandskop

BITMAPINFOHEADER

De eenvoudigste headeroptie. Applicaties voor Windows NT3.51 en eerder kunnen deze structuur alleen gebruiken. Grootte 40 bytes.

Typedef struct tagBITMAPINFOHEADER( DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrBelangrijk; B) ITMAPINFOHEADER, * PBITMAPINFOHE ADER;

BiSize De grootte van deze structuur in bytes. Het BMP-formaat is in de loop van de tijd uitgebreid en de waarde van dit veld bepaalt de versie van het formaat. biWidth De breedte van de afbeelding in pixels. Voor Win98/Me en Win2000/XP: Als het biCompression-veld BI_JPEG of BI_PNG bevat, is dit de breedte van de gedecomprimeerde afbeelding. biHeight De hoogte van de afbeelding in pixels. Als het een positieve waarde bevat, wordt de afbeelding van onder naar boven geschreven (nul pixels in de linkerbenedenhoek). Als de waarde negatief is, wordt de afbeelding van boven naar beneden geschreven (nul pixels in de linkerbovenhoek van de afbeelding). Het biCompression-veld moet de waarde BI_RGB of BI_BITFIELDS bevatten. Een dergelijk beeld kan niet worden gecomprimeerd. biPlanes Aantal kleurvlakken en in BMP-formaat bevat één. biBitCount Aantal bits per pixel. Kan de volgende waarden aannemen:

  • 0 - is logisch voor Win98/Me/2000/XP. Het aantal bits per pixel bepaalt het JPEG- of PNG-formaat.
  • 1 - monochrome afbeelding. Het bmiColors-lid van de BITMAPINFO-structuur bevat twee elementen. Elk bit van een afbeelding vertegenwoordigt één pixel; als de bit nul is, heeft de pixel de kleur van het eerste element van de bmiColors-tabel, anders de kleur van het tweede.
  • 4 - afbeelding in zestien kleuren. Pixels worden gedefinieerd door 4-bits indices, elke byte van de afbeelding bevat informatie over twee pixels: de meest significante 4 bits voor de eerste, de resterende voor de tweede.
  • 8 - het palet bevat maximaal 256 kleuren, elke byte van de afbeelding slaat een index in het palet op voor één pixel.
  • 16 - als het biCompression-veld de waarde BI_RGB bevat, bevat het bestand geen palet. Elke twee bytes van de afbeelding slaan de intensiteit van de rode, groene en blauwe componenten van één pixel op. In dit geval wordt de meest significante bit niet gebruikt; voor elke component worden 5 bits toegewezen: ORRRRRGGGGGGBBBBB.
    Als het biCompression-veld de waarde BI_BITFIELDS bevat, slaat het palet drie waarden van vier bytes op die een masker definiëren voor elk van de drie kleurcomponenten. Elke pixel in een afbeelding wordt weergegeven door een waarde van twee bytes waaruit kleurcomponenten worden geëxtraheerd met behulp van maskers. Voor WinNT/2000/XP moeten de bitreeksen van elke component continu volgen, zonder de reeksen van andere componenten te overlappen of te kruisen. Voor Win95/98/Me worden alleen de volgende maskers ondersteund: 5-5-5, waarbij het masker van de blauwe component 0x001F is, groen 0x03E0, rood 0x7C00; en 5-6-5, waarbij het masker van de blauwe component 0x001F, groen 0x07E0, rood 0xF800 is.
  • 24 - het palet wordt niet gebruikt, elke drie bytes van de afbeelding vertegenwoordigen één pixel, één byte voor de intensiteit van respectievelijk de blauwe, groene en rode kanalen.
  • 32 - Als het biCompression-veld de waarde BI_RGB bevat, bevat de afbeelding geen palet. Elke vier bytes van het beeld vertegenwoordigen één pixel, elk één byte voor de intensiteit van respectievelijk de blauwe, groene en rode kanalen. De meest significante byte van elke quad wordt gewoonlijk niet gebruikt, maar maakt de opslag van alfakanaalgegevens mogelijk.
    Als het biCompression-veld de waarde BI_BITFIELDS bevat, worden er drie kleurmaskers van vier bytes in het palet opgeslagen - voor de rode, groene en blauwe componenten. Elke pixel in een afbeelding wordt weergegeven door vier bytes. WinNT/2000: componentmaskers mogen elkaar niet overlappen of kruisen. Windows 95/98/Me: het systeem ondersteunt slechts één compressiemodus, volledig vergelijkbaar met de modus zonder compressie BI_RGB - de belangrijkste byte van elke vier wordt gebruikt als alfakanaal, de volgende drie zijn gereserveerd voor blauw, groen en rood kanalen, respectievelijk: 0xAARRGGBB.
biCompression Compressietype voor gecomprimeerde afbeeldingen:
Betekenis Identificatie Compressie
0 BI_RGB ongecomprimeerde afbeelding
1 BI_RLE8 RLE-compressie voor 8-bits afbeeldingen
2 BI_RLE4 RLE-compressie voor 4-bits afbeeldingen
3 BI_BITFIELDS de afbeelding is niet gecomprimeerd; het palet bevat drie maskers van 4 bytes voor de rode, groene en blauwe kleurcomponenten. Gebruikt voor 16- en 32-bits afbeeldingen
4 BI_JPEG Win98/Me/2000/XP: JPEG-compressie
5 BI_PNG Win98/Me/2000/XP: PNG-compressie
6 BI_ALPHABITFIELDS WinCE: de afbeelding is niet gecomprimeerd, het palet bevat vier maskers van 4 bytes voor de rode, groene, blauwe en transparante (alfakanaal) kleurcomponenten. Gebruikt voor 16- en 32-bits afbeeldingen
biSizeImage Afbeeldingsgrootte in bytes. Kan nul bevatten voor BI_RGB-afbeeldingen. Win98/Me/2000/XP: Als biCompression BI_JPEG of BI_PNG bevat, specificeert biSizeImage de grootte van de BI_JPEG- of BI_PNG-beeldbuffer. biXPelsPerMeter Horizontale resolutie in pixels per meter voor het doelapparaat. Een applicatie kan deze waarde gebruiken om uit een groep afbeeldingsbronnen de meest geschikte afbeelding voor het huidige apparaat te selecteren. Voor DPI 96, die door Microsoft wordt geaccepteerd voor monitoren, is deze gelijk aan 3780 (indien berekend met de formule (96 / 25,4) * 1000). biYPelsPerMeter Verticale resolutie in pixels per meter voor het doelapparaat. biClrUsed Het aantal kleurindexen dat in het palet wordt gebruikt. Als de waarde nul is, gebruikt de afbeelding het maximale aantal beschikbare indexen, volgens de biBitCount-waarde en de compressiemethode die is opgegeven in biCompression.
Als het een waarde bevat die niet nul is en biBitCount kleiner is dan 16, specificeert biClrUsed het aantal kleuren waartoe het apparaatstuurprogramma of de toepassing toegang heeft. Als biBitCount groter is dan of gelijk is aan 16, is biClrUsed de grootte van het palet dat wordt gebruikt om de prestaties van systeempaletten te optimaliseren. Als biBitCount 16 of 32 is, volgt het optimale palet onmiddellijk na drie maskers van vier bytes.
In een ingepakte afbeelding volgt de pixelarray onmiddellijk de BITMAPINFO-structuur, biClrUsed moet nul of de werkelijke paletgrootte bevatten. biClrImportant Het aantal paletelementen dat nodig is om de afbeelding weer te geven. Als er nul in zit, zijn alle indexen even belangrijk.

De BITMAPINFO-structuur combineert de BITMAPINFOHEADER en het palet en biedt een volledige beschrijving van de afmetingen en kleuren van een afbeelding.

Om het palet in de BITMAPINFO-structuur te vinden, moet de toepassing de in biSize opgeslagen informatie als volgt gebruiken:

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

Het raster wordt doorgaans in verticaal gespiegelde vorm opgeslagen. Maar het is ook mogelijk om het raster in een niet-verticaal gespiegelde vorm op te slaan. Een teken dat het raster in BMP niet in verticale spiegelvorm is, wordt gespecificeerd door de parameter biHeight.

BITMAPV4HEADER

Een uitgebreide versie van de hierboven beschreven structuur. Win NT 3.51 en eerder moeten de BITMAPINFOHEADER-structuur gebruiken. Win98/Me/2000/XP kan de BITMAPV5HEADER-structuur gebruiken in plaats van de BITMAPV4HEADER-structuur.

Typedef struct ( DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; DWORD bV4ClrUsed DW; ORD bV4ClrImportant; ORD bV4GreenMask; CIEXYZTRIPLE bV4Endpoints;

De velden vanaf het begin van de structuur tot en met bV4ClrImportant hebben hetzelfde doel als de overeenkomstige velden van de BITMAPINFOHEADER-structuur.

  • bV4RedMask - kleurmasker van de rode component van elke pixel, alleen gebruikt als bV4Compression de BI_BITFIELDS-waarde bevat.
  • bV4GreenMask - kleurmasker van de groene component van elke pixel, alleen gebruikt als bV4Compression de BI_BITFIELDS-waarde bevat.
  • bV4BlueMask - kleurmasker van de blauwe component van elke pixel, alleen gebruikt als bV4Compression de BI_BITFIELDS-waarde bevat.
  • bV4AlphaMask - masker dat de alfakanaalcomponent definieert.
  • bV4CSType - definieert de kleurruimte van de afbeelding.
  • bV4Endpoints is een CIEXYZTRIPLE-structuur die de x-, y- en z-coördinaten specificeert van drie kleuren die overeenkomen met de eindpunten van de kleurruimte die voor de afbeelding is gedefinieerd. Dit veld wordt genegeerd als bV4CSType geen LCS_CALIBRATED_RGB-waarde bevat.
  • bV4GammaRed - tooncurve van de rode component. Genegeerd als bV4CSType geen LCS_CALIBRATED_RGB-waarde bevat. Aangegeven in 16×16 formaat.
  • bV4GammaGreen - tooncurve van de groene component. Genegeerd als bV4CSType geen LCS_CALIBRATED_RGB-waarde bevat.
  • bV4GammaBlue - tooncurve van blauwe component. Genegeerd als bV4CSType geen LCS_CALIBRATED_RGB-waarde bevat.

BITMAPV5HEADER

Win95/NT 4.0: Applicaties kunnen BITMAPV4HEADER gebruiken. Win NT 3.51 en eerder moeten de BITMAPINFOHEADER-structuur gebruiken.

Typedef struct ( DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compressie; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; DWORD bV5ClrUsed; bV5ClrBelangrijk; DWORD bV5GreenMa sk; DWORD bV5AlphaMask; CIEXYZTRIPLE bV5Endpoints; ; 5KOP;

Voor velden vanaf het begin van de structuur tot en met bV5GammaBlue worden alleen verschillen met eerdere versies - BITMAPINFOHEADER en BITMAPV4HEADER beschreven.

  • bV5CSType - definieert de kleurruimte van de afbeelding en kan de volgende waarden aannemen:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - kan de volgende waarden aannemen:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData - offset in bytes vanaf het begin van de structuur tot het begin van de profielgegevens (profielbestandsnaam, een reeks die uitsluitend bestaat uit codetabel 1252 tekens en eindigt met een nulbyte). Genegeerd als bV5CSType een andere waarde bevat dan PROFILE_LINKED en PROFILE_EMBEDDED.
  • bV5ProfileSize - profielgegevensgrootte in bytes.
  • bV5Gereserveerd - gereserveerd. Bevat nul.

Palet

Het palet kan een reeks velden van vier bytes bevatten, afhankelijk van het aantal beschikbare kleuren (256 voor een 8-bits afbeelding). De lage drie bytes van elk veld bepalen de intensiteit van de rode, groene en blauwe componenten van de kleur; de hoge byte wordt niet gebruikt. Elke pixel van de afbeelding wordt in dit geval beschreven door één byte die het nummer bevat van het paletveld waarin de kleur van deze pixel is opgeslagen.

Als een afbeeldingspixel wordt beschreven door een 16-bits getal, kan het palet drie waarden van twee bytes opslaan, die elk een masker definiëren om de rode, groene en blauwe kleurcomponenten uit de 16-bits pixel te extraheren.

Een BMP-bestand bevat mogelijk geen palet als het een niet-gecomprimeerde afbeelding in kleur bevat.

Afbeeldingsgegevens

Een reeks pixels die in een of andere vorm zijn vastgelegd. Pixels worden rij voor rij opgeslagen, van onder naar boven. Elke beeldregel wordt opgevuld met nullen tot een lengte die een veelvoud is van vier bytes.

In bmp-bestanden met een kleurdiepte van 24 bits worden de kleurbytes van elke pixel opgeslagen in BGR-volgorde (Blauw, Groen, Rood).

In bmp-bestanden met een kleurdiepte van 32 bits worden de kleurbytes van elke pixel opgeslagen in BGRA-volgorde (blauw, groen, rood, alfa)

Bitdiepte van afbeelding

Afhankelijk van het aantal weergegeven kleuren wordt elk punt toegewezen van 1 tot 48 bits:

  • 1 bit - monochrome afbeelding (twee kleuren).
  • 2 bits - 4 mogelijke kleuren (CGA-werkmodi) (2-bits modus is niet officieel gestandaardiseerd, maar wordt gebruikt).
  • 4 bits - 16-kleurenbeeld (EGA-bedrijfsmodi).
  • 8 bits (1 byte) - 256 kleuren, de laatste van de modi die geïndexeerde kleuren ondersteunt (zie hieronder).
  • 16 bits (2 bytes) - HiColor-modus, voor 5-6-5 = 65536 mogelijke tinten, voor 5-5-5 = 32768 mogelijke tinten.
  • 24 bits (3 bytes) - TrueColor. Omdat 3 bytes niet goed overeenkomen met machten van twee (vooral bij het opslaan van gegevens in het geheugen, waarbij de uitlijning van gegevens op een woordgrens van belang is), wordt in plaats daarvan vaak een 32-bits afbeelding gebruikt. In de TrueColor-modus krijgt elk van de drie kanalen (in RGB-modus) 1 byte toegewezen (256 mogelijke waarden), het totale aantal kleuren is .
  • 32 bits (4 bytes) - deze modus is vrijwel gelijk aan TrueColor, de vierde byte wordt meestal niet gebruikt of bevat het alfakanaal (transparantie).
  • 48 bits (6 bytes) - een zelden gebruikt formaat met verhoogde kleurnauwkeurigheid (16 bits per kanaal), ondersteund door een relatief klein aantal programma's en apparatuur.

Geïndexeerde kleuren

Wanneer het aantal bits 1 (2 kleuren), 2 (4 kleuren), 4 (16 kleuren) of 8 (256 kleuren) per pixel is, kan een speciale geïndexeerde kleurmodus worden gebruikt. In dit geval geeft het nummer dat overeenkomt met elke pixel niet de kleur aan, maar het nummer van de kleur in het palet. Door gebruik te maken van een palet is het mogelijk om de afbeelding aan te passen aan de kleuren die in de afbeelding aanwezig zijn. In dit geval wordt de afbeelding niet beperkt door gespecificeerde kleuren, maar door het maximale aantal gelijktijdig gebruikte kleuren.

Voorbeeld programma

Het volgende programma opent een 24-bits BMP-bestand in een XWindow, de kleurdiepte moet 32 ​​bits zijn, het werkt niet bij lagere kleurweergaven, omdat dit het voorbeeld ingewikkelder maakt:

/* Gecompileerd met de regel: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */#erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #include "bitmap.h" /* Hier zijn de BMP-headerdefinities zoals hierboven beschreven in dit artikel */ statische XImage * CreateImageFromBuffer(Display*, niet-ondertekende char *, int, int) ; main(int argc, char * argv ) ( Weergave * dis; Venster win; /* Ons venster */ XEvent gebeurtenis; /* Gebeurtenissen */ GC gc; /* Grafische context */ XAfbeelding * afbeelding; int n, breedte, hoogte, fd, grootte; niet-ondertekende char * gegevens; BITMAPBESTANDHEADER bmp; BITMAPINFOHEADER inf; char * buf; als (arg< 2 ) { perror ("use: xtest file.bmp\N"); uitgang(1); ) if ((fd = open(argv[ 1 ] , O_RDONLY) ) == - 1 ) ( printf ("Fout bij openen bitmap \N"); uitgang(1); ) read(fd, & bmp, groottevan (BITMAPFILEHEADER) ) ; read(fd, & inf, groottevan (BITMAPINFOHEADER) ) ; breedte = inf.biWidth ; hoogte = inf.biHeight ; if ((dis = XOpenDisplay(getenv ("DISPLAY") ) ) == NULL) ( printf ( "Kan geen verbinding maken met X-server: %s\n ", strerror (errno) ); uitgang(1); ) win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis) ) , 0 , 0 , breedte, hoogte, 5 , BlackPixel(dis, DefaultScreen(dis) ) , WhitePixel(dis, DefaultScreen(dis) ) ) ; XSetStandardProperties(dis, win, argv[ 1], argv[ 0], Geen, argv, argc, NULL); gc = DefaultGC(dis, DefaultScreen(dis) ); /* Soms is deze ruimte in de structuur niet gevuld */ if (inf.biSizeImage == 0 ) ( /* Bereken de maat */ maat = breedte * 3 + breedte % 4; maat = maat * hoogte; ) else ( size = inf.biSizeImage ; ) buf = malloc (grootte) ; if (buf == NULL) ( perror ("malloc" ); exit (1 ) ; ) printf ( "grootte = %d bytes toegewezen\n ", maat) ; /* Laten we naar het begin van de afbeelding zelf gaan */ lseek(fd, bmp.bfOffBits, SEEK_SET) ; /* Lezen in de buffer */ n = lezen(fd, buf, grootte); printf( "grootte = %d bytes gelezen\n ", N) ; afbeelding = CreateImageFromBuffer(dis, buf, breedte, hoogte) ;/* Verwijder de buffer - we hebben deze niet langer nodig */ gratis(buf); XMapWindow(dis, win) ; XSelectInput(dis, win, ExposureMask | KeyPressMask) ; while (1) ( XNextEvent(dis, & event) ; if (event.xany .window == win) ( switch (event.type ) ( case Expose: XPutImage(dis, win, gc, image, 0 , 0 , 0 , 0, afbeelding-> breedte, afbeelding-> hoogte) ; case KeyPress: if (XLookupKeysym(& event.xkey , 0 ) == XK_q) ( XDestroyImage(afbeelding) ; XSluisDisplay(dis) ; close(fd) ; afsluiten (EXIT_SUCCESS); standaard: pauze; XImage * CreateImageFromBuffer(Display * dis, unsigned char * buf, int width, int height) ( int depth, screen; XImage * img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t * imgBuf; int ind = 0 int lijn; int ih; /* Rij- en kolomnummers die moeten worden weergegeven */ int nieuwe_ind; /* Nieuwe index */ screen = DefaultScreen(dis) ; diepte = Standaarddiepte(dis, scherm) ; temperatuur = breedte * 3; lijn = temperatuur + breedte % 4; /* Stringlengte rekening houdend met uitlijning */ numImgBytes = (4 * (breedte * hoogte) ); imgBuf = malloc(numImgBytes); /* Grootte toegewezen aan BMP in het bestand, rekening houdend met uitlijning */ numBmpBytes = regel * hoogte; voor (ik = 0; ik< numBmpBytes; i++ ) { unsigned int r, g, b; /* Opvulling overslaan */ if (i >= temp && (i% lijn) >= temp) doorgaan ; b = buf[ ik] ; ik++; g = buf[ ik] ; ik++; r = buf[ ik] ; /* Bereken een nieuwe index voor verticale reflectie */ iw = ind% breedte; ih = ind / breedte; new_ind = iw + (hoogte - ih - 1 ) * breedte; imgBuf[ nieuwe_ind] = (r | g<< 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; /* Bit- en bytevolgorde op pc zou er als volgt uit moeten zien */ img->byte_order = MSBFirst; img->bitmap_bit_order = MSBFirst; retour img; )