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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

C语言读取bmp图像并做简单显示

發(fā)布時(shí)間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言读取bmp图像并做简单显示 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言讀取bmp圖像并做簡(jiǎn)單顯示)

  • bmp文件格式
  • 讀取bmp文件信息并展示

bmp文件格式

bmp文件大體上分為四個(gè)部分:

bmp文件構(gòu)成
位圖文件頭BITMAPFILEHEADER
位圖信息頭BITMAPINFOHEADER
調(diào)色板Palette
實(shí)際的位圖數(shù)據(jù)ImageDate

第一部分為位圖文件頭,位圖文件頭長(zhǎng)度固定,為14個(gè)字節(jié)。

typdef struct {
WORD bfType;    //指定文件類型,必須是0x424d,即”BM”
DWORD bfSize;   //指定文件大小
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //為文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即上圖前三部分和
}bitmapFileHeader;

第二部分為位圖信息頭,這個(gè)結(jié)構(gòu)的長(zhǎng)度也是固定的,為40個(gè)字節(jié)。

typedef struct {DWORD biSize;  //指這個(gè)機(jī)構(gòu)的長(zhǎng)度,為40LONG biWidth;  //指定圖像的寬度,單位是像素LONG biHeight;  //指定圖像的高度,單位是像素WORD biPlanes;  //平面數(shù),必須為1,不用考慮 WORD biBitCount; //指定表示顏色是要用到的位數(shù),常用值為1(黑白二色圖),//4(16色圖),8(256色),24(真彩色圖)(新的.bmp格式支持32位色)DWORD biCompression; //指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFILELDSDWORD biSizeImage; //指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù),其實(shí)也可以從以下的公式計(jì)算出來(lái)://biSizeImage=bitWidth’*biHeight,bitWidth‘為大于等于bitWidth的4的倍數(shù)LONG biXPelsPerMeter; //指定設(shè)備的水平分辨率,單位是每米的圖像個(gè)數(shù)LONG biYPelsPerMeter; //同上,垂直分辨率DWORD biClrUsed; //指定本圖像實(shí)際用到的顏色數(shù),如果該值為零,則用到的顏色數(shù)為2^biBitCountDWORD biClrImportant;// 指定本圖象中重要的顏色數(shù),如果該值為零,則認(rèn)為所有的顏色都是重要的
}bitmapInfoHeader;

第三部分為調(diào)色板(真彩圖像不需要調(diào)色版,bitmapInfoHeader后直接是數(shù)據(jù))調(diào)色板實(shí)際是一個(gè)數(shù)組,共有biClrUsed個(gè)元素(如果該值為0,則有2^biBitCount個(gè)元素),數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),占四個(gè)字節(jié),其定義如下:

typedef struct {BYTE rgbBlue; //該顏色的藍(lán)色分量BYTE rgbGreen; //該顏色的綠色分量BYTE rgbRed; //該顏色的紅色分量BYTE rgbReserved; //保留值
} RGBQUAD;

第四部分為實(shí)際圖像數(shù)據(jù)
對(duì)于用到調(diào)色版的位圖,圖像數(shù)據(jù)就是該像素顏在調(diào)色板中的索引值。對(duì)于真彩圖,圖像數(shù)據(jù)就是實(shí)際的R、G、B值。

需要注意兩點(diǎn):
(1)每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,則需要補(bǔ)齊。
(2)一般來(lái)說(shuō),.bmp文件的數(shù)據(jù)是從下到上,從左到右的。也就是說(shuō),從文件中最先讀到的是圖象最下面一行的左邊第一個(gè)像素,然后是左邊第二個(gè)像素……接下來(lái)是倒數(shù)第二行左邊第一個(gè)像素,左邊第二個(gè)像素……依次類推 ,最后得到的是最上面一行的最右一個(gè)像素。

讀取bmp文件信息并展示

以24位bmp圖像為例

定義數(shù)據(jù)結(jié)構(gòu):

