Anunsyo

Format ng file ng imahe ng BMP Raster

Ang BMP (bitmap file, device-independent bitmap file format) ay mga bitmap file na ginagamit upang mag-imbak ng mga digital bitmap na imahe nang hiwalay sa display device. Ang uri ng file na ito ay dating ginamit sa Microsoft Windows at OS/2. Ang terminong "raster" ay nagmula sa ideya ng mga programmer ng isang bitmap. Ang mga imahe ng BMP ay karaniwang hindi naka-compress o walang pagkawalang naka-compress (halimbawa, gamit ang ZIP o RAR - dahil sa pagkakaroon ng redundant na data sa file). Ngayon, ang JPG ay ang gustong format ng imahe - higit sa lahat dahil sa malaking laki ng file ng BMP, na maaaring magdulot ng mga problema o pagkaantala kapag nagda-download, nagpapadala o nag-a-upload ng mga file.

Teknikal na impormasyon tungkol sa mga BMP file

Ang mga BMP file ay iniimbak bilang mga 2D na larawan ng iba't ibang laki, kulay, at lalim ng kulay nang walang data compression, mga profile ng kulay, o mga alpha channel. Ang mga BMP na larawan ay naka-save sa device-independent bitmap (DIB) na mga format, ibig sabihin, ang larawan ay may mga kulay sa halip na mga detalye ng system. Ipinapaliwanag nito kung bakit iba ang hitsura ng ilang BMP na imahe sa iba't ibang mga computer. Maaaring matingnan ang mga larawan ng BMP sa anumang device, kabilang ang mga screen ng computer at telebisyon. Dahil sa kakulangan ng mga patent, naging popular ang uri ng larawang ito para sa malawak na hanay ng mga device.

Karagdagang impormasyon tungkol sa BMP format

BMP(mula sa English Larawan ng Bitmap) ay isang raster image storage format na binuo ng Microsoft.

Ang isang malaking bilang ng mga programa ay gumagana sa BMP format, dahil ang suporta nito ay isinama sa Windows at OS/2 operating system. Ang mga BMP file ay maaaring magkaroon ng mga extension na .bmp, .dib at .rle. Bukod pa rito, ang data sa format na ito ay kasama sa binary RES resource file at PE file.

Nakabuo din ang Microsoft ng mga format ng ICO at CUR para sa mga pangangailangan nito, na may istrakturang katulad ng BMP. Bilang karagdagan, ang mga istruktura mula sa format na ito ay ginagamit ng ilang mga function ng WinAPI ng GDI subsystem.

Ang lalim ng kulay sa format na ito ay maaaring 1, 2, 4, 8, 16, 24, 32, 48 bits bawat pixel, ngunit hindi opisyal na sinusuportahan ang 2 bits bawat pixel. Sa kasong ito, para sa mga depth ng kulay na mas mababa sa 16 bits, isang palette na may mga full-color na bahagi na may lalim na 24 bits ang ginagamit.

Sa BMP na format, ang mga larawan ay maaaring iimbak sa kasalukuyan o gamit ang ilang karaniwang compression algorithm. Sa partikular, sinusuportahan ng format ng BMP ang RLE compression nang walang pagkawala ng kalidad, at pinapayagan ng mga modernong operating system at software ang paggamit ng JPEG at PNG (ang mga format na ito ay binuo sa BMP bilang isang lalagyan).

Extension ng file .bmp
Kategorya ng file
Halimbawang file (2.7 MiB)
(487.85 KiB)
Mga kaugnay na programa Adobe Photoshop
MS Paint
Microsoft Photo Editor
Paintbrush

DIB at DDB

Kapag gumagamit ng DIB na format Bitmap ng Device Independent, device-independent raster), maa-access ng programmer ang lahat ng elemento ng mga istrukturang naglalarawan sa larawan gamit ang isang regular na pointer. Ngunit ang data na ito ay hindi ginagamit upang direktang kontrolin ang screen, dahil ito ay palaging naka-imbak sa memorya ng system at hindi sa nakalaang memorya ng video. Ang format ng pixel sa RAM ay maaaring mag-iba sa format na dapat maimbak sa memorya ng video upang maipakita ang isang punto ng parehong kulay. Halimbawa, ang DIB na format ay maaaring gumamit ng 24 bits upang tukuyin ang isang pixel, at sa sandaling ito ang graphics adapter ay maaaring gumana sa HiColor mode na may kulay na depth na 16 bits. Sa kasong ito, ang maliwanag na pulang tuldok ay tutukuyin sa isang hardware-independent na format ng tatlong byte 0x0000ff, at sa memorya ng video ng salitang 0xF800. Kapag kumopya ng larawan sa screen, gugugol ang system ng karagdagang oras sa pag-convert ng mga color code mula sa 24-bit na format patungo sa buffer format ng video.

Pangkalahatang-ideya ng istraktura ng file

Ang BMP file ay binubuo ng apat na bahagi:

  1. Header ng file (BITMAPFILEHEADER)
  2. Pamagat ng larawan (BITMAPINFOHEADER, maaaring nawawala). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Palette (maaaring nawawala)
  4. Ang imahe mismo

BITMAFILEHEADER

Ang istrukturang ito ay naglalaman ng impormasyon tungkol sa uri, laki, at representasyon ng data sa file. Sukat 14 bytes.

