资源简介
步骤:(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!“ << endl;
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 < bmpInfoHeader.biHeight; i++)
{
for (int j = 0; j < bmpInfoHeader.biWidth; 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!“ << endl;
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!“ << endl;
convert();
char writeFileName[] = “D:\\图片\\gray.bmp“;
if (!writeBmp(writeFileName))
cout << “The function of writebmp error!“ << endl;
cout << “convert success!“ << endl;
}
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
- 上一篇:我国常用的地图投影参数
- 下一篇:云平台技术论文
相关资源
- 双目深度估计代码.zip
- IBM SPSS Statistics 24 中文手册
- 网上多媒体信息分析与检索-庄越挺等
- BMW病毒样本!!!测试专用
- 惠普“灵动e平台”,令
- BMS检测代码-12路-串联
- 编程常用的素材(含png、jif、bmp、j
- 在真实世界中的EMI控制-IBM资深工程师
- IBM智能化油田解决方案
- jpeglib读取jpeg,转为bmp图,24真彩和灰
- IBM Converged Switch B32(3758)交换机介绍
- 617张国内车牌60-17bmp图片用于OpenCV正样
- 2010年IBM全球CEO调研报告
- 07311自考多媒体技术历年真题CHM格式
- 03-IBM DOORS ISO26262 Certificate.pdf
- 对啊直播课堂 v3.0.0.0.zip
- 一种基于LBM的气液固三相流多尺度模
- pEGFP-N1/BMP-2真核表达质粒的构建与鉴定
- 18-19年多媒体分析与理解.zip
- 多媒体教室预约系统
- 默罕默德-格子玻尔兹曼方法书籍
- 简单\“(8bit)Raw图像文件转换为(
- WebSphere_Application_Server教程
- 广东工业大学多媒体技术试卷+习题答
- ORL人脸数据集,40个人,共400张bmp格式
- BME680(CN).pdf
- BMS策略 仿真
- UBM-GMM用于声纹识别
-
100Gba
se SR4 802.3bm - IBM-V3500/3700配置手册
评论
共有 条评论