我先在内存中用CreateDIBSection创建了一幅位图,再把这幅位图选到一个兼容DC中,然后就dcCompatible.SetPixel(……)画图,但是最后用StretchBlt拷贝到屏幕上时却是黑色的,但是用BitBlt就是正常的灰度图,由于数据量很大,所以必须用StretchBlt,真是很奇怪啊!!!补充一下,位图没有超出定义的范围,每个像素的灰度值也是对的。请各位大师指点一下,感谢!

解决方案 »

  1.   

    在StretchBlt前面加上
    int oldeMode=dc.SetStretchBltMode(COLORONCOLOR);
      

  2.   

    我用的是SetPixel,没有用画笔
      

  3.   

    你的图是不是宽高比很大?如果宽高比例超出某一数值StretchBlt就会有你说的那种情况。
      

  4.   

    回复ringphone,我的图的宽高比确实很大,有什么解决的方法吗???
      

  5.   

    CClientDC dc(this);
            //设置位图信息
    BITMAPINFOHEADER BMIH;
    memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
    BYTE * pDrawingSurfaceBits=NULL;
    BMIH.biSize=sizeof(BITMAPINFOHEADER);
    BMIH.biWidth=N;
    BMIH.biBitCount=24;
    BMIH.biPlanes=1;
    BMIH.biCompression=BI_RGB;
    BMIH.biHeight=m_num2;
    BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31)>>3)*BMIH.biHeight;
    if(hbitmap != NULL)
    {
    DeleteObject(hbitmap);
        hbitmap=NULL;
    }
    hbitmap=CreateDIBSection(dc.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits,
                NULL,0);
    CDC dcCompatible;
    dcCompatible.CreateCompatibleDC(&dc);
    HBITMAP hOldBitmap=(HBITMAP)SelectObject(dcCompatible.GetSafeHdc(),hbitmap);
    int a;
        float k=255.00/(max-min);
        for(i=0;i<N;i++)
    {
      for(j=0;j<m_num2;j++)
      {
      a=(int)k*(atof(array2[i][j])-min);
      dcCompatible.SetPixel(i,j,RGB(a,a,a));  
      }
    }  
    dc.StretchBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),&dcCompatible,0,0,N,m_num2,SRCCOPY);
    SelectObject(dcCompatible.GetSafeHdc(),hOldBitmap);
    其中N是横向的大小,m_num2是纵向的大小,hbitmap是个全局变量,array2存放的是要转化成灰度的数据,max,min分别是这些数据中的最大值和最小值,我把最大值映射为255,最小值映射为0,其它的做线性映射。在程序中N=100,m_num2大概为18267,我已经跟踪调试程序,转化的灰度值a不是0~~
      

  6.   

    宽高比很大的话StretchBlt异常,这个我以前碰到过,没办法解决,最后是自己写的缩放代码。搜索一下自己写缩放吧。