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

代碼片段和文件信息
#include???
#include???
#include???
#include???
using?namespace?std;
BITMAPFILEHEADER?bmpFileHeader;?//位圖文件頭??
BITMAPINFOHEADER?bmpInfoHeader;?//位圖信息頭??
RGBQUAD?*pColorTable;???????????//顏色表,注:24位真彩色圖無顏色表??
unsigned?char?*pBmpData;????????//位圖數據??
unsigned?char?*pGrayData;???????//灰度圖像數據??
bool?readBmp(char?*fileName)
{
FILE?*fp?=?fopen(fileName?“rb“);????//以二進制讀方式打開??
if?(NULL?==?fp)
{
cout?<“File?is?opened?failure!“?< return?FALSE;
}
//讀取數據??
fread(&bmpFileHeader?sizeof(BITMAPFILEHEADER)?1?fp);
fread(&bmpInfoHeader?sizeof(BITMAPINFOHEADER)?1?fp);
pBmpData?=?new?unsigned?char[bmpInfoHeader.biSizeImage];???//申請空間,大小為位圖數據大小??
fread(pBmpData?sizeof(unsigned?char)?bmpInfoHeader.biSizeImage?fp);
fclose(fp);?????????//不要忘了關閉文件??
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;????????//原圖數據大小??
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轉換為灰度值??
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“);???//以二進制寫方式打開??
if?(NULL?==?fp)
{
cout?<“File?is?opened?failure!“?< return?FALSE;
}
//寫入數據??
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);
//釋放內存空間??
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;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????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??真彩色圖像灰度化\實驗報告.doc
?????目錄??????????0??2018-05-20?20:13??真彩色圖像灰度化
-----------?---------??----------?-----??----
??????????????1366045????????????????????7
- 上一篇:我國常用的地圖投影參數
- 下一篇:云平臺技術論文
評論
共有 條評論