|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
void CRGB2GRAYDlg::OnBtSelect()
{
// TODO: Add your control notification handler code here
int i,j;
int skip=0;//补齐宽度
CFile file_s;
CFile file_d;
CString path;
BYTE* rgbdata;
BYTE* graydata;
int W,H;
CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"Bmp files(*.bmp)|*.bmp||",NULL);
//CFileDialog fdlg(TRUE,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp||",NULL);
BITMAPFILEHEADER bmpfh;
BITMAPINFOHEADER bmpih;
int resp = fdlg.DoModal();//弹出一个对对话框
switch (resp)
{
case -1:
return;
case IDOK://确定或者ok按钮
path = fdlg.GetPathName(); //路径名
break;
case IDCANCEL:
return;
}
if(file_s.Open(path,CFile::modeRead|CFile::shareDenyNone))
{
//文件打开成功,开始读取数据
//文件头
/////////////test////////////
//CString show;
// file_s.SeekToEnd();
// int pos = file_s.GetPosition();
// show.Format("%d",pos);
// MessageBox(show);
/////////////////////////////
file_s.SeekToBegin();
file_s.Read(&bmpfh,sizeof(BITMAPFILEHEADER));
file_s.Read(&bmpih,sizeof(BITMAPINFOHEADER));
W = bmpih.biWidth;
H = bmpih.biHeight;
long nwidthbytes;
nwidthbytes=(W*bmpih.biBitCount+31)/32*4;//每一行的占据的字节数,4的倍数
////////////test////////////////
//pos = file_s.GetPosition();
//show.Format("%d",pos);
//MessageBox(show);
////////////////////////////////
//rgbdata = new BYTE [pos-54];
rgbdata = new BYTE [nwidthbytes*H];//图像的大小
if( bmpih.biBitCount == 24 )//判断是否为24位图像
{
//file_s.Read(rgbdata,pos-54);
//skip = (pos-54)/H - W*3;
file_s.Read(rgbdata,nwidthbytes*H);
skip=nwidthbytes-W*3;//在不是4的倍数时补的字节数
/*
for(i=0;i<H;i++)
{
for(j=0;j<W*3;j++)
{
if(j!=W*3-1)
{
file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE));
}
else if(j== W*3-1 && skip == 0)
{
file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE));
}
else if(j==W*3-1 && skip!=0)
{
file_s.Read(&rgbdata[i*W*3+j],sizeof(BYTE));
file_s.Seek(skip*3,CFile::current);
}
}
}
*/
///////////////test//////////////////
//pos = file_s.GetPosition();
//show.Format("%d",pos-54);
//MessageBox(show);
///////////////////////////////////
}
else
{
MessageBox("需要24位位图");
return;
}
//MessageBox("数据读取成功!");
//开始灰度化
graydata = new BYTE [H*W];//灰度图大小
int count=0;
//for(i=0;i<pos-54;i+=3)
//{
// graydata[count++] = rgbdata[i]*0.119+rgbdata[i+1]*0.587+rgbdata[i+2]*0.299;
//}
for(i=0;i<H;i++)
{
for(j=0;j<W*3;j+=3)
{
graydata[count++] = rgbdata[i*W*3+j+i*skip]*0.12+rgbdata[i*W*3+j+1+i*skip]*0.58
+rgbdata[i*W*3+j+2+i*skip]*0.3;
}
}
MessageBox("灰度化结束,开始生成灰度图");
///////////////////////////////////////////
/////////生成灰度图片//////////////////////
///////////////////////////////////////////
if(W%4==0)
skip=0;
else
skip = 4-W%4;
//生成调色板
RGBQUAD rgbquad[256];
for(i=0;i<256;i++)
{
rgbquad[i].rgbBlue=rgbquad[i].rgbGreen=rgbquad[i].rgbRed=i;
rgbquad[i].rgbReserved=0;
}
//文件头
BITMAPFILEHEADER bmpfh_gray;
bmpfh_gray.bfType = 0x4D42;
bmpfh_gray.bfSize = 54 + (W+skip)*H + 256*sizeof(RGBQUAD);
bmpfh_gray.bfOffBits = 54 + 256*sizeof(RGBQUAD);
bmpfh_gray.bfReserved1=0;
bmpfh_gray.bfReserved2=0;
//信息头
BITMAPINFOHEADER bmpih_gray;
bmpih_gray.biSize = 40;
bmpih_gray.biWidth = W;
bmpih_gray.biHeight = H;
bmpih_gray.biPlanes =1;
bmpih_gray.biBitCount = 8;
bmpih_gray.biCompression = BI_RGB;
bmpih_gray.biSizeImage=(W+skip)*H;
bmpih_gray.biXPelsPerMeter = 0L;
bmpih_gray.biYPelsPerMeter = 0L;
bmpih_gray.biClrUsed = 0L;
bmpih_gray.biClrImportant=0L;
//开始写数据
BYTE black=0x00;
CString path_d("c:\\1.bmp");
if(file_d.Open(path_d,CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone))
{
file_d.Write(&bmpfh_gray,sizeof(BITMAPFILEHEADER));
file_d.Write(&bmpih_gray,sizeof(BITMAPINFOHEADER));
file_d.Write(rgbquad,sizeof(RGBQUAD)*256);
for(i=0;i<H;i++)
{
for(j=0;j<W;j++)
{
file_d.Write(&graydata[i*W+j],sizeof(BYTE));
}
for(int s=0;s<skip;s++)
{
file_d.Write(&black,sizeof(BYTE));
}
}
}
file_d.Close();
delete graydata;
delete rgbdata;
}
}
|
|