typedef struct {unsigned char bfType[2];unsigned long bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned long bfOffBits;
}bitmapFileHeader;typedef struct {unsigned long biSize;long biWidth;long biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned long biCompression;unsigned long biSizeImage;long biXPixPerMeter;long biYPixPerMeter;unsigned long biClrused;unsigned long biClrImportant;
}bitmapInfoHeader;

讀入文件頭:

//僅展示,不用于實(shí)驗(yàn)
int readFileHeader(FILE *fp,bitmapFileHeader*bfHeader){fseek(fp,0,SEEK_SET);fread(bfHeader,sizeof(bitmapFileHeader),1,fp);/*int i;	printf("讀入文件頭:");char*p=(char*)bfHeader;for(i=0;i<sizeof(bitmapFileHeader);i++,p++){printf("%02x ",*p);}printf("\n");printf("文件頭信息如下:\n");printf("文件類型:%c%c\n",bfHeader->bfType[0],bfHeader->bfType[1]);printf("文件大小: %d 字節(jié)\n",bfHeader->bfSize);printf("位圖數(shù)據(jù)偏移:%d\n",bfHeader->bfOffBits);*/return 0;
}

讀信息頭:

//僅展示,不用于實(shí)驗(yàn)
int readInfoHeader(FILE*fp,bitmapInfoHeader*biHeader){fseek(fp,14,SEEK_SET);fread(biHeader,sizeof(bitmapInfoHeader),1,fp);/*int i;printf("讀入位圖信息頭:\n");char*p=(char*)biHeader;for(i=0;i<sizeof(bitmapInfoHeader);i++,p++){printf("%02x ",*p);if(i%20==0&&i!=0)printf("\n");}printf("\n");printf("位圖信息頭信息如下:\n");printf("bmp圖像寬度:%d\n",biHeader->biWidth);printf("bmp圖像高度:%d\n",biHeader->biHeight);printf("bmp圖像顏色位數(shù): %d\n",biHeader->biBitCount);printf("bmp圖像實(shí)際數(shù)據(jù)占用字節(jié):%d\n",biHeader->biSizeImage);*/return 0;
}

讀入bmp圖像數(shù)據(jù),并展示

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>#pragma pack(1)  //這個(gè)選項(xiàng)挺重要,不加的話程序就會(huì)報(bào)錯(cuò),原因參考
//https://blog.csdn.net/qq_44310495/article/details/109181857typedef struct {unsigned char bfType[2];unsigned long bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned long bfOffBits;
}bitmapFileHeader;typedef struct {unsigned long biSize;long biWidth;long biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned long biCompression;unsigned long biSizeImage;long biXPixPerMeter;long biYPixPerMeter;unsigned long biClrused;unsigned long biClrImportant;
}bitmapInfoHeader;int main(){FILE *fp,*fp_txt;if((fp=fopen("d:\Temp\\skull.bmp","rb"))==NULL){perror("can not open file!");return -1;}bitmapFileHeader bfHeader;fread(&bfHeader,14,1,fp);bitmapInfoHeader biHeader;fread(&biHeader,40,1,fp);int imSize=biHeader.biSizeImage;int width=biHeader.biWidth;int height=biHeader.biHeight;int bitCount=biHeader.biBitCount;fseek(fp,bfHeader.bfOffBits,SEEK_SET);unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));fread(imageData,imSize*sizeof(unsigned char),1,fp);//圖像為24位圖像int lineBytes=(bitCount*width+31)/32*4;//得到圖像數(shù)據(jù)的bitwidth'int i,j;int r,g,b;for(i=0;i<height;i++){ //對(duì)于每一行for(j=0;j<width*3;j++){ //對(duì)于每一列r=*(imageData+lineBytes*(height-1-i)+j); //從最后一行往上讀j++;g=*(imageData+lineBytes*(height-1-i)+j);j++;b=*(imageData+lineBytes*(height-1-i)+j);if(r==255&&g==255&&b==255) //模擬二值圖像展示printf("  ");elseprintf(".$");}printf("\n");}free(imageData);fclose(fp);getchar();return 0;
}

代碼效果展示:

總結(jié)

以上是生活随笔為你收集整理的C语言读取bmp图像并做简单显示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。