我想做根据一个DEM数组,生成灰度图。
具体的做法是先生成一个调色板,代码如下:
// 指向逻辑调色板的指针
LPLOGPALETTE lpPal;
// 逻辑调色板的句柄
HANDLE hLogPal; hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*256);
if(hLogPal==0)
return;
lpPal=(LPLOGPALETTE)::GlobalLock((HGLOBAL)hLogPal);
lpPal->palVersion=0x300;
lpPal->palNumEntries=256; if(palPal!=NULL)
{
delete palPal;
palPal=NULL;
}
palPal = new CPalette; for(int i=0;i<256;i++)
{
lpPal->palPalEntry[i].peRed=i;
lpPal->palPalEntry[i].peGreen=i;
lpPal->palPalEntry[i].peBlue=i;
lpPal->palPalEntry[i].peFlags=0;
}
palPal->CreatePalette(lpPal);
::GlobalUnlock((HGLOBAL)hLogPal); 
::GlobalFree((HGLOBAL)hLogPal);
接下来,将上面生成的调色板选入DC中,生成一个Dib的信息文件BITMAPINFO lpbi,再结合DEM数组应用StretchDIBits函数生成灰度图。
相关代码如下:
         BITMAPINFO lpbi;
lpbi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
lpbi.bmiHeader.biHeight=m_DibHeight;
lpbi.bmiHeader.biWidth=m_DibWidth;
lpbi.bmiHeader.biPlanes=1;
lpbi.bmiHeader.biBitCount=8;
lpbi.bmiHeader.biCompression=BI_RGB;
lpbi.bmiHeader.biSizeImage=adjustDibWidth*m_DibHeight;
lpbi.bmiHeader.biXPelsPerMeter=0;
lpbi.bmiHeader.biYPelsPerMeter=0;
lpbi.bmiHeader.biClrUsed=0;
lpbi.bmiHeader.biClrImportant=0;         HPALETTE hPal=NULL;           // DIB调色板
HPALETTE hOldPal=NULL;        // 以前的调色板
if(pPal!=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
hOldPal=SelectPalette(hDC,hPal,TRUE);
}
SetStretchBltMode(hDC,COLORONCOLOR);//设置显示的模式         BYTE *DemGrey;
DemGrey=new BYTE[column*row];
for(i=0;i<row;i++)
for(j=0;j<column;j++)
DemGrey[i*column+j]=i*2%255;     ::StretchDIBits(hDC,     // hDC
lpDCRect->left,                 // DestX
lpDCRect->top,                  // DestY
RECTWIDTH(lpDCRect),            // nDestWidth
RECTHEIGHT(lpDCRect),           // DestHeight
lpDIBRect->left,                // SrcX
lpDIBRect->top,                 // SrcY
RECTWIDTH(lpDIBRect),           // wSrcWidth
RECTHEIGHT(lpDIBRect),          // wSrcHeight
DemGrey,                      // lpBits
(LPBITMAPINFO)&lpbi,         // lpBitsInfo
DIB_PAL_COLORS,                // wUsage
SRCCOPY);                       // dwROP) if(hOldPal!=NULL)
SelectPalette(hDC,hOldPal,TRUE);问题是:为什么生成的灰度图,它的颜色变化信息不是我之前所定好的调色板中颜色的变化信息呢?谢谢 !   QQ:273797692

解决方案 »

  1.   

    BITMAPINFO lpbi;
    lpbi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    lpbi.bmiHeader.biHeight=m_DibHeight;
    lpbi.bmiHeader.biWidth=m_DibWidth;
    lpbi.bmiHeader.biPlanes=1;
    lpbi.bmiHeader.biBitCount=8;
    lpbi.bmiHeader.biCompression=BI_RGB;
    lpbi.bmiHeader.biSizeImage=adjustDibWidth*m_DibHeight;
    lpbi.bmiHeader.biXPelsPerMeter=0;
    lpbi.bmiHeader.biYPelsPerMeter=0;
    lpbi.bmiHeader.biClrUsed=0;
    lpbi.bmiHeader.biClrImportant=0;
    =====================================================
    没有设置色彩表(colors table)..如下:
    LPBITMAPINFO lpBminfo = (LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER) + 
                                                   sizeof(RGBQUAD * 256)];
    lpBminfo->bmiHeader.xxxxxxxx=xxx
    ........
    ....
    ...for(int i = 0;i < 256;++i){
        lpBminfo->bmiColors[i].rgbBlue = i;
        ............
        ........
        ....
    }
    ======================================================
      

  2.   

    我最初是设置Dib的RGBQUAD,跟您的设置一模一样的,这样编译是没错,但运行不了
      

  3.   

    已经搞定了,用了"SkyInBox(盒中天空)"帖子中的一个代码,呵呵,在这谢谢SkyInBox啦!!!