日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bmp图片格式介绍

發布時間:2023/12/29 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bmp图片格式介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Bmp圖片格式介紹

介紹

BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。隨著Windows操作系統的流行與豐富的Windows應用程序的開發,BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大

文件數據結構

bmp 格式圖片的文件頭長度絕大多數都是 54 字節,其中包括 14 字節的 位圖文件頭(head)以及 40 字節的 DIB (Device Independent Bitmap) 位圖信息數據頭(BItmap Information Header)。

位圖文件頭(14 bytes)

地址(hex)字節長度(byte)描述
002固定頭文件字段,內容為0x424D
024bmp文件大小(little endian)
062預留字段
082預留字段
0A4圖片信息的開始位置

位圖信息數據頭(40bytes)

地址(hex)字節長度(byte)描述
0E4位圖信息數據頭的大小 40bytes
124圖像寬度(little endian)
164圖像高度(little endian)
1A2色彩平面的數量,默認為1
1C2每像素用多少bit表示
1E4圖片采用的壓縮方式,通常不壓縮即BL_RGB,對應值0
224圖片大小(原始位圖數據大小)對于不壓縮的圖片,默認為0
264橫向分辨率(像素/米)
2A4縱向分辨率(像素/米)
2E4調試板中顏色數量,默認為0
324重要顏色的數量,默認為0

原始位圖數據 Raw Bitmap Data

拿最常見的 24BPP RGB (24 比特每像素,紅綠藍三通道) 位圖來說,每種顏色需要 8 比特,或者說 1 字節,來存儲。在二進制文件中,通常情況下,RGB 按照藍、綠、紅的順序依次表示圖片中的像素點,而 RGBA 則按照藍、綠、紅、透明的順序(從左下開始,橫向逐行向上掃描)。特殊時候,也會出現順序與上述情況不同的特例,這時色彩順序會寫在 DIB Header 的 Bit Fields 中,以不同色彩通道的 Mask 的形式進行規定。由于 BI_BITFIELDS 也是一種壓縮方式,而通常 BMP 不采用任何壓縮方式,所以絕大多數時候,我們都是按照前面說的順序進行排序。

地址(hex)字節長度(byte)描述(big endian)
36400 00 FF 00Red Channel bit mask
3A400 FF 00 00Green Channel bit mask
3E4FF 00 00 00Blue Channel bit mask
42400 00 00 FFAlpha Channel bit mask

主流的 CPU 每次從內存中讀取并處理數據塊(chunk),且通常為 32 比特(4 字節)。因此,為了提升讀取效率,位圖每行的數據(字節)都需要是 4 的倍數,字節對齊

Row_Size = (BitPerPixel * Image_Width + 31) / 32 * 4

每行的字節數等于:每像素比特數乘以圖片寬度31 的和除以 32,并向下取整,最后乘以 4

Pix_Array_Size = Row_Size * Image_Height

原始位圖數據大小等于:每行的字節數乘以圖像高度(也就是總行數)

文件大小 = 原始位圖數據大小 + 文件頭大小

代碼表示bitmap數據

BitMap Head

#pragma pack(1) typedef struct {unsigned short bfType; // "BM"unsigned int bfSize; // 文件大小unsigned short bfReserved1; // 保留,必須設置為0unsigned short bfReserved2; // 保留,必須設置為0unsigned int bfOffBits; // 從文件頭到像素數據的偏移 } BitMapFileHeader;

BitMap Info Header

