1 MFC框架中插入了基本类CDib,其内封装了关于位图的基本信息获取函数和图像上载、保存函数;2 在doc类里声明CDib的对象m_pDib;3 在doc类里进行了图像的打开函数定义,将图像信息(包括尺寸、图像数据等存放在对象m_pDib中);4 在view类里定义了调色板创建函数,如下:
CPalette* CImageProcessView::CreateBitmapPalette(PreDib* pBitmap)
{
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
} palette = { 0x300, 256 };
LPRGBQUAD pRGBTable = pBitmap->GetRGB();
UINT numberOfColors = pBitmap->GetNumberOfColors();
for(UINT x=0; x<numberOfColors; ++x)
{
palette.aEntries[x].peRed =
pRGBTable[x].rgbRed;
palette.aEntries[x].peGreen =
pRGBTable[x].rgbGreen;
palette.aEntries[x].peBlue =
pRGBTable[x].rgbBlue;
palette.aEntries[x].peFlags = 0;
}
_hPalette->CreatePalette((LPLOGPALETTE)&palette);//_hPalette为CPalette指针,view.h中已声明。
return _hPalette;
}
5 图像显示函数:
void CImageProcessView::OnImshow(CDC* pDC)
{
// TODO: Add your command handler code here
CImageProcessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); BYTE* pBitmapData = pDoc->m_pDib.GetData();//获取图像像素数据,成功!
LPBITMAPINFO pBitmapInfo = pDoc->m_pDib.GetInfo();//获取位图信息头,成功!
int bitmapHeight = pDoc->m_pDib.GetHeight();
int bitmapWidth = pDoc->m_pDib.GetWidth();//获取位图高度、宽度,成功!
int scaledWidth = (int)(bitmapWidth * 1);
int scaledHeight = (int)(bitmapHeight * 1);
////////////////////////////////// 图像绘制///////////////////
if (pDoc->m_pDib.GetRGB()) // Has a color table
{
CPalette * hPalette=CreateBitmapPalette(&pDoc->m_pDib);//调用4函数,创建新调色板
//将新调色板调用到设备上下文中//
CPalette * hOldPalette=pDC->SelectPalette(hPalette, TRUE);
//实现调色板//
pDC->RealizePalette();
::StretchDIBits(pDC->GetSafeHdc(),0,0,scaledWidth,scaledHeight,
0, 0, bitmapWidth , bitmapHeight ,pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
pDC->SelectPalette(hOldPalette, true);
::DeleteObject(hPalette);
}
else
{
::StretchDIBits(pDC->GetSafeHdc(),
0, 0, scaledWidth, scaledHeight,
0, 0, bitmapWidth, bitmapHeight,
pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
}
} 可以跟踪到图像数据和尺寸等信息,可就是显示不出来。请高手帮忙解读。
CPalette* CImageProcessView::CreateBitmapPalette(PreDib* pBitmap)
{
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
} palette = { 0x300, 256 };
LPRGBQUAD pRGBTable = pBitmap->GetRGB();
UINT numberOfColors = pBitmap->GetNumberOfColors();
for(UINT x=0; x<numberOfColors; ++x)
{
palette.aEntries[x].peRed =
pRGBTable[x].rgbRed;
palette.aEntries[x].peGreen =
pRGBTable[x].rgbGreen;
palette.aEntries[x].peBlue =
pRGBTable[x].rgbBlue;
palette.aEntries[x].peFlags = 0;
}
_hPalette->CreatePalette((LPLOGPALETTE)&palette);//_hPalette为CPalette指针,view.h中已声明。
return _hPalette;
}
5 图像显示函数:
void CImageProcessView::OnImshow(CDC* pDC)
{
// TODO: Add your command handler code here
CImageProcessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); BYTE* pBitmapData = pDoc->m_pDib.GetData();//获取图像像素数据,成功!
LPBITMAPINFO pBitmapInfo = pDoc->m_pDib.GetInfo();//获取位图信息头,成功!
int bitmapHeight = pDoc->m_pDib.GetHeight();
int bitmapWidth = pDoc->m_pDib.GetWidth();//获取位图高度、宽度,成功!
int scaledWidth = (int)(bitmapWidth * 1);
int scaledHeight = (int)(bitmapHeight * 1);
////////////////////////////////// 图像绘制///////////////////
if (pDoc->m_pDib.GetRGB()) // Has a color table
{
CPalette * hPalette=CreateBitmapPalette(&pDoc->m_pDib);//调用4函数,创建新调色板
//将新调色板调用到设备上下文中//
CPalette * hOldPalette=pDC->SelectPalette(hPalette, TRUE);
//实现调色板//
pDC->RealizePalette();
::StretchDIBits(pDC->GetSafeHdc(),0,0,scaledWidth,scaledHeight,
0, 0, bitmapWidth , bitmapHeight ,pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
pDC->SelectPalette(hOldPalette, true);
::DeleteObject(hPalette);
}
else
{
::StretchDIBits(pDC->GetSafeHdc(),
0, 0, scaledWidth, scaledHeight,
0, 0, bitmapWidth, bitmapHeight,
pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
}
} 可以跟踪到图像数据和尺寸等信息,可就是显示不出来。请高手帮忙解读。
检查你的矩形区域是不是一个矩形,有没有超出屏幕范围之类
inline void drawBitmapFormFile(CString BitmapFilePath,CDC *pDC,CRect& rect)
{
HANDLE filehandle=::LoadImage(NULL,BitmapFilePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(filehandle!=NULL)
{
CBitmap bmp;
if(bmp.Attach(filehandle))
{
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
dcMemory.SelectObject(&bmp);
pDC->SetStretchBltMode(HALFTONE);
rect.bottom = bmpInfo.bmHeight;
rect.right = bmpInfo.bmWidth;
// pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
pDC->StretchBlt(rect.left,rect.top,bmpInfo.bmWidth,bmpInfo.bmHeight,&dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
bmp.Detach();
}
}
}
换了吧,那本书的代码很垃圾的字对齐都没写
BOOL Draw(CDC* pDC, CPoint origin, CSize size);你的位图信息既然都存在你的m_pDib对象中,那你直接m_pDib.Draw(&dc,CPoint(0,0),GetDibSaveDim())就可以了