彩色bmp图片转灰度
2011-08-24 22:05
281 查看
下面这个程序可以将一个彩色的bmp格式图片转换灰度图片:
view plainprint?
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
/*BMP文件格式如下:
㈠BITMAPFILEHEADER:位图文件头(只用于BMP文件)
bfType="BM"
bfSize
bfReserved1
bfReserved2
bfOffBits 从文件头到实际的位图数据的偏移字节数,即前三个部分长度之和
㈡BITMAPINFOHEADER:位图信息头
biSize 这个结构的长度,为40个字节
biWidth 图象的宽度,单位是像素
biHeight 图象的高度,单位是像素
biPlanes
biBitCount
biCompression
biSizeImage 实际的位图字节数据占用的字节数 biSizeImage=biWidth_*biHeight,其中biWidth必须是4的整数倍
如果biCompression为BI_RGB,则该项可能为0
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
㈢Palette :调色板
灰度图象一般不需要考虑调色板,一般灰度图没有调色板
㈣DIB Pixels :图象数据
*/
BITMAPFILEHEADER bf; //文件头
BITMAPINFOHEADER bi; //信息头
RGBQUAD *palette=NULL; //调色板
BYTE *m_imagedata=NULL; //图象数据指针
BYTE *m_outputdata=NULL; //输出数据指针
int m_ImageWidth; //图象宽度
int m_ImageHeight; //图象高度
void main()
{
FILE *fp1,*fp2; //文件指针,fp1为源文件,fp2为处理以后的文件
//打开文件,到文件指针
if((fp1=fopen("test.bmp","rb"))==NULL)
{
MessageBox(NULL,"文件打开错误","warning",MB_OK);
}
fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1); //读取文件头,读取以后文件指针在文件头末尾(即信息头)
//以下输出文件头的一些有用的数据
int temp=bf.bfType; //便于将开头两个字节转化为字符显示
cout<<"BM标志:"<<(char *)(&temp)<<'\n';
cout<<"偏移字节数:"<<bf.bfOffBits<<'\n';
fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1); //读取信息头
//以下输出信息头的一些有用的数据
cout<<"图象宽度:"<<bi.biWidth<<'\n';
cout<<"图象高度:"<<bi.biHeight<<'\n';
m_ImageWidth=bi.biWidth; //给图象宽度赋值
m_ImageHeight=bi.biHeight; //给图象高度赋值
//每一行的数据必须是4的整数倍,如果不是,需要补齐
while(m_ImageWidth%4!=0) //让宽度为4的整数倍
m_ImageWidth++;
//读取调色板
palette=(RGBQUAD *)new BYTE[bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)];
fread(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp1);
m_imagedata= new BYTE[m_ImageHeight*m_ImageWidth*3]; //给图象数据指针分配空间
fread(m_imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1); //读取图象数据
//图象数据是从第0行开始存储的,然后依次是第一行,第二行.......
//图象数据读取以后就可以对其进行处理
m_outputdata= new BYTE[m_ImageHeight*m_ImageWidth*3]; //给图象数据指针分配空间
//这一部分添加对图象数据即m_imagedata处理的过程,处理结果放在m_outputdata中
//如果想观察处理结果,可以把它们另存为一个文件,该文件使用原来文件的文件头,而图象数据为处理过的数据
//这儿我仅把图象数据不作处理copy到输出图象中,得到的图象和原来一样
for(int i=0;i<m_ImageHeight;i++)
{
for(int j=0;j<m_ImageWidth*3;j=j+3)
{
int k=m_ImageWidth*i*3+j;
int gray=(int)(0.3*m_imagedata[k]+0.59*m_imagedata[k+1]+0.11*m_imagedata[k+2]);
m_outputdata[k]=m_outputdata[k+1]=m_outputdata[k+2]=gray;
}
}
//创建新文件
if((fp2=fopen("result.bmp","wb"))==NULL)
{
MessageBox(NULL,"文件创建失败","warning",MB_OK);
}
//写结果文件,文件信息部分用test文件的文件信息部分
fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp2);
fwrite((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp2);
fwrite(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp2);
fwrite(m_outputdata,m_ImageHeight*m_ImageWidth*3,1,fp2); //写像素数据
fclose(fp1); //关闭文件
fclose(fp2);
}
view plainprint?
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
/*BMP文件格式如下:
㈠BITMAPFILEHEADER:位图文件头(只用于BMP文件)
bfType="BM"
bfSize
bfReserved1
bfReserved2
bfOffBits 从文件头到实际的位图数据的偏移字节数,即前三个部分长度之和
㈡BITMAPINFOHEADER:位图信息头
biSize 这个结构的长度,为40个字节
biWidth 图象的宽度,单位是像素
biHeight 图象的高度,单位是像素
biPlanes
biBitCount
biCompression
biSizeImage 实际的位图字节数据占用的字节数 biSizeImage=biWidth_*biHeight,其中biWidth必须是4的整数倍
如果biCompression为BI_RGB,则该项可能为0
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
㈢Palette :调色板
灰度图象一般不需要考虑调色板,一般灰度图没有调色板
㈣DIB Pixels :图象数据
*/
BITMAPFILEHEADER bf; //文件头
BITMAPINFOHEADER bi; //信息头
RGBQUAD *palette=NULL; //调色板
BYTE *m_imagedata=NULL; //图象数据指针
BYTE *m_outputdata=NULL; //输出数据指针
int m_ImageWidth; //图象宽度
int m_ImageHeight; //图象高度
void main()
{
FILE *fp1,*fp2; //文件指针,fp1为源文件,fp2为处理以后的文件
//打开文件,到文件指针
if((fp1=fopen("test.bmp","rb"))==NULL)
{
MessageBox(NULL,"文件打开错误","warning",MB_OK);
}
fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1); //读取文件头,读取以后文件指针在文件头末尾(即信息头)
//以下输出文件头的一些有用的数据
int temp=bf.bfType; //便于将开头两个字节转化为字符显示
cout<<"BM标志:"<<(char *)(&temp)<<'\n';
cout<<"偏移字节数:"<<bf.bfOffBits<<'\n';
fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1); //读取信息头
//以下输出信息头的一些有用的数据
cout<<"图象宽度:"<<bi.biWidth<<'\n';
cout<<"图象高度:"<<bi.biHeight<<'\n';
m_ImageWidth=bi.biWidth; //给图象宽度赋值
m_ImageHeight=bi.biHeight; //给图象高度赋值
//每一行的数据必须是4的整数倍,如果不是,需要补齐
while(m_ImageWidth%4!=0) //让宽度为4的整数倍
m_ImageWidth++;
//读取调色板
palette=(RGBQUAD *)new BYTE[bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)];
fread(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp1);
m_imagedata= new BYTE[m_ImageHeight*m_ImageWidth*3]; //给图象数据指针分配空间
fread(m_imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1); //读取图象数据
//图象数据是从第0行开始存储的,然后依次是第一行,第二行.......
//图象数据读取以后就可以对其进行处理
m_outputdata= new BYTE[m_ImageHeight*m_ImageWidth*3]; //给图象数据指针分配空间
//这一部分添加对图象数据即m_imagedata处理的过程,处理结果放在m_outputdata中
//如果想观察处理结果,可以把它们另存为一个文件,该文件使用原来文件的文件头,而图象数据为处理过的数据
//这儿我仅把图象数据不作处理copy到输出图象中,得到的图象和原来一样
for(int i=0;i<m_ImageHeight;i++)
{
for(int j=0;j<m_ImageWidth*3;j=j+3)
{
int k=m_ImageWidth*i*3+j;
int gray=(int)(0.3*m_imagedata[k]+0.59*m_imagedata[k+1]+0.11*m_imagedata[k+2]);
m_outputdata[k]=m_outputdata[k+1]=m_outputdata[k+2]=gray;
}
}
//创建新文件
if((fp2=fopen("result.bmp","wb"))==NULL)
{
MessageBox(NULL,"文件创建失败","warning",MB_OK);
}
//写结果文件,文件信息部分用test文件的文件信息部分
fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp2);
fwrite((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp2);
fwrite(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp2);
fwrite(m_outputdata,m_ImageHeight*m_ImageWidth*3,1,fp2); //写像素数据
fclose(fp1); //关闭文件
fclose(fp2);
}
相关文章推荐
- 代码开源(5)——彩色bmp图片转灰度
- 代码开源(5)——彩色bmp图片转灰度
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- 24位真彩色转换为8位灰度图片(完整代码)
- vb.net2005 PictureBox生成bmp彩色图片
- 将彩色图片转成灰度图片
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- WPF设置图片灰度显示与恢复彩色显示
- ios 彩色图片转换成灰度图片
- 彩色图片的各种处理方法:灰度,黑白,底片效果
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- 使用ASP生成任意长度彩色BMP验证码图片
- 【DOM编程艺术】Canvas将彩色图片变成灰度图片
- 将24位真彩色图转换为8位灰度图片
- 【Android】显示彩色转灰度图片
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- 使用ASP生成任意长度彩色BMP验证码图片
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- VC 6.0 MFC 读取并显示图片和彩色转灰度
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果