typedef struct{unsigned int biSize; // 此結構體的大小int biWidth; // 圖像的寬int biHeight; // 圖像的高unsigned short biPlanes; // 表示bmp圖片的平面屬,顯然顯示器只有一個平面,所以恒等于1unsigned short biBitCount; // 一像素所占的位數,一般為24unsigned int biCompression; // 說明圖象數據壓縮的類型,0為不壓縮。unsigned int biSizeImage; // 像素數據所占大小, 這個值應該等于上面文件頭結構中bfSize-bfOffBitsint biXPelsPerMeter; // 說明水平分辨率,用象素/米表示。一般為0int biYPelsPerMeter; // 說明垂直分辨率,用象素/米表示。一般為0unsigned int biClrUsed; // 說明位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)。unsigned int biClrImportant;// 說明對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。 } BitMapInfoHeader;

rgb

// 24bit typedef struct {unsigned char rgblue;unsigned char rgbgreen; unsigned char rgbred;unsigned char rgbreserved; } PixelInfo;

代碼demo

讀取bmp文件數據頭

#ifndef _BMP_H_ #define _BMP_H_#pragma pack(1)typedef struct {unsigned short bfType; // "BM"unsigned int bfSize; // 文件大小unsigned short bfReserved1; // 保留,必須設置為0unsigned short bfReserved2; // 保留,必須設置為0unsigned int bfOffBits; // 從文件頭到像素數據的偏移 } BitMapFileHeader;typedef struct{unsigned int biSize; // 此結構體的大小int biWidth; // 圖像的寬int biHeight; // 圖像的高unsigned short biPlanes; // 表示bmp圖片的平面屬,顯然顯示器只有一個平面,所以恒等于1unsigned short biBitCount; // 一像素所占的位數,一般為24unsigned int biCompression; // 說明圖象數據壓縮的類型,0為不壓縮。unsigned int biSizeImage; // 像素數據所占大小, 這個值應該等于上面文件頭結構中bfSize-bfOffBitsint biXPelsPerMeter; // 說明水平分辨率,用象素/米表示。一般為0int biYPelsPerMeter; // 說明垂直分辨率,用象素/米表示。一般為0unsigned int biClrUsed; // 說明位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)。unsigned int biClrImportant;// 說明對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。 } BitMapInfoHeader;// 24bit typedef struct {unsigned char rgblue;unsigned char rgbgreen; unsigned char rgbred;unsigned char rgbreserved; } PixelInfo;#endif #include <stdio.h> #include "bmp.h"void show_bmp_file_head(BitMapFileHeader *data) {printf("#########################################\n");printf("bfType %x\n", data->bfType);printf("bfSize %d\n", data->bfSize/1024);printf("bfOffBits %d\n", data->bfOffBits); }void show_bmp_info_head(BitMapInfoHeader *data) {printf("#########################################\n");printf("biSize %d\n", data->biSize);printf("biWidth %d\n", data->biWidth);printf("biHeight %d\n", data->biHeight);printf("biPlanes %d\n", data->biPlanes);printf("biBitCount %d\n", data->biBitCount);printf("biCompression %d\n", data->biCompression);printf("biXPelsPerMeter %d\n", data->biXPelsPerMeter);printf("biYPelsPerMeter %d\n", data->biYPelsPerMeter);printf("biClrUsed %d\n", data->biClrUsed);printf("biClrImportant %d\n", data->biClrImportant); }void show_bmp_rgb(PixelInfo *data) {printf("#########################################\n");printf("rgblue %2x\n", data->rgblue);printf("rgbgreen %2x\n", data->rgbgreen);printf("rgbred %2x\n", data->rgbred); }int main(int argc, char *argv[]) {FILE *fp = NULL;BitMapFileHeader FileHead;BitMapInfoHeader InfoHead;PixelInfo rgbinfo;char *ptr = NULL;int i, j;fp = fopen(argv[1], "rb");if(fp == NULL){perror("open bmp file error");return -1;}fread(&FileHead, sizeof(BitMapFileHeader), 1, fp);fread(&InfoHead, sizeof(BitMapInfoHeader), 1, fp);show_bmp_file_head(&FileHead);show_bmp_info_head(&InfoHead);show_bmp_rgb(&rgbinfo);ptr = (unsigned char *)malloc(FileHead.bfSize);if(ptr == NULL){perror("malloc ptr fail\n");return 0;}for(i = 0; i <= InfoHead.biHeight; i++){for(j = 0; j <= InfoHead.biWidth; j++){fread(&rgbinfo, sizeof(PixelInfo), 1, fp);*ptr = 0xff << 24 | rgbinfo.rgbred << 16 | rgbinfo.rgbgreen << 8 | rgbinfo.rgblue;memset(&rgbinfo, 0, sizeof(PixelInfo));ptr++;if((rgbinfo.rgbred == 255) && (rgbinfo.rgbgreen == 255) && (rgbinfo.rgblue == 255))printf(" ");elseprintf("#");}printf("\n");} fclose(fp);return 0; } lin@u-android:~/lin/workspace/demo_project/bmp$ gcc -o bmp_test show_bmp_head.c lin@u-android:~/lin/workspace/demo_project/bmp$ ./bmp_test ./test.bmp ######################################### bfType 4d42 bfSize 459 bfOffBits 54 ######################################### biSize 40 biWidth 507 biHeight 309 biPlanes 1 biBitCount 24 biCompression 0 biXPelsPerMeter 0 biYPelsPerMeter 0 biClrUsed 0 biClrImportant 0

總結

以上是生活随笔為你收集整理的Bmp图片格式介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。