我在内存区域里有象素数据,(不是bmp文件)。我把象素值映射到0~255范围内。没有头信息和调色板。所以用Dib显示不出来。可是我现在想看一下我对数据处理的结果。怎么才能看到象素数据对应的灰度图哪?
解决方案 »
- [求助大大们]VFW 截取视频图片....
- 工具栏地按钮如何设置为单选?
- 新手求教,如何从HDC中得到对应地图片,并却得到图片的BYTE流
- 我写了一段样条曲线的代码,画没什么问题了.但是我想在曲线当中任意加一个点,加点后,曲线的形状就主变掉了,这怎么能解决呢?
- 请教各位大虾,怎样动态地控制菜单项有效与否,只有当点击到特定的列表时,对应的菜单项才有效,否则无效
- 请教crecordset,,有的是分。
- 如何遍历一文件夹下所有文件?(要求支持UNICODE,详细见内)
- SDK环境中,有没有想AfxGetInstancdHandle这样的函数的,可以获得实例句柄
- 问一个弱弱的问题
- c源程序中经常看到 fprintf( stream, "**",**);我知道他是对文件的输出,但stream的作用是什么呀,我曾么才能找到它?
- 问个很菜的问题
- 怎样在vc中调用磁盘检查程序(win2000里面)!!!高分!!!急用!!!!
CDC::SetPixel
比较慢。
分配一块内存得到指针,
自己根据你要的数据设定文件信息头,位图信息头,调色板。
然后将你的内存区域里有象素数据转化为相应的位图数据,注意宽度字节对齐。
再调用CreateDIBitmap
调用
BYTE* ColorBuf; //你的颜色缓冲区
int w; //你的宽度
int h; //你的高度
for (int i=0; i<h; i++)
{
for (int j=0; j<w; j++)
{
int c = ColorBuf[i*w + j];
SetPixel(hDC, j, i, RGB(c,c,c));
}
}比较复杂但高效的方法:
构造一个int StretchDIBits();需要的BITMAPINFO, lpBits参数;
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPINFO, *PBITMAPINFO;其中bmiColors[i].rgbRed = bmiColors[i].rgbBlue = bmiColors[i].rgbGreen = i;lpBits就是你的颜色缓冲区
bmpi.biHeight=rect.Height();
bmpi.biWidth=rect.Width();
bmpi.biBitCount=24;
bmpi.biCompression=BI_RGB;
bmpi.biSize=sizeof(bmpi);
bmpi.biPlanes=1;再CreateDIBitmap,应为你已有了hDib,第四个参数直接(LPVOID)hDib就行了。
bmpi.biWidth=20;
再自己建一个bmp的文件头,就搞定了。
所有的功能都应该在这里实现,然后在onDraw中调用这个函数即可。谢谢/////////////////////////////////////////////////////////
///参数:
///HDC hDC 输出设备DC
///LPRECT lpDCRect 绘制矩形区域
///LPSTR lpDCMBits 指向DCM对象象素的指针
///LPRECT lpDCMRect 要输出的DCM区域
///
/// 返回 BOOL值
/////////////////////////////////////////////////////////BOOL WINAPI PaintDCM(HDC hDC,
LPRECT lpDCRect,
LPSTR lpDCMBits,
LPRECT lpDCMRect)
{
//LPSTR lpDCMBits; //指向象素指针
BOOL bSuccess=FALSE; //成功标志//定义一个调色板
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD; //构造一个位图头信息结构
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPINFO, *PBITMAPINFO; /*/初始化颜色表
for(int i=0;i<256;i++)
{
bmiColors[i].rgbRed = bmiColors[i].rgbBlue = bmiColors[i].rgbGreen = i;
}
*/
//锁定DCM
//lpDCMBits = (LPSTR)::GlobalLock((HGLOBAL) hDCM);
//设置显示模式
::SetStretchBltMode(hDC,COLORONCOLOR); //判断是调用StretchDIBits() 还是 SetDIBitsToDevice()来绘制对象
if((RECTWIDTH(lpDCRect) == RECTWIDTH(lpDCMRect)) &&
(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDCMRect)))
{
bSuccess=::SetDIBitsToDevice(hDC,
lpDCRect->left,
lpDCRect->top,
RECTWIDTH(lpDCRect),
RECTHEIGHT(lpDCRect),
lpDCMRect->left,
512,
0,
512,
lpDCMBits,
NULL,
DIB_RGB_COLORS);
}
else
{
bSuccess=::StretchDIBits(hDC,
lpDCRect->left,
lpDCRect->top,
RECTWIDTH(lpDCRect),
RECTHEIGHT(lpDCRect),
lpDCMRect->left,
lpDCMRect->top,
RECTWIDTH(lpDCMRect),
RECTHEIGHT(lpDCMRect),
lpDCMBits,
NULL,
DIB_RGB_COLORS,
SRCCOPY);
}
// ::GlobalUnlock((HGLOBAL) hDCM);
return bSuccess;
}
这个函数是可以执行的。
BOOL WINAPI PaintDIB(HDC hDC,
LPRECT lpDCRect,
HDIB hDIB,
LPRECT lpDIBRect,
CPalette* pPal)
{
LPSTR lpDIBHdr; // BITMAPINFOHEADER指针
LPSTR lpDIBBits; // DIB象素指针
BOOL bSuccess=FALSE; // 成功标志
HPALETTE hPal=NULL; // DIB调色板
HPALETTE hOldPal=NULL; // 以前的调色板 // 判断DIB对象是否为空
if (hDIB == NULL)
{
// 返回
return FALSE;
} // 锁定DIB
lpDIBHdr = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIBHdr); // 获取DIB调色板,并选中它
if (pPal != NULL)
{
hPal = (HPALETTE) pPal->m_hObject; // 选中调色板
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
} // 设置显示模式
::SetStretchBltMode(hDC, COLORONCOLOR); // 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if ((RECTWIDTH(lpDCRect) == RECTWIDTH(lpDIBRect)) &&
(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
{
// 原始大小,不用拉伸。
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
RECTWIDTH(lpDCRect), // nDestWidth
RECTHEIGHT(lpDCRect), // nDestHeight
lpDIBRect->left, // SrcX
(int)DIBHeight(lpDIBHdr) -
lpDIBRect->top -
RECTHEIGHT(lpDIBRect), // SrcY
0, // nStartScan
(WORD)DIBHeight(lpDIBHdr), // nNumScans
lpDIBBits, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
}
else
{
// 非原始大小,拉伸。
bSuccess = ::StretchDIBits (hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
RECTWIDTH(lpDCRect), // nDestWidth
RECTHEIGHT(lpDCRect), // nDestHeight
lpDIBRect->left, // SrcX
lpDIBRect->top, // SrcY
RECTWIDTH(lpDIBRect), // wSrcWidth
RECTHEIGHT(lpDIBRect), // wSrcHeight
lpDIBBits, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS, // wUsage
SRCCOPY); // dwROP
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 恢复以前的调色板
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}
// 返回
return bSuccess;
}
ZeroMemory(&bif,sizeof(bif));
bif.bmiHeader.biHeight=20;
bif.bmiHeader.biWidth=20;
bif.bmiHeader.biBitCount=24;
bif.bmiHeader.biCompression=BI_RGB;
bif.bmiHeader.biPlanes=1;
bif.bmiHeader.biSize=sizeof(bif);HDC hDC=::GetDC(0),hSrcDC=CreateCompa..DC(NULL);
bmp=::CreateDIBitmap(hSrcDC,&(bif.bmiHeader),CBM_INIT,pDIB/*你的dib段*/,&bif,
DIB_RGB_COLORS);
HGDIOBJ hObj=SelectObject(hSrcDC,bmp);
BitBlt(hDC,0,0,20,20,hSrcDC,0,0,SRCCOPY);
SelectObject(hSrcDC,hObj);
DeleteObject(bmp);
::ReleaseDC(NULL,hDC);
DeleteDC(hSrcDC);
试试吧。
这句话是什么意思?不懂,也编译不过去。
但是运行结果是一团黑。不过我已经很高兴了。
我已经把我得象素数据传进去了。屏幕是一块黑的。我再看看,你要不再帮我想想?
顺便告诉我怎么给你加分,今天上午我好像给你加过分,得
表示一下,不过我还是非常非常感谢你。谢谢。
DIB_RGB_COLORS);这个方法一定可行的,我读.bmp文件就是这个方法,注意你的hDib是否正确。
DIB_RGB_COLORS);这个方法一定可行的,我读.bmp文件就是这个方法,注意你的hDib是否正确。