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);
}
}    可以跟踪到图像数据和尺寸等信息,可就是显示不出来。请高手帮忙解读。

解决方案 »

  1.   

    http://www.codeguru.com/cpp/g-m/bitmap/displayingandsizing/article.php/c4905
      

  2.   

    http://blog.csdn.net/cghver/article/details/6603725 不仅是BMP格式的图像,各种格式都支持
      

  3.   

    StretchDIBits里的DC用GetDC(NULL)试试
    检查你的矩形区域是不是一个矩形,有没有超出屏幕范围之类
      

  4.   

    怎么弄的?需要在OnDraw 里面画,否则不会调用
      

  5.   

    //通过BMP文件画图     
    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();     


    }     
    }     
      

  6.   

    cximage.draw楼主的是那个啥啥vc++图像处理书上的代码吧
    换了吧,那本书的代码很垃圾的字对齐都没写
      

  7.   

    CDib类里面不是自己就写好了一个显示函数吗
    BOOL Draw(CDC* pDC, CPoint origin, CSize size);你的位图信息既然都存在你的m_pDib对象中,那你直接m_pDib.Draw(&dc,CPoint(0,0),GetDibSaveDim())就可以了
      

  8.   

    m_pDib.Draw(&dc,CPoint(0,0),m_pDib.GetDibSaveDim());