打开bmp图片并显示到应用程序有有关问题
打开bmp图片并显示到应用程序有问题?
显示的时候,256的灰度图有个小瑕疵,下面有虚线一样的东西,而真彩色颜色不对,我知道是我对数据部分的存储不是很理解,希望有人帮助!!!
------解决方案--------------------
精神可嘉,但是钻研缺一点,仔细阅读msdn的BITMAPINFOHEADER,下面代码供参考。
void COpenimagefileView::OnDraw(CDC* pDC)
{
COpenimagefileDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!IsFirstDraw)
{
int i,j,m;
CDC * dc;
dc=GetDC();
if(m_orgbiBitCount==8||m_orgbiBitCount==4)
{
for(i=1;i<=m_orgHeight;i++)
for(j=1;j<=m_orgWidth;j++)
{
dc->SetPixel(j,i,RGB(
m_pImageData[m_orgWidth*(m_orgHeight-i)+j],
m_pImageData[m_orgWidth*(m_orgHeight-i)+j],
m_pImageData[m_orgWidth*(m_orgHeight-i)+j]));
}
}
else if(m_orgbiBitCount==24)
{
for(i=1;i<=m_orgHeight;i++)
for(j=0,m=1;j<m_orgWidth*3;j+=3,m++)
{
dc->SetPixel(m,i,RGB(
m_pImageData[m_orgWidth*3*(m_orgHeight-i)+j],
m_pImageData[m_orgWidth*3*(m_orgHeight-i)+j+1],
m_pImageData[m_orgWidth*3*(m_orgHeight-i)+j+2]));
}
}
}
}
void COpenimagefileView::OnFileOpen()
{
COpenimagefileDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CFileDialog dlg(true,NULL,NULL,OFN_OVERWRITEPROMPT,"bmp(*.bmp)|*.bmp||",NULL);
if(dlg.DoModal()==IDOK)
{
m_szFileName = dlg.GetFileName();
m_szFilePathName = dlg.GetPathName();
}
else
return;
m_pImageData = OpenBMP(m_szFilePathName, &m_orgWidth, &m_orgHeight);
IsFirstDraw=FALSE;
Invalidate(TRUE);
}
BYTE * COpenimagefileView::OpenBMP(CString fileName, long *width, long *height)
{
BYTE * pData;
*width = 0;
*height = 0;
if(fileName=="")
return NULL;
BITMAPINFO bmpInfo;
BITMAPFILEHEADER bmpFileHead;
CFile file;
if((file.Open(fileName,CFile::modeRead|CFile::shareDenyNone))==NULL)
{
AfxMessageBox("Can not open the file");
return NULL;
}
file.Read(&bmpFileHead,sizeof(BITMAPFILEHEADER));
file.Read(&bmpInfo,sizeof(BITMAPINFOHEADER));
m_orgbiBitCount = bmpInfo.bmiHeader.biBitCount;
*width = bmpInfo.bmiHeader.biWidth;
*height = bmpInfo.bmiHeader.biHeight;
long lFileSize = bmpFileHead.bfSize - bmpFileHead.bfOffBits;
pData = (BYTE*)new char[lFileSize];
if(!pData)
return NULL;
file.ReadHuge(pData,lFileSize);
file.Close();
return pData;
}
显示的时候,256的灰度图有个小瑕疵,下面有虚线一样的东西,而真彩色颜色不对,我知道是我对数据部分的存储不是很理解,希望有人帮助!!!
------解决方案--------------------
精神可嘉,但是钻研缺一点,仔细阅读msdn的BITMAPINFOHEADER,下面代码供参考。
// ImageProcessor.h
#pragma once
enum RGBTYPE
{
RGB1,
RGB4,
RGB4_Gray,
RGB8,
RGB8_Gray,
RGB16_444,
RGB16_555,
RGB16_565,
RGB24,
RGB32,
RGB32_101010,
};
class CImageProcessor
{
public:
CImageProcessor(void);
virtual ~CImageProcessor(void);