编写一个程序,读取一张bmp图片数据,转化为灰度图片保存到另一个文件中

2024-11-24 17:38:33
推荐回答(3个)
回答1:

最近在做,正好写了一个,分享给你,这是一个特例,建议你要了解bmp的结构,然后获取其中的信息,把这个程序普通化……
#include
#include
#include
using namespace std;
typedef unsigned char BYTE;
long Arry2DW(unsigned char p[4])
{
int a0,a1,a2,a3;
unsigned long A;
a0=int(p[0]);
a1=int(p[1]);
a2=int(p[2]);
a3=int(p[3]);
A=a3*256*256*256+a2*256*256+a1*256+a0;
return A;
}
long Arry2W(unsigned char p[2])
{
int a0,a1;
long A;
a0=int(p[0]);
a1=int(p[1]);
A=a1*256+a0;
return A;
}
typedef struct tagBMPFLEHEADER
{
BYTE bfType[2];
BYTE bfSize[4];
BYTE bfReserved1[2];
BYTE bfReserved2[2];
BYTE bfOfBits[4];
}BMPFLEHEADER;
typedef struct tagBMPINFHEADER
{
BYTE biSize[4];
BYTE biWidth[4];
BYTE biHeight[4];
BYTE biPlanes[2];
BYTE biBitCount[2];
BYTE biCompression[4];
BYTE biSizeImage[4];
BYTE biXpelsPerMeter[4];
BYTE biYpelsPerMeter[4];
BYTE biChUsed[4];
BYTE biCtrlmportant[4];
}BMPINFHEADER;
typedef struct BitmapFile
{
BMPFLEHEADER bmfheader;
BMPINFHEADER bminfoheader;
BYTE bitmapdata[1428752];
}bitmap;
int main()
{
bitmap * temp;
FILE * fp,*fp1;
BYTE R[635][750],G[635][750],B[635][750];
if((fp=fopen("D://source/temp.bmp","rb"))==NULL) if((fp=fopen("try1.bmp","rb"))==NULL)
{
cout<<"error";
return 0;
}
if((fp1=fopen("try1.bmp","wb"))==NULL)
{
cout<<"error";
return 0;
}
if(!(temp=new bitmap))
{
cout<<"error";
return 0;
}
fread(temp,sizeof(bitmap),1,fp);
int r,g,b,gray=0;
for(k=0;k<1428749;k+=3)
{
b=temp->bitmapdata[k];
g=temp->bitmapdata[k+1];
r=temp->bitmapdata[k+2];
if(b>g)
gray=b;
else gray=g;
if(gray gray=r;
temp->bitmapdata[k]=temp->bitmapdata[k+1]=temp->bitmapdata[k+2]=gray;
}
fwrite(temp,sizeof(bitmap),1,fp1);
fclose(fp);
fclose(fp1);
return 0;
}

回答2:

用matlab吧,轻松又方便
I_rgb=imread('ABC.bmp');%图片和你程序放同一个文件夹下
I_gray=rgb2gray(I_rgb);
imshow(I_gray);
imwrite(I_gray,'gray.bmp')

回答3:

建议你看看bmp文件头再写程序,要不你读取的数据会出错