void CReadBMPImageAndShowView::OnOpenimage()
{
CFileDialog log(true,"file",NULL,OFN_HIDEREADONLY,
"bmp|*.bmp||",NULL);
if(log.DoModal() == IDOK)
{
PathName = log.GetPathName();
}
int i=0;
CFile m_file;
BITMAPFILEHEADER P_image = {0,0,0,0,0};
BITMAPINFOHEADER *P_infor = NULL;
PVOID P_colortable = NULL;
PBYTE *tuxiangshuju;
if(m_file.Open(PathName,CFile::modeReadWrite)==0)
{
return ;
}
if(!m_file.Read(&P_image,sizeof(BITMAPFILEHEADER)))
{
return ;
}
if(P_image.bfType != MAKEWORD('B','M'))
{
return ;
}
CString Str = "";
CString TempStr;
TempStr.Format("类型%d\n文件大小%ld\n偏移量%ld\n",P_image.bfType,P_image.bfSize,P_image.bfOffBits);
Str = Str + TempStr;
P_infor = new BITMAPINFOHEADER [sizeof(BITMAPINFOHEADER)];
if(!m_file.Read(P_infor,sizeof(BITMAPINFOHEADER)))
{
delete [] P_infor;
return ;
}
int colorcount = (P_image.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER)) / sizeof(RGBQUAD);
if(colorcount >= 1)
{
P_colortable = rgb;
m_file.Seek(P_image.bfOffBits - sizeof(RGBQUAD) * colorcount,CFile::begin);
m_file.Read(P_colortable,colorcount * sizeof(RGBQUAD));
}
int nwidthcount = quzheng(P_infor->biWidth , P_infor->biBitCount);
TempStr.Format("每行像素空间字节数%d\n图像高度%d\n图像宽度%d\n每个像素使用的二进制位数%d\n",
nwidthcount,P_infor->biHeight,P_infor->biWidth,P_infor->biBitCount);
Str += TempStr;
tuxiangshuju = new PBYTE [(P_infor->biHeight)];
m_file.Seek(P_image.bfOffBits,CFile::begin);
for(i = 0;i < (P_infor->biHeight);i++)
{
tuxiangshuju[i] = new BYTE[nwidthcount];
m_file.Read(tuxiangshuju[i],nwidthcount);
}
FileHeader = P_image;
InfoHeader = P_infor;
ImageDate = tuxiangshuju;
ColorTable = P_colortable;
ColorTableCount = colorcount;
m_file.Close();
CClientDC dc(this);
DrawImage(&dc);
MessageBox(Str);
return;
}
int CReadBMPImageAndShowView::quzheng(LONG Width, DWORD bitCount)
{
int BitNumOfWidth = (Width * bitCount + 31) / 32 * 4;
return BitNumOfWidth;
}
void CReadBMPImageAndShowView::DrawImage(CDC* pDC)
{
if(ImageDate==NULL)
{
MessageBox("未获得图像数据");
return ;
}
unsigned char hBitMapInfo[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)* 256];
BITMAPINFO *BitMapInfo=(BITMAPINFO *) hBitMapInfo;
if(ColorTableCount != 0)
memcpy(&BitMapInfo->bmiColors,ColorTable,sizeof(RGBQUAD) * 256);
memcpy(&BitMapInfo->bmiHeader,InfoHeader,sizeof(BITMAPINFOHEADER));
for(int i = 0;i < InfoHeader->biHeight;i++)
{
::SetDIBitsToDevice(*pDC, 0, 0, InfoHeader->biWidth,
InfoHeader->biHeight, 0, 0, i, 1,ImageDate[i], (BITMAPINFO*)BitMapInfo, DIB_RGB_COLORS);
}
return ;
}
void CReadBMPImageAndShowView::DrawImage(CDC* pDC)
{
if(ImageDate==NULL)
{
MessageBox("未获得图像数据");
return ;
}
COLORREF color;
int Width = InfoHeader->biWidth;
int Height = InfoHeader->biHeight;
int WidthCount = quzheng(InfoHeader->biWidth , InfoHeader->biBitCount);
CRect rectClient;
this->GetClientRect(rectClient);
CDC memDC;
CBitmap bmp;
memDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,Width,Height);
memDC.SelectObject(&bmp);
memDC.FillSolidRect(rectClient,RGB(255,255,255));
if(WidthCount != Width)
{
for(int i = 0;i < Height;++i)
{
for(int j = 0;j < WidthCount;j = j + 3)
{
color = RGB(ImageDate[i][j + 2],ImageDate[i][j + 1],ImageDate[i][j]);
memDC.SetPixel(j / 3,Height - i - 1,color);
}
}
}
else
{
MessageBox("此办法暂时不知道如何显示灰度图");
bmp.DeleteObject();
memDC.DeleteDC();
return ;
}
pDC->BitBlt(0,0,Width,Height,&memDC,0,0,SRCCOPY);
bmp.DeleteObject();
memDC.DeleteDC();
return ;
}
void CReadBMPImageAndShowView::OnCreateimage()
{
CString Str = "";
CFileDialog log(true,"file",NULL,OFN_HIDEREADONLY,"bmp|*.bmp||",NULL);
int flag = 0;
do
{
if(flag == 1)
MessageBox("请输入正确的文件类型");
if(log.DoModal() == IDOK)
{
Str = log.GetFileExt();
flag = 1;
}
} while (Str != "bmp");
PathName = log.GetPathName();
CFile File;
if(File.Open(PathName,CFile::modeCreate | CFile::modeReadWrite)==0)
{
return ;
}
File.Write(&FileHeader,sizeof(BITMAPFILEHEADER));
File.Write(InfoHeader,sizeof(BITMAPINFOHEADER));
if(ColorTableCount != 0)
File.Write(ColorTable,ColorTableCount * sizeof(RGBQUAD));
int nwidthcount = quzheng(InfoHeader->biWidth , InfoHeader->biBitCount);
for(int i = 0;i < (InfoHeader->biHeight);i++)
{
File.Write(ImageDate[i],sizeof(BYTE) * nwidthcount);
}
File.Close();
}