图像回显问题,为什么是黑图?谢谢大家 本帖最后由 didilc 于 2010-11-26 15:33:35 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 另外再OnPaint()使用了BitbBit,代码如下:BitBlt(g_hDC,0,0,m_iW_imageOnScreen,m_iH_imageOnScreen,m_memDC_end,0,0,SRCCOPY);////////////////////////////////////////////////////////////////////////////////你有发送重绘消息没?? 有的CPaintDC dc(this);BitBlt(g_hDC,0,0,m_iW_imageOnScreen,m_iH_imageOnScreen,m_memDC_end,0,0,SRCCOPY); 对于位图数据的写回,最好用SetDIBits将它写入到位图对象中去。 在修改了位图数据后要调用SetBitmapBits(HBITMAP hmbp, DWORD cBytes, CONST VOID (lpBits)才能有效。 在SelectObject(m_memDC, g_hBitmap); 之前添加SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); 加入你的代码后还是黑图,详细代码如下,是否是我加得位置有问题,红色部分是我加入的void CArmetDlg::CreateBitmap(){ if(g_hBitmap != NULL) DeleteObject(g_hBitmap); CClientDC dc(GetDlgItem(IDC_VIEW_WND)); g_hBitmap = ::CreateDIBSection(dc.m_hDC, m_lpbi, DIB_RGB_COLORS, (void **)&m_pBits, NULL, 0 ); if(IsContinue==TRUE) { for(int i=0;i<IMAGE_HEIGHT;++i) { memcpy(m_pBits + i * m_wLinePixel, m_pDataCon + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH, IMAGE_WIDTH); } } else { if(IsDieJia==TRUE) { for (int idx=0;idx<IMAGE_SIZE;idx++) { int temp1=m_pDataD1[idx]; int temp2=m_pDataD2[idx]; if (temp1<=temp2) { m_pDataD3[idx]=temp1; } else { m_pDataD3[idx]=temp2; } }for(int j =0; j<IMAGE_SIZE; j++){ temp11[j]=m_pDataD3[j];} for(int i=0;i<IMAGE_HEIGHT;++i) { memcpy(m_pBits + i * m_wLinePixel, m_pDataD3 + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH, IMAGE_WIDTH); } } } SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); SelectObject(m_memDC, g_hBitmap);} 是不是计算方式错误?你试验一下SRCAND SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); =============这里的IMAGE_WIDTH*IMAGE_HEIGHT肯定不对,这里要求是缓冲区的长度,而数组的长度并不是图片的长乘以图片的宽,还要考虑每个像素的色深,例好32位色深的每一个像素占4个字节。 dibsection不是那么用的,不需要SetBitmapBits(),那个是DDB的, dibsection是dib的.你这个: m_lpbi 怎么构造的,帖来look look. 我是这么定义的,你看看对不对。 m_wLinePixel= WORD(WIDTHBYTES((DWORD)IMAGE_WIDTH * 8)); m_lpbi = (LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))]; m_lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); m_lpbi->bmiHeader.biWidth = m_wLinePixel; m_lpbi->bmiHeader.biHeight = IMAGE_HEIGHT; m_lpbi->bmiHeader.biPlanes = 1; m_lpbi->bmiHeader.biBitCount = 8; m_lpbi->bmiHeader.biCompression = BI_RGB; m_lpbi->bmiHeader.biSizeImage = m_wLinePixel * IMAGE_HEIGHT; m_lpbi->bmiHeader.biXPelsPerMeter = 0; m_lpbi->bmiHeader.biYPelsPerMeter = 0; m_lpbi->bmiHeader.biClrUsed = 0; m_lpbi->bmiHeader.biClrImportant = 0; ListCtrl表头响应函数问题 mp3播放器制作问题(小菜鸟的提问~~) 如何用VC6.0做一个透明的ActiveX控件 往vector里插入元素,除了问题! 不用EditView和RichEdit,如何做个notepad?(来抢分!!) 高手救急:如何用程序设置WIN2000用户的属性 菜鸟问题:保持显示最后几行的日志式样标准控件是啥? 或CEdit能否控制总显示最后几行. 急救,万分感谢!! BYTE[16]转化成CTime 闲话几句~~~ 关于图像灰度值问题,谢谢大家了 用什么功能可以使窗口重绘一部分区域
BitBlt(g_hDC,0,0,m_iW_imageOnScreen,m_iH_imageOnScreen,m_memDC_end,0,0,SRCCOPY);
在SelectObject(m_memDC, g_hBitmap); 之前添加SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits);
{
if(g_hBitmap != NULL) DeleteObject(g_hBitmap);
CClientDC dc(GetDlgItem(IDC_VIEW_WND));
g_hBitmap = ::CreateDIBSection(dc.m_hDC, m_lpbi, DIB_RGB_COLORS, (void **)&m_pBits, NULL, 0 ); if(IsContinue==TRUE)
{
for(int i=0;i<IMAGE_HEIGHT;++i)
{
memcpy(m_pBits + i * m_wLinePixel,
m_pDataCon + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH,
IMAGE_WIDTH);
}
}
else
{
if(IsDieJia==TRUE)
{
for (int idx=0;idx<IMAGE_SIZE;idx++)
{
int temp1=m_pDataD1[idx];
int temp2=m_pDataD2[idx];
if (temp1<=temp2)
{
m_pDataD3[idx]=temp1;
}
else
{
m_pDataD3[idx]=temp2;
}
}
for(int j =0; j<IMAGE_SIZE; j++)
{
temp11[j]=m_pDataD3[j];}
for(int i=0;i<IMAGE_HEIGHT;++i)
{
memcpy(m_pBits + i * m_wLinePixel,
m_pDataD3 + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH,
IMAGE_WIDTH); }
}
}
SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); SelectObject(m_memDC, g_hBitmap);
}
=============
这里的IMAGE_WIDTH*IMAGE_HEIGHT肯定不对,这里要求是缓冲区的长度,而数组的长度并不是图片的长乘以图片的宽,还要考虑每个像素的色深,例好32位色深的每一个像素占4个字节。
m_lpbi = (LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))];
m_lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_lpbi->bmiHeader.biWidth = m_wLinePixel;
m_lpbi->bmiHeader.biHeight = IMAGE_HEIGHT;
m_lpbi->bmiHeader.biPlanes = 1;
m_lpbi->bmiHeader.biBitCount = 8;
m_lpbi->bmiHeader.biCompression = BI_RGB;
m_lpbi->bmiHeader.biSizeImage = m_wLinePixel * IMAGE_HEIGHT;
m_lpbi->bmiHeader.biXPelsPerMeter = 0;
m_lpbi->bmiHeader.biYPelsPerMeter = 0;
m_lpbi->bmiHeader.biClrUsed = 0;
m_lpbi->bmiHeader.biClrImportant = 0;