我有一个数据矩阵
   int image[300][300];
   内容为 0 表示 白色
          1 表示 黑色
          2 表示 经色
          3 表示 蓝色
          4 表示 绿色
怎样快速在 vc ::OnDraw(CDC* pDC)   
   函数中显示 这个图像?  用画点的方法我会,但速度大慢,刷新时会看到画的过程程
能不能把矩阵转化为 CBitmap 再显示,如下面这个样子 CDC   MemDC;   
BITMAP   bm;   
CBitmap   Bitmap;   
// Bitmap.LoadBitmap(IDB_BITMAP1);   //  用函改成 从矩阵 image[300][300]中获得
Bitmap.GetObject(sizeof(BITMAP),&bm);   
MemDC.CreateCompatibleDC(pDC);   
MemDC.SelectObject(&Bitmap);   
    
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);    MemDC.DeleteDC();

解决方案 »

  1.   

    自己处理一下,把矩阵中的数据转换为相应的颜色值,再构造一个BITMAPINFO结构,然后用StretchDIBits显示。
      

  2.   

    你得设法把你自己定义的这种图像格式(即你的数组及颜色值)首先转化为与windows兼容的位图格式,
    然后再根据CBitmap构造一个对象,其主要工作就是构造楼上所说的信息头,还有一个调色板,之后把你
    所定义的颜色值对应为RGB三分量,最后你就可以去显示了.
      

  3.   

    把矩阵中的数据转换为相应的颜色值,再构造一个BITMAPINFO结构,然后用StretchDIBits显示
      

  4.   

    我已经做了以下工作,现在应该怎么办: // 定义矩阵,内容为不同颜色的几条横线
    int color[300][300];
    for(int i=0;i<5;i+=8)
    for(int j=0;j<300;j++)
    color[50*i+30][j]=i; // 定义BITMAPINFO 结构和颜色表 BITMAPINFO   *pBmpInfo   =   (BITMAPINFO*)new   char[sizeof(BITMAPINFO)   +   sizeof(RGBQUAD)   *   (5)];   
    pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);   
    pBmpInfo->bmiHeader.biWidth=300;   
    pBmpInfo->bmiHeader.biHeight=300;   
    pBmpInfo->bmiHeader.biPlanes=1;   
    pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色  
    pBmpInfo->bmiHeader.biCompression=0;   
    pBmpInfo->bmiHeader.biClrUsed=5;   //  这里填5不知对不对 ?
    pBmpInfo->bmiHeader.biSizeImage=0;   
    pBmpInfo->bmiHeader.biXPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biYPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biClrImportant=0;   //  白色
         pBmpInfo->bmiColors[0].rgbRed=255;   
         pBmpInfo->bmiColors[0].rgbGreen=255;   
         pBmpInfo->bmiColors[0].rgbBlue=255;   
         pBmpInfo->bmiColors[0].rgbReserved=0;    //  黑色
         pBmpInfo->bmiColors[1].rgbRed=0;   
         pBmpInfo->bmiColors[1].rgbGreen=0;   
         pBmpInfo->bmiColors[1].rgbBlue=0;   
         pBmpInfo->bmiColors[1].rgbReserved=0;    //  红色
         pBmpInfo->bmiColors[2].rgbRed=255;   
         pBmpInfo->bmiColors[2].rgbGreen=0;   
         pBmpInfo->bmiColors[2].rgbBlue=0;   
         pBmpInfo->bmiColors[2].rgbReserved=0;    //  绿色
         pBmpInfo->bmiColors[3].rgbRed=0;   
         pBmpInfo->bmiColors[3].rgbGreen=255;   
         pBmpInfo->bmiColors[3].rgbBlue=0;   
         pBmpInfo->bmiColors[3].rgbReserved=0;    //  蓝色
         pBmpInfo->bmiColors[4].rgbRed=0;   
         pBmpInfo->bmiColors[4].rgbGreen=0;   
         pBmpInfo->bmiColors[4].rgbBlue=255;   
         pBmpInfo->bmiColors[4].rgbReserved=0;  
      

  5.   

    你的每个点占用几个字节?如果一个点一个int,貌似很浪费啊。如果一个点一个byte就对了,可以用SetDIBitsToDevice一次显示。
      

  6.   

    根据大家的提示,我改了,但不知后面怎么写,请大家帮忙 // 定义矩阵,内容为不同颜色线构成的网格
    // 内容为 0  白色  1 黑色 2 红色  3  绿色 4 蓝色  byte color[300][300];
    for(int i=0;i<5;i+=8)
    for(int j=0;j<300;j++)
    {
    color[50*i+30][j]=i;
    color[j][50*i+30]=i;
    } // 定义BITMAPINFO 结构和颜色表 BITMAPINFO   *pBmpInfo   =   (BITMAPINFO*)new   char[sizeof(BITMAPINFO)   +   sizeof(RGBQUAD)   *   (5)];   
    pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);   
    pBmpInfo->bmiHeader.biWidth=300;   
    pBmpInfo->bmiHeader.biHeight=300;   
    pBmpInfo->bmiHeader.biPlanes=1;   
    pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色  
    pBmpInfo->bmiHeader.biCompression=0;   
    pBmpInfo->bmiHeader.biClrUsed=5;   //  这里填5不知对不对 ?
    pBmpInfo->bmiHeader.biSizeImage=0;   
    pBmpInfo->bmiHeader.biXPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biYPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biClrImportant=0;   //  白色
         pBmpInfo->bmiColors[0].rgbRed=255;   
         pBmpInfo->bmiColors[0].rgbGreen=255;   
         pBmpInfo->bmiColors[0].rgbBlue=255;   
         pBmpInfo->bmiColors[0].rgbReserved=0;    //  黑色
         pBmpInfo->bmiColors[1].rgbRed=0;   
         pBmpInfo->bmiColors[1].rgbGreen=0;   
         pBmpInfo->bmiColors[1].rgbBlue=0;   
         pBmpInfo->bmiColors[1].rgbReserved=0;    //  红色
         pBmpInfo->bmiColors[2].rgbRed=255;   
         pBmpInfo->bmiColors[2].rgbGreen=0;   
         pBmpInfo->bmiColors[2].rgbBlue=0;   
         pBmpInfo->bmiColors[2].rgbReserved=0;    //  绿色
         pBmpInfo->bmiColors[3].rgbRed=0;   
         pBmpInfo->bmiColors[3].rgbGreen=255;   
         pBmpInfo->bmiColors[3].rgbBlue=0;   
         pBmpInfo->bmiColors[3].rgbReserved=0;    //  蓝色
         pBmpInfo->bmiColors[4].rgbRed=0;   
         pBmpInfo->bmiColors[4].rgbGreen=0;   
         pBmpInfo->bmiColors[4].rgbBlue=255;   
         pBmpInfo->bmiColors[4].rgbReserved=0;   
        int wid = 300;  // 保存图像参数  图像宽   
        int hei = 300;  // 保存图像参数  图像高   
        int bits = 4;  //  图像每像素所占位数   
        int rowchars=(wid*bits+31)/32*4;   //   每行像素所需的字节数  
        int PixSize = rowchars*hei;  // 计算像素数据大小    char* lpBits=new char[PixSize];
    ::memset(lpBits,0,PixSize); //  根据数组初始化屏幕数据
    for(i=0;i<300;i++)
    {
    int rr=299-i;
    for(j=0;j<300;j++)
    {
    byte num=color[i][j];
    if(j%2==0)
    num<<4;
    lpBits[rr*rowchars][j/2]+=num;
    }
    }
      

  7.   

    然后就是用StretchDIBits来贴图了。
      

  8.   

    还是不对,请大家帮我参考一下void CDrawBitmapView::OnDraw(CDC* pDC)
    {
    CDrawBitmapDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here // 定义矩阵,内容为不同颜色线构成的网格
    // 内容为 0  白色  1 黑色 2 红色  3  绿色 4 蓝色  byte color[300][300];
    for(int i=0;i<5;i+=8)
    for(int j=0;j<300;j++)
    {
    color[50*i+30][j]=i;
    color[j][50*i+30]=i;
    } // 定义BITMAPINFO 结构和颜色表 BITMAPINFO   *pBmpInfo   =   (BITMAPINFO*)new   char[sizeof(BITMAPINFO)   +   sizeof(RGBQUAD)   *   (5)];   
    pBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);   
    pBmpInfo->bmiHeader.biWidth=300;   
    pBmpInfo->bmiHeader.biHeight=300;   
    pBmpInfo->bmiHeader.biPlanes=1;   
    pBmpInfo->bmiHeader.biBitCount=4;// 4 位 位图 16色  
    pBmpInfo->bmiHeader.biCompression=0;   
    pBmpInfo->bmiHeader.biClrUsed=5;   //  这里填5不知对不对 ?
    pBmpInfo->bmiHeader.biSizeImage=0;   
    pBmpInfo->bmiHeader.biXPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biYPelsPerMeter=0;   
    pBmpInfo->bmiHeader.biClrImportant=0;   //  白色
         pBmpInfo->bmiColors[0].rgbRed=255;   
         pBmpInfo->bmiColors[0].rgbGreen=255;   
         pBmpInfo->bmiColors[0].rgbBlue=255;   
         pBmpInfo->bmiColors[0].rgbReserved=0;    //  黑色
         pBmpInfo->bmiColors[1].rgbRed=0;   
         pBmpInfo->bmiColors[1].rgbGreen=0;   
         pBmpInfo->bmiColors[1].rgbBlue=0;   
         pBmpInfo->bmiColors[1].rgbReserved=0;    //  红色
         pBmpInfo->bmiColors[2].rgbRed=255;   
         pBmpInfo->bmiColors[2].rgbGreen=0;   
         pBmpInfo->bmiColors[2].rgbBlue=0;   
         pBmpInfo->bmiColors[2].rgbReserved=0;    //  绿色
         pBmpInfo->bmiColors[3].rgbRed=0;   
         pBmpInfo->bmiColors[3].rgbGreen=255;   
         pBmpInfo->bmiColors[3].rgbBlue=0;   
         pBmpInfo->bmiColors[3].rgbReserved=0;    //  蓝色
         pBmpInfo->bmiColors[4].rgbRed=0;   
         pBmpInfo->bmiColors[4].rgbGreen=0;   
         pBmpInfo->bmiColors[4].rgbBlue=255;   
         pBmpInfo->bmiColors[4].rgbReserved=0;   
        int wid = 300;  // 保存图像参数  图像宽   
        int hei = 300;  // 保存图像参数  图像高   
        int bits = 4;  //  图像每像素所占位数   
        int rowchars=(wid*bits+31)/32*4;   //   每行像素所需的字节数  
        int PixSize = rowchars*hei;  // 计算像素数据大小    char* lpBits=new char[PixSize];
    ::memset(lpBits,0,PixSize); //  根据数组初始化屏幕数据
    for(i=0;i<300;i++)
    {
    int rr=299-i;
    for(int j=0;j<300;j++)
    {
    byte num=color[i][j];
    if(j%2==0)
    num=num*16;
    lpBits[rr*rowchars+j/2]+=num;
    }
    } // 显示
    SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,wid,hei,0,0,0,hei,lpBits,pBmpInfo,DIB_RGB_COLORS);
    }显示出来只有一根白线,大部分是黑色
      

  9.   

    用下面两个函数显示都是一样的结果
    SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,wid,hei,0,0,0,hei,lpBits,pBmpInfo,DIB_RGB_COLORS);
    StretchDIBits(pDC->GetSafeHdc(),0,0,300,300,0,0,300,300,lpBits,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);  
    请大家帮我份析一下什么原因?
      

  10.   

    BITMAPINFO *pBmpInfo = (BITMAPINFO*)new char[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (16)];pBmpInfo->bmiHeader.biPlanes = 4;
      

  11.   

    pBmpInfo->bmiHeader.biPlanes = 1;
    我看错了。只改上面的那行试试,如果还不行,调试看看你转换后的数据对不对。
      

  12.   

    可以直接用SetPixel(RGB(*,*,*))但速度慢。
      

  13.   

    我查出来了,是这里的原因
    byte color[300][300]; 
    for(int i=0;i <5;i+=8) 
    for(int j=0;j <300;j++) 

    color[50*i+30][j]=i; 
    color[j][50*i+30]=i;