資源簡(jiǎn)介
步驟:(1) 讀取文件信息,以二進(jìn)制方式打開(kāi)并讀取位圖文件信息復(fù)制給新的變量后關(guān)閉文件;(2) 定義灰色為圖文件變量,套用灰度化公式,改變RGB值,將真彩色圖像轉(zhuǎn)換為灰色圖像;(3) 將轉(zhuǎn)換成的灰色圖像存儲(chǔ)到文件夾,然后關(guān)閉文件夾,釋放內(nèi)存空間。(4)由于從真菜色圖到灰度圖的轉(zhuǎn)變之后,會(huì)產(chǎn)生新的顏色表,需要使用(bmpFileHeader.bfOffBits += (sizeof(RGBQUAD) * 256); ) 進(jìn)行改變;(5) bmp數(shù)據(jù)存儲(chǔ)時(shí)按行從左到右、按列從下到上掃描,所以對(duì)于24位bmp文件,數(shù)據(jù)區(qū)前三個(gè)字節(jié)代表位圖左下角第一個(gè)元素;

代碼片段和文件信息
#include???
#include???
#include???
#include???
using?namespace?std;
BITMAPFILEHEADER?bmpFileHeader;?//位圖文件頭??
BITMAPINFOHEADER?bmpInfoHeader;?//位圖信息頭??
RGBQUAD?*pColorTable;???????????//顏色表,注:24位真彩色圖無(wú)顏色表??
unsigned?char?*pBmpData;????????//位圖數(shù)據(jù)??
unsigned?char?*pGrayData;???????//灰度圖像數(shù)據(jù)??
bool?readBmp(char?*fileName)
{
FILE?*fp?=?fopen(fileName?“rb“);????//以二進(jìn)制讀方式打開(kāi)??
if?(NULL?==?fp)
{
cout?<“File?is?opened?failure!“?< return?FALSE;
}
//讀取數(shù)據(jù)??
fread(&bmpFileHeader?sizeof(BITMAPFILEHEADER)?1?fp);
fread(&bmpInfoHeader?sizeof(BITMAPINFOHEADER)?1?fp);
pBmpData?=?new?unsigned?char[bmpInfoHeader.biSizeImage];???//申請(qǐng)空間,大小為位圖數(shù)據(jù)大小??
fread(pBmpData?sizeof(unsigned?char)?bmpInfoHeader.biSizeImage?fp);
fclose(fp);?????????//不要忘了關(guān)閉文件??
return?TRUE;
}
void?convert()
{
bmpFileHeader.bfOffBits?+=?(sizeof(RGBQUAD)?*?256);
bmpInfoHeader.biBitCount?=?8;
int?lineBytes?=?(bmpInfoHeader.biWidth?*?8?+?31)?/?32?*?4;
int?oldLineBytes?=?(bmpInfoHeader.biWidth?*?24?+?31)?/?32?*?4;
int?oldSize?=?bmpInfoHeader.biSizeImage;????????//原圖數(shù)據(jù)大小??
bmpInfoHeader.biSizeImage?=?lineBytes?*?bmpInfoHeader.biHeight;
//定義灰度圖像的顏色表??
pColorTable?=?new?RGBQUAD[256];
for?(int?i?=?0;?i?256;?i++)
{
(*(pColorTable?+?i)).rgbBlue?=?i;
(*(pColorTable?+?i)).rgbGreen?=?i;
(*(pColorTable?+?i)).rgbRed?=?i;
(*(pColorTable?+?i)).rgbReserved?=?0;
}
//將RGB轉(zhuǎn)換為灰度值??
int?red?green?blue;
BYTE?gray;
pGrayData?=?new?unsigned?char[bmpInfoHeader.biSizeImage];
memset(pGrayData?0?bmpInfoHeader.biSizeImage);
?
for?(int?i?=?0;?i? {
for?(int?j?=?0;?j? {
red?=?*(pBmpData?+?i*oldLineBytes?+?3?*?j);
green?=?*(pBmpData?+?i*oldLineBytes?+?3?*?j?+?1);
blue?=?*(pBmpData?+?i*oldLineBytes?+?3?*?j?+?2);
gray?=?(BYTE)((77?*?red?+?151?*?green?+?28?*?blue)?>>?8);
*(pGrayData?+?i*lineBytes?+?j)?=?gray;
}
}
}
bool?writeBmp(char?*fileName)
{
FILE?*fp?=?fopen(fileName?“wb“);???//以二進(jìn)制寫(xiě)方式打開(kāi)??
if?(NULL?==?fp)
{
cout?<“File?is?opened?failure!“?< return?FALSE;
}
//寫(xiě)入數(shù)據(jù)??
fwrite(&bmpFileHeader?sizeof(BITMAPFILEHEADER)?1?fp);
fwrite(&bmpInfoHeader?sizeof(BITMAPINFOHEADER)?1?fp);
fwrite(pColorTable?sizeof(RGBQUAD)?256?fp);
fwrite(pGrayData?sizeof(unsigned?char)?bmpInfoHeader.biSizeImage?fp);
fclose(fp);
//釋放內(nèi)存空間??
delete[]pColorTable;
delete[]pBmpData;
delete[]pGrayData;
return?TRUE;
}
void?work()
{
char?readFileName[]?=?“D:\\圖片\\lena.bmp“;
if?(!readBmp(readFileName))
cout?<“The?function?of?readBmp?error!“?< convert();
char?writeFileName[]?=?“D:\\圖片\\gray.bmp“;
if?(!writeBmp(writeFileName))
cout?<“The?function?of?writebmp?error!“?< cout?<“convert?success!“?<
}
int?main()
{
work();
return?0;
}
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????3042??2018-05-20?19:46??真彩色圖像灰度化\covert_method1.cpp
?????文件???????2969??2018-05-20?19:46??真彩色圖像灰度化\covert_method2.cpp
?????文件?????263222??2018-05-20?19:38??真彩色圖像灰度化\gray_method1.bmp
?????文件?????263222??2018-05-20?19:46??真彩色圖像灰度化\gray_method2.bmp
?????文件?????786486??2018-05-20?19:02??真彩色圖像灰度化\lena.bmp
?????文件??????47104??2018-05-20?20:10??真彩色圖像灰度化\實(shí)驗(yàn)報(bào)告.doc
?????目錄??????????0??2018-05-20?20:13??真彩色圖像灰度化
-----------?---------??----------?-----??----
??????????????1366045????????????????????7
評(píng)論
共有 條評(píng)論