我想做根据一个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
具体的做法是先生成一个调色板,代码如下:
// 指向逻辑调色板的指针
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
解决方案 »
- VS2008编译出来的debug版本与正在调试的程序有什么区别
- 非计算机专业毕业生如何成为程序员?
- spi服务器如何提取链接地址
- VC++实现报错
- 大量自绘按钮移动造成的闪烁问题
- 一个非常非常奇怪的问题:OCX控件没有注册,VC程序不能正常调用,VB可以调用!!!!WHY??
- 求类似监控系统cpu、内存利用率程序的源代码。谢谢
- 请问在VC++中怎样隐去原来写的字?
- 我在一个窗口中单击鼠标右键选择了classWizard怎么出了这个错误??
- 怎么样在一个applet中(如:按一个按钮)打开另外一个网页?
- 我的msdn6.0的过滤器全都变成了visual j++ documentation,卸载了重装也没用
- 这个串口程序为什么接收到的都是乱码啊??
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;
............
........
....
}
======================================================