Typedef struct tagBITMAPFILEHEADER ( WORD bfType; // offset 0 bytes mula sa simula ng file DWORD bfSize; // offset 2 bytes mula sa simula ng file, haba 4 bytes WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; // offset 10 bytes mula sa simula ng file, haba 4 bytes) BITMAPFILEHEADER, * PBITMAPFILEHEADER;

Ang uri ng WORD ay dapat na 16 bits, ang DWORD at LONG na mga uri ay dapat na 32 bits, ang LONG na uri ay dapat na nilagdaan, at ang byte order ay ipinapalagay na maliit na endian.

  • bfType - uri ng file, mga character na "BM" (sa HEX: 0x42 0x4d).
  • bfSize - laki ng buong file sa bytes.
  • Ang bfReserved1 at bfReserved2 ay nakalaan at dapat maglaman ng mga zero.
  • bfOffBits - naglalaman ng offset sa mga byte mula sa simula ng istraktura ng BITMAPFILEHEADER hanggang sa mga bit ng imahe mismo.

Pagkatapos ng header ng file

BITMAPINFOHEADER

Ang pinakasimpleng opsyon sa header. Magagamit lamang ng mga application para sa Windows NT3.51 at mas nauna ang istrukturang ito. Sukat 40 bytes.

Typedef struct tagBITMAPINFOHEADER( DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClr. PBITMAPINFOHEADER;

BiSize Ang laki ng istrukturang ito sa bytes. Ang BMP format ay pinalawak sa paglipas ng panahon, at ang halaga ng field na ito ay tumutukoy sa bersyon ng format. biWidth Ang lapad ng imahe sa mga pixel. Para sa Win98/Me at Win2000/XP: Kung ang field ng biCompression ay naglalaman ng BI_JPEG o BI_PNG, ito ang lapad ng na-decompress na imahe. biHeight Ang taas ng imahe sa mga pixel. Kung naglalaman ito ng positibong halaga, isinusulat ang larawan sa ibaba hanggang sa itaas na pagkakasunud-sunod (zero pixel sa kaliwang sulok sa ibaba). Kung negatibo ang value, isinusulat ang larawan mula sa itaas hanggang sa ibaba (zero pixel sa kaliwang sulok sa itaas ng larawan). Ang field ng biCompression ay dapat maglaman ng value na BI_RGB o BI_BITFIELDS. Ang ganitong imahe ay hindi maaaring i-compress. biPlanes Bilang ng mga color plane at nasa BMP format ay naglalaman ng isa. biBitCount Bilang ng mga bit bawat pixel. Maaaring kunin ang mga sumusunod na halaga:

  • 0 - may katuturan para sa Win98/Me/2000/XP. Tinutukoy ng bilang ng mga bit bawat pixel ang JPEG o PNG na format.
  • 1 - monochrome na imahe. Ang miyembro ng bmiColors ng istruktura ng BITMAPINFO ay naglalaman ng dalawang elemento. Ang bawat bit ng isang imahe ay kumakatawan sa isang pixel; kung ang bit ay zero, ang pixel ay may kulay ng unang elemento ng bmiColors table, kung hindi - ang kulay ng pangalawa.
  • 4 - labing-anim na kulay na imahe. Ang mga pixel ay tinutukoy ng 4-bit na mga indeks, ang bawat byte ng larawan ay naglalaman ng impormasyon tungkol sa dalawang pixel - ang pinakamahalagang 4 na bit para sa una, ang natitira para sa pangalawa.
  • 8 - ang palette ay naglalaman ng hanggang 256 na kulay, ang bawat byte ng imahe ay nag-iimbak ng index sa palette para sa isang pixel.
  • 16 - kung ang field ng biCompression ay naglalaman ng halaga BI_RGB, ang file ay hindi naglalaman ng isang palette. Ang bawat dalawang byte ng larawan ay nag-iimbak ng intensity ng pula, berde at asul na bahagi ng isang pixel. Sa kasong ito, ang pinaka makabuluhang bit ay hindi ginagamit; 5 bits ay inilalaan para sa bawat bahagi: 0RRRRRGGGGGGBBBBB.
    Kung ang field ng biCompression ay naglalaman ng value na BI_BITFIELDS, ang palette ay nag-iimbak ng tatlong apat na byte na halaga na tumutukoy sa isang mask para sa bawat isa sa tatlong bahagi ng kulay. Ang bawat pixel sa isang imahe ay kinakatawan ng isang dalawang-byte na halaga kung saan kinukuha ang mga bahagi ng kulay gamit ang mga maskara. Para sa WinNT/2000/XP, ang mga bit sequence ng bawat component ay dapat na patuloy na sumunod, nang walang overlapping o intersecting sa mga sequence ng iba pang mga component. Para sa Win95/98/Me - ang mga sumusunod na mask lamang ang sinusuportahan: 5-5-5, kung saan ang mask ng asul na bahagi ay 0x001F, berde 0x03E0, pula 0x7C00; at 5-6-5, kung saan ang mask ng asul na bahagi ay 0x001F, berde 0x07E0, pula 0xF800.
  • 24 - hindi ginagamit ang palette, ang bawat tatlong byte ng imahe ay kumakatawan sa isang pixel, isang byte para sa intensity ng asul, berde at pula na mga channel, ayon sa pagkakabanggit.
  • 32 - Kung ang field ng biCompression ay naglalaman ng value na BI_RGB, ang imahe ay hindi naglalaman ng palette. Ang bawat apat na byte ng imahe ay kumakatawan sa isang pixel, isang byte bawat isa para sa intensity ng asul, berde at pulang channel, ayon sa pagkakabanggit. Ang pinakamahalagang byte ng bawat quad ay hindi karaniwang ginagamit, ngunit nagbibigay-daan sa pag-imbak ng data ng alpha channel.
    Kung ang field ng biCompression ay naglalaman ng value na BI_BITFIELDS, tatlong apat na byte na mask ng kulay ang iniimbak sa palette - para sa pula, berde at asul na mga bahagi. Ang bawat pixel sa isang imahe ay kinakatawan ng apat na byte. WinNT/2000: hindi dapat mag-overlap o mag-intersect ang mga component mask. Windows 95/98/Me: ang system ay sumusuporta lamang sa isang compression mode, ganap na katulad ng mode na walang compression BI_RGB - ang pinaka makabuluhang byte ng bawat apat ay ginagamit bilang isang alpha channel, ang susunod na tatlo ay nakalaan para sa asul, berde at pula channel, ayon sa pagkakabanggit: 0xAARRGGBB.
biCompression Uri ng compression para sa mga naka-compress na larawan:
Ibig sabihin Identifier Compression
0 BI_RGB hindi naka-compress na imahe
1 BI_RLE8 RLE compression para sa 8-bit na mga imahe
2 BI_RLE4 RLE compression para sa 4-bit na mga imahe
3 BI_BITFIELDS ang imahe ay hindi naka-compress, ang palette ay naglalaman ng tatlong 4-byte na maskara para sa pula, berde at asul na mga bahagi ng kulay. Ginamit para sa 16 at 32 bit na mga imahe
4 BI_JPEG Win98/Me/2000/XP: JPEG compression
5 BI_PNG Win98/Me/2000/XP: PNG compression
6 BI_ALPHABITFIELDS WinCE: ang imahe ay hindi naka-compress, ang palette ay naglalaman ng apat na 4-byte na maskara para sa pula, berde, asul at transparent (alpha channel) na mga bahagi ng kulay. Ginamit para sa 16 at 32 bit na mga imahe
biSizeImage Laki ng imahe sa bytes. Maaaring naglalaman ng zero para sa mga larawang BI_RGB. Win98/Me/2000/XP: Kung naglalaman ang biCompression ng BI_JPEG o BI_PNG, tinutukoy ng biSizeImage ang laki ng buffer ng imahe ng BI_JPEG o BI_PNG. biXPelsPerMeter Pahalang na resolution sa mga pixel bawat metro para sa target na device. Maaaring gamitin ng isang application ang halagang ito upang pumili mula sa isang pangkat ng mga mapagkukunan ng larawan ang pinakaangkop na larawan para sa kasalukuyang device. Para sa DPI 96, na tinatanggap ng Microsoft para sa mga monitor, ito ay magiging katumbas ng 3780 (kung kinakalkula gamit ang formula (96 / 25.4) * 1000). biYPelsPerMeter Vertical na resolution sa mga pixel bawat metro para sa target na device. biClrUsed Ang bilang ng mga indeks ng kulay na ginamit sa palette. Kung zero ang value, ginagamit ng larawan ang maximum na bilang ng mga index na available, ayon sa halaga ng biBitCount at ang paraan ng compression na tinukoy sa biCompression.
Kung naglalaman ng hindi zero na halaga at ang biBitCount ay mas mababa sa 16, tinutukoy ng biClrUsed ang bilang ng mga kulay na maa-access ng driver ng device o application. Kung ang biBitCount ay mas malaki sa o katumbas ng 16, ang biClrUsed ay ang laki ng palette na ginamit upang i-optimize ang pagganap ng mga palette ng system. Kung ang biBitCount ay 16 o 32, ang pinakamainam na palette ay sumusunod kaagad pagkatapos ng tatlong four-byte mask.
Sa isang naka-pack na larawan, ang pixel array ay agad na sumusunod sa BITMAPINFO structure, ang biClrUsed ay dapat maglaman ng zero o ang aktwal na laki ng palette. biClrImportant Ang bilang ng mga elemento ng palette na kinakailangan upang ipakita ang imahe. Kung naglalaman ito ng zero, ang lahat ng mga index ay pantay na mahalaga.

Pinagsasama ng istruktura ng BITMAPINFO ang BITMAPINFOHEADER at ang palette, na nagbibigay ng kumpletong paglalarawan ng mga sukat at kulay ng isang imahe.

Upang mahanap ang palette sa istruktura ng BITMAPINFO, dapat gamitin ng application ang impormasyong nakaimbak sa biSize tulad ng sumusunod:

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

Ang raster ay karaniwang naka-imbak sa isang vertical na salamin na anyo. Ngunit posible ring iimbak ang raster sa isang non-vertically mirrored form. Ang isang senyales na ang raster sa BMP ay wala sa vertical mirror form ay tinukoy ng biHeight parameter.

BITMAPV4HEADER

Isang pinalawak na bersyon ng istraktura na inilarawan sa itaas. Ang Win NT 3.51 at mas maaga ay dapat gumamit ng BITMAPINFOHEADER structure. Maaaring gamitin ng Win98/Me/2000/XP ang istraktura ng BITMAPV5HEADER sa halip na ang istraktura ng BITMAPV4HEADER.

Typedef struct ( DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; DWClORDMeter Mahalaga; DWORD bV4GreenMask ;

Ang mga patlang mula sa simula ng istraktura hanggang sa at kabilang ang bV4ClrImportant ay may parehong layunin sa mga kaukulang field ng istraktura ng BITMAPINFOHEADER.

  • bV4RedMask - color mask ng pulang bahagi ng bawat pixel, ginagamit lang kung ang bV4Compression ay naglalaman ng BI_BITFIELDS na halaga.
  • bV4GreenMask - color mask ng berdeng bahagi ng bawat pixel, ginagamit lang kung ang bV4Compression ay naglalaman ng BI_BITFIELDS na halaga.
  • bV4BlueMask - color mask ng asul na bahagi ng bawat pixel, ginagamit lang kung ang bV4Compression ay naglalaman ng BI_BITFIELDS na halaga.
  • bV4AlphaMask - mask na tumutukoy sa bahagi ng alpha channel.
  • bV4CSType - tumutukoy sa espasyo ng kulay ng larawan.
  • Ang bV4Endpoints ay isang CIEXYZTRIPLE na istraktura na tumutukoy sa x, y at z na mga coordinate ng tatlong kulay na tumutugma sa mga endpoint ng color space na tinukoy para sa imahe. Binabalewala ang field na ito kung ang bV4CSType ay walang LCS_CALIBRATED_RGB value.
  • bV4GammaRed - kurba ng tono ng pulang bahagi. Binabalewala kung ang bV4CSType ay walang LCS_CALIBRATED_RGB value. Nakasaad sa 16×16 na format.
  • bV4GammaGreen - kurba ng tono ng berdeng bahagi. Binabalewala kung ang bV4CSType ay walang LCS_CALIBRATED_RGB value.
  • bV4GammaBlue - asul na kurba ng tono ng bahagi. Binabalewala kung ang bV4CSType ay walang LCS_CALIBRATED_RGB value.

BITMAPV5HEADER

Win95/NT 4.0: Maaaring gamitin ng mga application ang BITMAPV4HEADER. Ang Win NT 3.51 at mas maaga ay dapat gumamit ng BITMAPINFOHEADER structure.

Typedef struct ( DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; ORD bV5GreenMask; ;5HEADER;

Para sa mga field mula sa simula ng istraktura hanggang sa at kabilang ang bV5GammaBlue, ang mga pagkakaiba lamang mula sa mga nakaraang bersyon - BITMAPINFOHEADER at BITMAPV4HEADER ang ilalarawan.

  • bV5CSType - tumutukoy sa espasyo ng kulay ng larawan, maaaring kunin ang mga sumusunod na halaga:
LCS_CALIBRATE_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - maaaring kunin ang mga sumusunod na halaga:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData - offset sa bytes mula sa simula ng istraktura hanggang sa simula ng data ng profile (profile file name, isang string na binubuo lamang ng code table 1252 characters at nagtatapos sa zero byte). Hindi pinansin kung ang bV5CSType ay naglalaman ng value maliban sa PROFILE_LINKED at PROFILE_EMBEDDED.
  • bV5ProfileSize - laki ng data ng profile sa mga byte.
  • bV5Reserved - nakalaan. Naglalaman ng zero.

Palette

Ang palette ay maaaring maglaman ng isang sequence ng apat na byte na field ayon sa bilang ng mga available na kulay (256 para sa isang 8-bit na imahe). Ang mababang tatlong byte ng bawat field ay tumutukoy sa intensity ng pula, berde at asul na bahagi ng kulay ay hindi ginagamit. Ang bawat pixel ng larawan ay inilalarawan sa kasong ito ng isang byte na naglalaman ng bilang ng field ng palette kung saan naka-imbak ang kulay ng pixel na ito.

Kung ang isang pixel ng imahe ay inilalarawan ng isang 16-bit na numero, ang palette ay maaaring mag-imbak ng tatlong dalawang-byte na mga halaga, na ang bawat isa ay tumutukoy sa isang mask upang kunin ang pula, berde, at asul na mga bahagi ng kulay mula sa 16-bit na pixel.

Maaaring walang palette ang BMP file kung nag-iimbak ito ng hindi naka-compress na full-color na imahe.

Data ng larawan

Isang pagkakasunud-sunod ng mga pixel na naitala sa isang anyo o iba pa. Ang mga pixel ay iniimbak ng hilera, mula sa ibaba hanggang sa itaas. Ang bawat linya ng imahe ay nilagyan ng mga zero sa haba na isang multiple ng apat na byte.

Sa mga bmp file na may lalim na kulay na 24 bits, ang mga color byte ng bawat pixel ay naka-store sa BGR (Blue, Green, Red) order.

Sa mga bmp file na may lalim na kulay na 32 bits, ang mga color byte ng bawat pixel ay naka-store sa BGRA order (Blue, Green, Red, Alpha)

Bit depth ng larawan

Depende sa bilang ng mga kinakatawan na kulay, ang bawat punto ay inilalaan mula 1 hanggang 48 bits:

  • 1 bit - monochrome na imahe (dalawang kulay).
  • 2 bits - 4 na posibleng kulay (CGA operating modes) (2-bit mode ay hindi opisyal na standardized, ngunit ginagamit).
  • 4 bits - 16 na kulay na imahe (mga operating mode ng EGA).
  • 8 bits (1 byte) - 256 na kulay, ang pinakahuli sa mga mode na sumusuporta sa mga naka-index na kulay (tingnan sa ibaba).
  • 16 bits (2 bytes) - HiColor mode, Para sa 5-6-5 = 65536 posibleng shades, para sa 5-5-5 = 32768 possible shades.
  • 24 bits (3 bytes) - TrueColor. Dahil hindi maganda ang pagkakamapa ng 3 byte sa mga kapangyarihan ng dalawa (lalo na kapag nag-iimbak ng data sa memorya, kung saan mahalaga ang pagkakahanay ng data sa hangganan ng isang salita), ang isang 32-bit na imahe ay kadalasang ginagamit sa halip. Sa TrueColor mode, ang bawat isa sa tatlong channel (sa RGB mode) ay inilalaan ng 1 byte (256 posibleng value), ang kabuuang bilang ng mga kulay ay .
  • 32 bits (4 bytes) - ang mode na ito ay halos katulad ng TrueColor, ang ikaapat na byte ay karaniwang hindi ginagamit, o naglalaman ito ng alpha channel (transparency).
  • 48 bits (6 bytes) - isang bihirang ginagamit na format na may mas mataas na katumpakan ng kulay (16 bits bawat channel), na sinusuportahan ng medyo maliit na bilang ng mga programa at kagamitan.

Mga naka-index na kulay

Kapag ang bilang ng mga bit ay 1 (2 kulay), 2 (4 na kulay), 4 (16 na kulay) o 8 (256 na kulay) bawat pixel, maaaring gumamit ng espesyal na mode ng kulay na naka-index. Sa kasong ito, ang numero na naaayon sa bawat pixel ay hindi nagpapahiwatig ng kulay, ngunit ang bilang ng kulay sa palette. Sa pamamagitan ng paggamit ng palette, posibleng iakma ang larawan sa mga kulay na nasa larawan. Sa kasong ito, ang imahe ay limitado hindi sa pamamagitan ng tinukoy na mga kulay, ngunit sa pamamagitan ng maximum na bilang ng sabay-sabay na ginamit na mga kulay.

Halimbawang programa

Ang sumusunod na programa ay nagbubukas ng isang 24-bit na BMP file sa isang XWindow, ang lalim ng kulay ay dapat na 32 bits, hindi ito gumagana sa mas mababang mga pag-render ng kulay, dahil pinapalubha nito ang halimbawa:

/* Compiled with the line: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */#isama #isama #isama #isama #isama #isama #isama #isama #isama #isama #isama #include "bitmap.h" /* Narito ang mga kahulugan ng BMP header tulad ng inilarawan sa itaas sa artikulong ito */ static XImage * CreateImageFromBuffer(Display*, unsigned char *, int, int) ; main(int argc, char * argv ) ( Display * dis; Window win; /* Our window */ XEvent event; /* Events */ GC gc; /* Konteksto ng graphics */ XImage * larawan; int n, lapad, taas, fd, laki; unsigned char * data; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; char * buf; kung (argc< 2 ) { perror ("use: xtest file.bmp\n"); exit(1); ) if ((fd = open(argv[ 1] , O_RDONLY) ) == - 1 ) ( printf ("Error open bitmap \n"); exit(1); ) read(fd, & bmp, sizeof (BITMAPFILEHEADER) ); read(fd, & inf, sizeof (BITMAPINFOHEADER) ); lapad = inf.biWidth ; taas = inf.biHeight ; kung ((dis = XOpenDisplay(getenv ("DISPLAY")) ) == NULL) ( printf ( "Hindi maikonekta ang X server: %s\n ", strerror (errno) ); exit(1); ) panalo = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis) ) , 0 , 0 , lapad, taas, 5 , BlackPixel(dis, DefaultScreen(dis) ), WhitePixel(dis, DefaultScreen(dis) ) ) ; XSetStandardProperties(dis, win, argv[ 1 ], argv[ 0 ], Wala, argv, argc, NULL); gc = DefaultGC(dis, DefaultScreen(dis) ); /* Minsan ang lugar na ito sa istraktura ay hindi napupuno */ kung (inf.biSizeImage == 0 ) ( /* Kalkulahin ang laki */ laki = lapad * 3 + lapad % 4 ; laki = laki * taas; ) else ( size = inf.biSizeImage ; ) buf = malloc (size) ; if (buf == NULL) ( perror ("malloc" ); exit (1); ) printf ( "laki = %d byte na inilaan\n ", laki); /* Lumipat tayo sa simula ng mismong larawan */ lseek(fd, bmp.bfOffBits , SEEK_SET) ; /* Basahin sa buffer */ n = read(fd, buf, laki); printf( "laki = %d byte na nabasa\n ", n); image = CreateImageFromBuffer(dis, buf, lapad, taas); /* Tanggalin ang buffer - hindi na namin ito kailangan */ libre(buf); XMapWindow(dis, manalo); XSelectInput(dis, manalo, ExposureMask | KeyPressMask) ; habang (1 ) ( XNextEvent(dis, & event); if (event.xany .window == win) ( switch (event.type ) ( case Expose: XPutImage(dis, win, gc, image, 0 , 0 , 0 , 0 , larawan-> lapad, imahe-> taas) ; exit (EXIT_SUCCESS) ; /* Lumilikha ng isang Ximage mula sa isang BMP file, dahil ang BMP na imahe ay naka-imbak na baligtad * at naka-mirror - ito ay naitama sa loop */ 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 linya; /* Mga numero ng row at column na ipapakita */ int new_ind; /* Bagong index */ screen = DefaultScreen(dis) ; depth = DefaultDepth(dis, screen) ; temp = lapad * 3 ; linya = temp + lapad % 4 ; /* Haba ng string na isinasaalang-alang ang pagkakahanay */ numImgBytes = (4 * (lapad * taas) ); imgBuf = malloc(numImgBytes); /* Sukat na inilaan sa BMP sa file, isinasaalang-alang ang pagkakahanay */ numBmpBytes = linya * taas; para sa (i = 0 ; i< numBmpBytes; i++ ) { unsigned int r, g, b; /* Laktawan ang padding */ kung (i >= temp && (i % line) >= temp) continue ; b = buf[i] ; i++; g = buf[i] ; i++; r = buf[i] ; /* Kalkulahin ang isang bagong index para sa patayong pagmuni-muni */ iw = ind % lapad; ih = ind / lapad; new_ind = iw + (taas - ih - 1 ) * lapad; imgBuf[ new_ind] = (r | g<< 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; /* Dapat ganito ang pagkakasunod-sunod ng bit at byte sa PC */ img->byte_order = MSBFuna; img->bitmap_bit_order = MSBFuna; ibalik ang img; )

Ang isang maliit na programa ay isinasaalang-alang na inilipat ang sprite sa paligid ng screen, ngunit, sa kasamaang-palad, hindi ito mukhang tulad ng gusto namin. Sa artikulong ito ay susubukan naming "ayusin" ang sprite.

Nakuha namin ang imahe ng sprite mula sa isang Bmp file mula sa parehong mga file na maaari naming kunin ang larawan ng background, mouse cursor at mga elemento ng interface. Gayunpaman, ang nakikita namin sa screen ay hindi eksakto kung ano ang inaasahan namin: ang imahe ay naging baligtad at, bukod dito, may iba't ibang kulay kaysa sa kinakailangan. Kaya, alamin natin kung paano basahin nang tama ang mga Bmp file at iikot ang larawan "mula ulo hanggang paa."

Sa pamamagitan ng desisyon ng mga developer, ang Bmp file format ay hindi nakatali sa isang partikular na hardware platform. Ang file na ito ay binubuo ng apat na bahagi: isang header, isang header ng impormasyon, isang table ng kulay (palette), at data ng imahe. Kung ang file ay nag-iimbak ng isang imahe na may lalim na kulay na 24 bits (16 milyong mga kulay), kung gayon ang talahanayan ng kulay ay maaaring nawawala, ngunit sa aming 256-kulay na kaso naroroon ito. Ang istraktura ng bawat bahagi ng isang file na nag-iimbak ng 256-kulay na imahe ay ibinibigay sa , at ang mga kaukulang uri ng tala ay ibinibigay sa .

Ang header ng file ay nagsisimula sa mga lagda"BM" na sinusundan ng haba ng file, na ipinahayag sa mga byte. Ang susunod na 4 na byte ay nakalaan para sa karagdagang mga extension ng format, at nagtatapos ang header na ito displacement mula sa simula ng file hanggang sa data ng imahe na naitala dito. Sa 256 na kulay, ang offset na ito ay 1078 - ito ay eksakto kung magkano ang kailangan naming laktawan sa aming nakaraang programa upang makuha ang data.

Ang header ng impormasyon ay nagsisimula sa sarili nitong haba (maaaring mag-iba ito, ngunit para sa isang 256-kulay na file ito ay 40 bytes) at naglalaman ng mga sukat ng imahe, resolution, mga katangian ng pagtatanghal ng kulay at iba pang mga parameter.

Lapad at taas ng larawan ay tinukoy sa mga raster point at marahil ay hindi nangangailangan ng paliwanag.

Bilang ng mga eroplano maaaring magamit sa mga file na may mababang lalim ng kulay. Kapag ang bilang ng mga kulay ay 256 o higit pa, ito ay palaging katumbas ng 1, kaya't ang field na ito ay maaari na ngayong ituring na hindi na ginagamit, ngunit para sa pagiging tugma ay pinananatili ito.

Lalim ng kulay ay itinuturing na pinakamahalagang katangian ng paraan kung paano kinakatawan ang kulay sa isang file at sinusukat sa mga bit bawat tuldok. Sa kasong ito, ito ay katumbas ng 8.

Compression. Karaniwang hindi ito ginagamit sa mga Bmp file, ngunit isang field sa header ang ibinigay para dito. Kadalasan ito ay 0, na nangangahulugan na ang imahe ay hindi naka-compress. Sa hinaharap gagamitin lang namin ang mga ganoong file.

Laki ng Larawan- ang bilang ng mga byte ng memorya na kinakailangan upang maimbak ang larawang ito, hindi binibilang ang data ng palette.

Pahalang at patayong mga resolusyon sinusukat sa raster point kada metro. Ang mga ito ay lalong mahalaga para sa pagpapanatili ng sukat ng mga na-scan na larawan. Ang mga larawang ginawa gamit ang mga graphic editor ay karaniwang may mga zero sa mga field na ito.

Bilang ng mga kulay ay nagbibigay-daan sa iyo na bawasan ang laki ng talahanayan ng palette kung ang larawan ay aktwal na naglalaman ng mas kaunting mga kulay kaysa pinapayagan ng piniling lalim ng kulay. Gayunpaman, sa pagsasagawa ng mga naturang file ay halos hindi na matagpuan. Kung ang bilang ng mga kulay ay ang maximum na pinapayagan ng lalim ng kulay, halimbawa 256 na kulay sa 8 bits, ang field ay nakatakda sa zero.

Bilang ng mga pangunahing kulay- nagmula sa simula ng palette, at ipinapayong ipakita ito nang walang pagbaluktot. Mahalaga ang field na ito kapag ang maximum na bilang ng mga kulay ng display ay mas mababa kaysa sa Bmp file palette. Sa pagbuo ng format, malinaw na ipinapalagay na ang pinakamadalas na mga kulay ay makikita sa simula ng talahanayan. Ngayon ang pangangailangang ito ay halos hindi sinusunod, ibig sabihin, ang mga kulay ay hindi inayos ayon sa dalas kung saan nangyari ang mga ito sa file. Napakahalaga nito, dahil ang mga palette ng dalawang magkaibang mga file, kahit na binubuo ng parehong mga kulay, ay naglalaman ng mga ito (ang mga kulay) sa ibang pagkakasunud-sunod, na maaaring makabuluhang kumplikado ang sabay-sabay na pagpapakita ng mga naturang larawan sa screen.

Ang header ng impormasyon ay sinusundan ng isang talahanayan ng kulay, na isang hanay ng 256 (sa bilang ng mga kulay) na 4-byte na mga patlang. Ang bawat field ay tumutugma sa isang kulay sa palette, at tatlo sa apat na byte ay tumutugma sa asul, berde, at pulang bahagi ng kulay na iyon. Ang huling, pinaka makabuluhang byte ng bawat field ay nakalaan at katumbas ng 0.

Pagkatapos ng talahanayan ng kulay mayroong data ng imahe, na nakasulat kasama ang mga linya ng raster mula sa ibaba hanggang sa itaas, at sa loob ng linya - mula kaliwa hanggang kanan. Dahil sa ilang mga platform imposibleng magbasa ng isang unit ng data na mas mababa sa 4 na byte, ang haba ng bawat linya ay nakahanay sa isang hangganan na 4 na byte, ibig sabihin, kung ang haba ng linya ay hindi isang multiple ng apat, ito ay may palaman mga zero. Ang sitwasyong ito ay dapat isaalang-alang kapag nagbabasa ng file, bagama't maaaring mas mahusay na tiyakin nang maaga na ang mga pahalang na sukat ng lahat ng mga imahe ay isang multiple ng 4.

Tulad ng nasabi na namin, ang format ng file ay idinisenyo upang maging unibersal para sa iba't ibang mga platform, kaya hindi nakakagulat na ang mga kulay ng palette ay nakaimbak dito nang naiiba kaysa sa kaugalian para sa VGA. Sa panahon ng pamamaraan ng pagbabasa, isinasagawa ang kinakailangang recoding. (Pag-uusapan natin kung ano ang VGA palette at kung paano ito gagawin sa mga sumusunod na artikulo.)

Ang module para sa pagbabasa ng 256-kulay na Bmp file ay may dalawang pamamaraan lamang. Tulad ng makikita mula sa listahan, ang mga sukat ng imahe ay dapat na maipasa sa ReadBMP file reading procedure. Ito ay maginhawa kung ang imahe ay hindi kailangang basahin nang buo. Kapag nalaman nang maaga ang mga sukat, hindi ito nagdudulot ng mga problema, ngunit makabubuti kung, gamit ang aming module, posible na basahin ang anumang mga imahe, kabilang ang mga hindi alam ang laki nang maaga. Para sa layuning ito, ibinigay ang pamamaraan ng ReadBMPheader, na nagbabasa lamang ng header ng file. Sa pamamagitan ng pagtawag dito, maaari mong suriin kung ang imahe ay naitala sa napiling 256-kulay na format, alamin ang mga sukat nito, at pagkatapos lamang maglaan ng memorya para dito at ilagay ito sa inilaan na buffer.

Ngayon, ikonekta natin ang isang bagong module sa ating programa. Upang gawin ito, isusulat namin ang pangalan nito sa direktiba ng mga gamit, at magbibigay din ng array para sa pag-iimbak ng data tungkol sa palette, na maaaring ilarawan tulad nito:

P: arrayof byte;

Ang pamamaraan ng CreateSprite, na humihiling sa pagpapatakbo ng pagbabasa ng isang file mula sa isang bagong module, ay pinasimple (tingnan).

Istraktura ng Bmp file

Pangalan Ang haba Bias Paglalarawan
Header ng file (BitMapFileHeader)
Uri2 0 Lagda "BM"
Sukat4 2 laki ng file
Nakareserba 12 6 Nakareserba
Nakareserba 22 8 Nakareserba
OffsetBits4 10 Offset ng imahe mula sa simula ng file
Header ng impormasyon (BitMapInfoHeader)
Sukat4 14 Haba ng header
Lapad4 18 Lapad ng larawan, mga puntos
taas4 22 Taas ng larawan, mga puntos
Mga eroplano2 26 Bilang ng mga eroplano
BitCount2 28 Lalim ng kulay, mga piraso bawat tuldok
Compression4 30 Uri ng compression (0 - hindi naka-compress na larawan)
Laki ng Larawan4 34 Laki ng larawan, byte
XpelsPerMeter4 38 Pahalang na resolusyon, mga tuldok bawat metro
YpelsPerMeter4 42 Vertical na resolution, mga tuldok bawat metro
Mga Kulay na Ginamit4 46 Bilang ng mga kulay na ginamit (0 ang maximum na posible para sa isang partikular na lalim ng kulay)
Mga Kulay Mahalaga4 50 Bilang ng mga pangunahing kulay
Color table (palette)
ColorTable1024 54 256 elemento ng 4 byte
Data ng Larawan (BitMap Array)
ImaheSukat1078 Imahe na naitala sa mga hilera mula kaliwa hanggang kanan at ibaba hanggang itaas

Listahan 1

unit bmpread; (mga pamamaraan para sa pagtatrabaho sa Bmp) uri ng interface arttype = arrayof byte; arptr = ^artype; bmFileHeader = record (file header) Typf: salita; (pirma) Sukat: longint; (haba ng file sa bytes) Res1: salita; (nakareserba) Res2: salita; (reserved) OfBm: longint; (image offset in bytes (1078)) end; bmInfoHeader = talaan (header ng impormasyon) Sukat: longint; (haba ng header sa bytes (40)) Widt: longint; (lapad ng larawan (sa mga pixel)) Heig: longint; (taas ng imahe (sa mga pixel)) Plano: salita; (bilang ng mga eroplano (1)) BitC: salita; (color depth (bits per dot) (8)) Comp: longint; (uri ng compression (0 - hindi)) SizI: longint; (laki ng imahe sa bytes) XppM: longint; (horizontal resolution) ((dots per meter - kadalasan 0)) YppM: longint; (vertical resolution) ((dots per meter - kadalasan 0)) NCoL: longint; (bilang ng mga kulay) ((kung ang maximum na pinapayagan ay 0)) NCoI: longint; (bilang ng mga pangunahing kulay) dulo; bmHeader = record (buong file header) f: bmFileHeader; (file header) i: bmInfoHeader; (header ng impormasyon) p: arrayof byte; (palette table) dulo; bmhptr = ^bmHeader; (pagbabasa ng imahe mula sa isang Bmp file) procedure ReadBMP(image:arptr; (array na may larawan) xim,yim:word; (dimensions) pal:arptr; (palette) filename:string); (pangalan ng file) (pagbabasa ng Bmp file header) pamamaraan ReadBMPheader(header:bmhptr;filename:string); pagpapatupad ($R-) (pagbabasa ng imahe mula sa Bmp file) procedure ReadBMP(image:arptr; xim,yim:word; pal:arptr; filename:string); var h: bmHeader; i:integer; bmpfile: file; s: longint; magsimulang magtalaga(bmpfile,filename); i-reset(bmpfile,1); blockread(bmpfile,h, sizeof(h)); (basahin ang header) para sa i:= 0 hanggang yim-1 magsisimula (basahin ang bawat linya) blockread(bmpfile,image^[(yim-i-1)*xim],xim); kung (xim mod 4)<>0 pagkatapos ay blockread(bmpfile,s,4 - (xim mod 4)); wakas; malapit (bmpfile); para sa i ^= 0 to 255 magsisimula (palette transformation) pal^ := h.p shr 2; (asul) pal^ := h.p shr 2; (berde) pal^ := h.p shr 2; (pula) dulo; wakas; (pagbabasa ng header ng Bmp file) procedure ReadBMPheader(header:bmhptr;filename:string); var bmpfile:file; magsimulang magtalaga(bmpfile,filename); i-reset(bmpfile,1); blockread(bmpfile,header^,sizeof(header^)); malapit (bmpfile); wakas; wakas.

Listahan 2

( sprite) procedure CreateSprite(s:string; x,y,dx,dy:integer); var f: file; (file na may sprite image) simulan getmem(Sprt.Img,sizeof(SpriteArrayType)); (maglaan ng memorya para sa sprite) getmem(Sprt.Back,sizeof(SpriteArrayType)); (maglaan ng memorya para sa buffer) Readbmp(@(Sprt.Img^),Xsize,Ysize,@p,s); Sprt.x:= x; Sprt.y:=y; (itakda ang mga inisyal na halaga) Sprt.dx:= dx; (coordinate at increments) Sprt.dy:= dy; wakas;

Sa aralin ngayon ay titingnan natin ang unang format ng file sa ating landas. Ang iba't ibang mga format ng file ay idinisenyo upang mag-imbak ng iba't ibang impormasyon. Ang bawat format ay tumutukoy ng isang paraan upang ayusin ang data sa isang file.

Makikilala natin ang maraming iba't ibang mga format ng file: mga larawan, mga three-dimensional na modelo, mga audio file, mga video file. Magsimula tayo sa isa sa mga pinakasimpleng graphic na format - BMP.

BMP - bitmap - bitmap. Ang konsepto ng "mapping" ay kinuha mula sa matematika. Sa matematika, ang pagmamapa ay napakalapit sa konsepto ng isang function. Para sa pagiging simple, isaalang-alang ang salitang bitmap bilang isang larawan (kahit na hindi).

Impormasyon ng BMP file

Ang bawat bitmap file ay may header na 14 bytes. Mga field para sa header na ito:

2 byte. BM string (sa Windows).
4 bytes. Laki ng file sa bytes.

2 byte. Nakareserbang field. Dapat masimulan sa zero.
4 bytes. Ang address kung saan nagsisimula ang larawan mismo. O sa madaling salita - isang offset sa simula ng imahe.

Gumawa tayo ng 100x100 pixel na imahe. Ang bawat pixel ay tumatagal ng 32 bits. Ang header ng file ay magiging ganito:

B.M.
14+40+100*100*4
0
0
14+40

Mahalagang tala: ang mga numerong ito ay aktwal na nakaimbak bilang isang pagkakasunud-sunod ng mga byte. Sana malinaw na ito. Dito (at sa susunod na halimbawa) inayos ko ang mga ito sa isang hanay para sa kadalian ng pang-unawa.

Harapin natin ang pangalawang larangan. 14 - laki ng header ng file. Ang 40 ay ang laki ng pamagat ng larawan (higit pa tungkol dito sa ibaba), 100*100 ang bilang ng mga pixel. At bukod pa, dahil napagkasunduan namin na ang bawat pixel ay sasakupin ng 32 bits (4 bytes), kailangan naming i-multiply ang bilang ng mga pixel sa apat.

Huling field: Ang larawan mismo ay nagsisimula kaagad pagkatapos ng file header (14 bytes) at ang image header (40 bytes).

Impormasyon sa Imahe ng BMP (Image Header)

Mayroong ilang mga bersyon ng BMP. Maaari mong matukoy ang bersyon sa pamamagitan ng laki ng pamagat ng larawan. Gagamitin namin ang bersyon ng Windows V3, na tumatagal ng hanggang 40 byte. Ang iba pang mga bersyon ay tumatagal ng 12, 64, 108, 124 bytes.

Ginagamit ng WinAPI ang istraktura ng BITMAPINFOHEADER upang iimbak ang bmp na bersyon ng Windows V3.

Mga field ng header ng Windows V3:

4 bytes. Laki ng header. Palaging nakatakda sa 40 bytes.
4 bytes. Ang lapad ng imahe sa mga pixel.
4 bytes. Ang taas ng imahe sa mga pixel.
2 byte. Palaging naglalaman ng isa ang field na ito.
2 byte. Ang lalim ng kulay ay ang bilang ng mga bit sa isang pixel.
4 bytes. Paraan ng compression.
4 bytes. Laki ng larawan. Ang laki ng imahe mismo ay ipinahiwatig dito - nang hindi isinasaalang-alang ang laki ng mga header.
4 bytes. Pahalang na resolusyon sa mga pixel bawat metro (ang bilang ng mga pixel sa isang metro).
4 bytes. Vertical na resolution sa mga pixel bawat metro (ang bilang ng mga pixel sa isang metro).
4 bytes. Bilang ng mga kulay sa palette.
4 bytes. Ang bilang ng mga mahahalagang kulay sa palette.

Ngayon tingnan natin kung ano ang magiging hitsura ng pamagat ng larawan sa aming kaso:

40
100
100
1
32
0
100*100*4
2795
2795
0
0

Para sa paraan ng compression, pinili namin ang 0 - walang compression. Posible ang iba pang mga halaga. Kabilang sa mga kawili-wili: BI_JPEG (value - 4) - compression na ginamit sa jpeg na mga imahe at BI_PNG (value - 5) - compression na ginamit sa png na imahe.

Itinakda namin ang pahalang at patayong resolution sa 2795. Sa karamihan ng mga editor ng graphics, kapag gumagawa ng imahe, ang resolution ay nakatakda sa 71 pixels per inch (ppi - pixel per inch)). Kaya, ang 71ppi ay 2795 pixels kada metro. Resolution ay ginagamit upang bigyan ang imahe ng pisikal na haba (para sa output sa isang printer, halimbawa).

Pagkatapos ng mga heading ay mayroong color palette. Kung wala ito, magsisimula kaagad ang larawan pagkatapos ng mga heading. Hindi namin isasaalang-alang ang mga larawang may mga palette sa ngayon.

Data ng imahe ng BMP

Ang isang imahe ay binubuo ng mga pixel. Ang format ng pixel ay tinutukoy ng lalim ng kulay (tingnan sa itaas). Sa aming halimbawa gumamit kami ng 32 bits bawat pixel. Ang 32-bit na kulay ay karaniwang binubuo ng apat na channel: alpha (transparency), pula, berde, asul: ARGB (Alpha, Red, Green, Blue). Minsan ang alpha channel ay hindi ginagamit, kung saan ang imahe ay maaari pa ring maghawak ng 32 bits, kapag nagkalkula ay hindi nila binibigyang pansin ang mga halaga ng isang channel. Sa kasong ito, ang mga pangalan ng channel ay nakasulat tulad ng sumusunod: XRGB.

Ang bawat channel ay sumasakop ng 8 bits (1 byte) at maaaring tumagal ng 256 na halaga: mula sa zero hanggang 255 (0x00 hanggang 0xff).

Sa bmp, ang imahe ay naka-imbak ng linya sa pamamagitan ng linya mula sa ibaba hanggang sa itaas, i.e. Ang mga ibabang linya ay unang nakasulat, pagkatapos ay ang mga nasa itaas. Siguraduhin ito: i-load ang isa sa mga larawan mula sa unang ehersisyo at i-save lamang ang kalahati ng mga linya ng larawang iyon sa isa pang file.

Sa 32-bit na lalim ng kulay, ang mga channel sa bmp ay nakasulat bilang mga sumusunod: BGRA. Sa ganitong pagkakasunud-sunod: asul, berde, pula, alpha.

Ang laki ng linya ng data sa bmp na imahe ay dapat na isang multiple ng apat (sa bytes). Kung hindi ito ang kaso, ang string ay may palaman na mga zero. Nangyayari ito kung 1,2,4,8,16,24 bits bawat channel ang ginagamit. Halimbawa, mayroon kaming isang imahe na 3 pixel ang lapad at gumagamit kami ng 16-bit na kulay. Lapad ng linya: 16*3 = 48 (6 byte). Ngunit ang haba ng linya ay dapat na isang multiple ng apat, kaya dalawa pang byte ang idinaragdag at ang haba ng linya sa halimbawang ito ay magiging walong byte. Kahit na ang huling dalawang byte ng bawat linya ay hindi mag-iimbak ng kapaki-pakinabang na impormasyon. Kinakailangang isaalang-alang ang kondisyon na ang laki ng linya ay isang maramihang ng apat kapag nagtatrabaho sa mga hindi-32-bit na imahe.

Ngayon ay magpatuloy tayo sa ating halimbawa at gamitin ang code upang lumikha ng isang imahe. Ang bawat pixel ay pasisimulan sa isang random na kulay:

Std::ofstream os("temp.bmp", std::ios::binary); unsigned char signature = ("B", "M"); unsigned int fileSize = 14 + 40 + 100*100*4; unsigned int reserved = 0; unsigned int offset = 14 + 40; unsigned int headerSize = 40; unsigned int dimensyon = ( 100, 100 ); unsigned short colorPlanes = 1; unsigned short bpp = 32; unsigned int compression = 0; unsigned int imgSize = 100*100*4; unsigned int resolution = ( 2795, 2795 ); unsigned int pltColors = 0; unsigned int impColors = 0; os.write(reinterpret_cast (pirma), laki ng(pirma)); os.write(reinterpret_cast (&fileSize), sizeof(fileSize)); os.write(reinterpret_cast (&reserved), sizeof(reserved)); os.write(reinterpret_cast (&offset), sizeof(offset)); os.write(reinterpret_cast (&headerSize), sizeof(headerSize)); os.write(reinterpret_cast (mga sukat), laki ng(mga sukat)); os.write(reinterpret_cast (&colorPlanes), sizeof(colorPlanes)); os.write(reinterpret_cast (&bpp), sizeof(bpp)); os.write(reinterpret_cast (&compression), sizeof(compression)); os.write(reinterpret_cast (&imgSize), sizeof(imgSize)); os.write(reinterpret_cast (resolution), sizeof(resolution)); os.write(reinterpret_cast (&pltColors), sizeof(pltColors)); os.write(reinterpret_cast (&impColors), sizeof(impColors)); unsigned char x,r,g,b; para sa (int i=0; i< dimensions; ++i) { for (int j=0; j < dimensions; ++j) { x = 0; r = rand() % 256; g = rand() % 256; b = rand() % 256; os.write(reinterpret_cast(&b),laki ng(b)); os.write(reinterpret_cast (&g),laki ng(g)); os.write(reinterpret_cast (&r),laki ng(r)); os.write(reinterpret_cast (&x),laki ng(x)); ) ) os.close();

Bilang resulta ng pag-execute ng code na ito, gagawa ng temp.bmp file sa folder kasama ng iyong proyekto (kung pinatakbo mo ang program sa pamamagitan ng debugger (F5)) o sa Debug folder ng solusyon (kung pinatakbo mo ang executable file .exe), na maaaring mabuksan sa anumang viewer ng imahe. Ang larawan ay binubuo ng mga may kulay na tuldok.

Nandito ka dahil mayroon kang file na may file extension na nagtatapos sa .bmp. Ang mga file na may extension ng file na .bmp ay maaari lamang ilunsad ng ilang partikular na application. Posibleng ang mga .bmp file ay mga data file sa halip na mga dokumento o media , na nangangahulugang hindi sila dapat tingnan.

ano ang isang .bmp file?

Ang format ng BMP file ay binubuo ng isang set ng mga detalye ng pag-encode ng imahe na ipinatupad para sa paggawa ng mga hindi naka-compress na raster na mga file ng imahe. Ang mga bitmap image file na ito ay naka-attach sa mga header ng file na kinabibilangan ng mga bitmap identifier kasama ng iba pang mga detalye na partikular sa nilalaman ng imahe ng mga kaukulang BMP file. Ang nilalaman ng digital na imahe na nakaimbak sa isang BMP file ay binubuo ng mga pixel sa loob ng isang parihabang grid. Ang mga pixel na nakapaloob sa mga BMP file na ito ay maaaring isama sa iba't ibang lalim ng kulay, depende sa mga header ng file ng mga BMP file. Ang mga grayscale gradient ay maaari ding ilapat sa mga pixel ng isang .bmp file, at ang mga .bmp file na ito ay maaaring i-export sa mas malawak na ginagamit na mga digital image file format na may mas maliit na sukat para sa pinakamainam na portability.

paano magbukas ng .bmp file?

Maglunsad ng .bmp file, o anumang iba pang file sa iyong PC, sa pamamagitan ng pag-double click dito. Kung tama ang pagkaka-set up ng iyong mga file association, bubuksan ito ng application na nilalayong buksan ang iyong .bmp file. Posibleng kailanganin mong i-download o bilhin ang tamang application. Posible rin na mayroon kang tamang application sa iyong PC, ngunit ang mga .bmp file ay hindi pa nauugnay dito. Sa kasong ito, kapag sinubukan mong magbukas ng .bmp file, masasabi mo sa Windows kung aling application ang tama para sa file na iyon. Mula noon, ang pagbubukas ng .bmp file ay magbubukas ng tamang application.

mga application na nagbubukas ng .bmp file

Adobe Photoshop CS6 para sa Microsoft Windows

Ang Adobe Photoshop CS6 para sa Microsoft Windows ay isang pag-edit ng imahe at pamamahala ng software na nada-download sa mga Windows computer, katulad ng Windows 7 (walang SP at may SP1) at Windows XP na may SP3. Ang software na ito ay may mga bagong feature at tool para sa madali, mabilis, masaya at advanced na pag-edit ng mga digital na larawan. Ang isang tampok na ginagawang maaasahan ang program na ito para sa pag-edit ng imahe ay ang Adobe Mercury Graphics Engine, na isang teknolohiya ng makina na nagbibigay ng mas mabilis at mataas na kalidad na pagganap. Ang mga tool sa Content-Aware ay mga bagong idinisenyong feature para sa pag-retouch ng mga larawan nang madali dahil maaari mong i-crop ang mga larawan nang walang anumang epekto, auto-correct blurriness o wide-angle lens curvatures, alisin ang pulang mata, at isaayos ang balanse ng kulay tulad ng liwanag at contrast. Ang editor ng larawan na ito ay kasama rin ng tampok na auto-recovery na maaaring mag-backup ng anumang hindi na-save na mga imahe, opsyon sa Pag-save ng Background, Blur Gallery, tool sa Pag-crop, paggawa ng video, at marami pang iba. Sa lahat ng mga bagong pinahusay na feature at modernong user-friendly na interface, ang pag-edit ng mga digital na larawan ay hindi kailanman magiging napakasaya at madali nang walang Photoshop CS6.

Adobe Photoshop CS6 para sa Mac

Adobe Photoshop CS6 para sa Mac

Ang Adobe Photoshop CS6 para sa Mac ay ang bersyon ng software sa pamamahala ng imahe ng "Creative Suite" na eksklusibong idinisenyo para sa mga Mac computer, partikular sa Mac OS X v10.6 hanggang 10.7 sa 64-bit. Ang program na ito sa pag-edit ng imahe ay kasama ng bagong hanay ng mga feature at tool, gaya ng Mercury Graphics Engine na binuo ng parehong kumpanya para sa mabilis at mataas na kalidad na pagpapahusay ng pagganap ng imahe, mga feature na May Kaalaman sa Nilalaman, intuitive na re-imagined na mga tool para sa pagdidisenyo ng pelikula, mga daloy ng trabaho , Blur Gallery, Crop tool at marami pang iba. Ang Adobe Mercury Graphics Engine ay gumagana sa paraang ginagawa nitong madali at mabilis na makumpleto ang gawain sa pag-edit. Nagbibigay-daan din ito sa pagbabahagi at paglipat ng mga larawang may mga opsyon sa auto-recovery at Pag-save sa Background. Ang bagong Content-Aware na tool ay ginawa para sa madali at nakokontrol na paraan ng pag-retouch o pagpapahusay ng mga larawan na nagreresulta sa mas nasisiyahang output. Karaniwang hinahayaan nito ang sinumang user na mag-auto-correct ng mga larawan, i-crop ang mga ito at itama ang mga curvature ng wide angle lens.

ACD Systems Canvas 14

ACD Systems Canvas 14

ACD Systems International Inc. ay ang developer ng ACD Systems Canvas 14, na isang teknikal na graphics solution software, na nagbibigay-daan sa mga user na suriin ang data, pagandahin ang mga graphics at ibahagi ang lahat ng impormasyon nang madali at mabilis. Ang program na ito ay idinisenyo gamit ang ganap na tampok na mga tool na tumutulong sa mga user sa paggawa ng mga teknikal na graphics at mga guhit nang may katumpakan. Binubuo ito ng mga tool sa pag-edit na nag-iiba mula sa pag-edit ng imahe hanggang sa mga tool sa paglalarawan ng bagay. Ang anumang mga resulta na nilikha ng programang ito ay gumagawa ng magagandang presentasyon para sa mga proyekto, panukala at iba pang layunin para sa anumang linya ng negosyo na may kaugnayan sa graphics at engineering. Higit pa sa mga tampok, ang mga gumagamit ay maaaring gumana sa mga raster na imahe at vector graphics gamit ang parehong file na may opsyon na pag-edit sa pamamagitan ng pagbabago ng laki at pag-scale ng mga bagay, pagguhit ng mga hugis, pati na rin ang pagpasok ng stroke at fill inks o lapad. Mayroon ding tool para sa pagdaragdag ng mga text o label at mga sukat ng format, kasama ang paggawa ng mga chart. Sa programang ito, maaaring ibahagi ng mga user ang mga natapos na proyekto sa pamamagitan ng mga presentasyon o publikasyon.

ACD Systems ACDSee 15

ACD Systems ACDSee 15

Ang ACD Systems ACDSee 15 ay isang photography software na nagtatampok ng image organizer, viewer, at RAW/image editor program para sa Microsoft Windows at Mac OS X 10.6 (Windows XP na may Service Pack 2, Vista, 7 & 8; Mac OS X 10.5, 10.6 , 10.7 at Mountain Lion). Ito ay binuo ng ACD Systems International, Inc. at orihinal na ibinahagi bilang isang 16-bit na application na kalaunan ay na-upgrade gamit ang isang 32-bit na bersyon. Ang minimum na kinakailangan ng hardware para sa application na ito ay isang Intel Pentium III/ AMD Athlon processor o katumbas ng 512 MB RAM (na may 310 MB na libreng hard drive space), isang mataas na kulay na display adapter sa 1024 x 768 na resolusyon, at isang CD/DVD burner. Pinamamahalaan at sinusuportahan ng ACDSee ang mga video at audio file sa mga format na kinabibilangan ng GIF, BMP, JPG, PNG, MP3, PSD, WAV, MPEG, at TIFF. Ang mga user ay maaaring tumingin, mag-edit, magdagdag ng mga epekto, at ayusin ang mga koleksyon ng larawan at video na maaaring ibahagi online. Maaaring ayusin ang mga larawan dahil na-import ang mga ito mula sa camera o iba pang storage device. Nagtatampok din ito ng Map view at geo-tagging support na nagbibigay-daan sa mga user na tingnan ang lokasyon ng mga larawan mula sa mga camera na pinagana ng GPS. Ang mga tampok tulad ng mabilis na pag-browse, pag-scan, pag-edit, at mga backup na opsyon ay nagpapadali sa pag-uuri ng mga larawan ayon sa petsa at kaganapan, at pag-imbak ng mga backup na kopya sa CD, DVD, at Blu-Ray.

Isara