資源簡介
讀寫8位BMP灰度圖像,程序簡潔、準確,是我發現最好的讀BMP程序。里面有測試圖像。

代碼片段和文件信息
/***********************************************************************
*功能:讀寫8位BMP灰度圖像。
*姓名:Daniel
*單位:中科院蘇州醫工所
*時間:2012.10.19
***********************************************************************/
#include?
#include?
#include?
/***********************************************************************
*函數名稱:
* readBmp()
*
*函數參數:
* char?*bmpName?-文件名字及路徑
* int?*bmpWidth?-圖像寬度指針變量
* int?*bmpHeight?-圖像高度指針變量
*
*返回值:
* unsigned?char?*?-圖像數據指針
*
*說明:
* (1)給定一個圖像文件名及其路徑,讀圖像的位圖數據、寬、高、顏色表及每像素
*位數等數據進內存。
* (2)該讀程序僅針對灰度圖像(biBitCount=8)格式
***********************************************************************/
unsigned?char?*readBmp(char?*bmpNameint?*bmpWidthint?*bmpHeight)
{
//二進制讀方式打開指定的圖像文件
FILE?*fp=fopen(bmpName“rb“);
if(fp==0)?return?0;
//跳過位圖文件頭結構BITMAPFILEHEADER
fseek(fp?sizeof(BITMAPFILEHEADER)0); //moves?the?file?pointer?to?a?specified?location
//定義位圖信息頭結構變量,讀取位圖信息頭進內存,存放在變量head中
BITMAPINFOHEADER?head;
fread(&head?sizeof(BITMAPINFOHEADER)?1fp);?
//獲取圖像寬、高等信息
*bmpWidth?=?head.biWidth;
*bmpHeight?=?head.biHeight;
//定義變量,計算圖像每行像素所占的字節數(必須是4的倍數)
int?biBitCount=8; //8位灰度圖像
int?lineByte=((*bmpWidth)*biBitCount/8+3)/4*4;
//灰度圖像有顏色表,且顏色表表項為256
RGBQUAD?*pColorTable=new?RGBQUAD[256]; //申請顏色表所需要的空間
fread(pColorTablesizeof(RGBQUAD)256fp); //讀顏色表進內存
//申請位圖數據所需要的空間,讀位圖數據進內存
unsigned?char?*pBmpBuf=new?unsigned?char[lineByte*(*bmpHeight)];
fread(pBmpBuf1lineByte*(*bmpHeight)fp);
//關閉文件
fclose(fp);
return?pBmpBuf;
}?
/***********************************************************************
*函數名稱:
* saveBmp()
*
*函數參數:
* unsigned?char?*imgBuf-待存盤的位圖數據
*???int?width-以像素為單位待存盤位圖的寬
*???int?height-以像素為單位待存盤位圖高
* char?*bmpName-文件名字及路徑
*
*返回值:
*???0為失敗,1為成功
*
*說明:
* 1.給定一個圖像的位圖數據、寬、高等信息,將其寫到指定文件中。
* 2.該讀程序僅針對灰度圖像(biBitCount=8)格式
***********************************************************************/
bool?saveBmp(unsigned?char?*imgBuf?int?width?int?height?char?*bmpName)
{
//如果位圖數據指針為0,則沒有數據傳入,函數返回
if(!imgBuf)?return?0;
int?biBitCount=8; //每個像素所占的位數(bit)
//顏色表大小,以字節為單位,灰度圖像顏色表為1024字節
int?colorTablesize=1024;
//待存儲圖像數據每行字節數為4的倍數
int?lineByte=(width?*?biBitCount/8+3)/4*4;
//以二進制寫的方式打開文件
FILE?*fp=fopen(bmpName“wb“);
if(fp==0)?return?0;
//申請位圖文件頭結構變量,填寫文件頭信息
BITMAPFILEHEADER?fileHead;
fileHead.bfType=0x4D42; //bmp類型
//bfSize是圖像文件4個組成部分之和
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
//bfOffBits是圖像文件前3個部分所需空間之和
fileHead.bfOffBits=54+colorTablesize;
//寫文件頭進文件
fwrite(&fileHead?sizeof(BITMAPFILEHEADER)1?fp);
//申請位圖信息頭結構變量,填寫信息頭信息
BITMAPINFOHEADER?head;
head.biSize=40; //本結構的長度
head.biWidth=width; //位圖的寬度,以像素為單位
head.biHeight=height; //位圖的寬度,以像素為單位
head.biPlanes=1; //目標設備的級別,必須是1
head.biBitCount=biBitCount; //每個像素所占的位數(bit),其值必須為1(黑白圖像),4(16色圖),
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????191174??2012-10-18?10:20??讀寫灰度BMP圖像程序[經典]\TestBmpRdWt.bmp
?????文件??????191174??2012-10-19?15:28??讀寫灰度BMP圖像程序[經典]\TestBmpRdWt_New.bmp
?????文件????????5118??2012-10-19?16:43??讀寫灰度BMP圖像程序[經典]\main.cpp
?????目錄???????????0??2012-10-19?16:31??讀寫灰度BMP圖像程序[經典]\
- 上一篇:ieee 分布式34節點模型
- 下一篇:informix數據庫常用備份方法 - 總結
評論
共有 條評論