CHAR BindBack(HWND Hwnd)//连接窗口
{
/*--------------------------------------------*/
DeleteDC(MemoryDCDIB);
ReleaseDC(GratingHWND, EqualpmentDCIntercept);
ReleaseDC(NULL, EqualpmentDCIntercept);
/*---------------------------------------------- */
if (Hwnd)
{
GratingHWND = Hwnd;
GetWindowRect(GratingHWND, &GratingHWNDXY);
GratingHWNDW = GratingHWNDXY.right - GratingHWNDXY.left;
GratingHWNDH = GratingHWNDXY.bottom - GratingHWNDXY.top;
}
EqualpmentDCIntercept = GetDC(GratingHWND);
MemoryDCDIB = CreateCompatibleDC(0);
return 0;
}
VOID SetIntercept(WORD InterceptX, WORD InterceptY, WORD InterceptW, WORD InterceptH)
{
DeleteObject(HDIBITMAP);
GratingInterceptX = InterceptX;
GratingInterceptY = InterceptY;
GratingInterceptW = InterceptW;
GratingInterceptH = InterceptH;
单行存储字节 = GratingInterceptW * 4;
/*-----------初始化虚拟位图----------------------------*/
DIBITMAPINFO = {0 };
DIBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
DIBITMAPINFO.bmiHeader.biWidth = GratingInterceptW;
DIBITMAPINFO.bmiHeader.biHeight = -GratingInterceptH;
DIBITMAPINFO.bmiHeader.biPlanes = 1;
DIBITMAPINFO.bmiHeader.biBitCount = 32;
DIBITMAPINFO.bmiHeader.biCompression = BI_RGB;
DIBITMAPINFO.bmiHeader.biSizeImage = GratingInterceptW * 4 * GratingInterceptH;
DIBITMAPINFO.bmiHeader.biClrImportant = 0;
DIBITMAPINFO.bmiHeader.biClrUsed = 0;
/*创建一个与设备无关的DIB位图,此时是一个空画布,显存指针的顺序是RGBA*/
HDIBITMAP = CreateDIBSection(NULL, &DIBITMAPINFO, DIB_RGB_COLORS, (LPVOID*)&DIB颜色指针, NULL, 0);
SelectObject(MemoryDCDIB/*画笔*/, HDIBITMAP/*画布*/);
DIB颜色指针长度 = DIBITMAPINFO.bmiHeader.biSizeImage;
BitBlt(MemoryDCDIB, 0, 0, GratingInterceptW, GratingInterceptH, EqualpmentDCIntercept, GratingInterceptX, GratingInterceptY, SRCCOPY);
}
//原本的数据传到内存DC里面去
VOID InterceptGrating()
{
/*---------------------------------------------*/
ReleaseDC(GratingHWND, EqualpmentDCIntercept);
ReleaseDC(NULL, EqualpmentDCIntercept);
/*--------------------------------------------------*/
EqualpmentDCIntercept = GetDC(NULL);
BitBlt(MemoryDCDIB, 0, 0, GratingInterceptW, GratingInterceptH, EqualpmentDCIntercept, GratingInterceptX, GratingInterceptY, SRCCOPY);
}
大们:这个CreateDIBSection函数的第四个参数(LPVOID*)&DIB颜色指针显示了地址,但提示说里面的字符无效。读取不到里面的BGR值。求解,,谢谢
思路:
流程应该是:
1.创建DIB(使用CreateDIBSection),得到的第四个参数的指针我们姑且称pDibBits。
2.打开一个位图(使用CreateFile和ReadFile),按我说的方法得到像素数据的指针,姑且称pFileBits。
3.memcpy(pDibBits,pFileBits,图像大小×3像素);
4.将DIB对象选入内存设备内容,并使用BitBlt函数显示。
5.然后对于你想取的像素值,操作pDibBits和操作pFileBits现在是一样的了,当然为了节约内存,在第3步过后,第2步读入内存的bmp文件应该已经可以释放掉了。你想对DIB的数据做这样那样的事就使用pDibBits就行了
下面是部分代码参考:
// CPng_ce_TestDlg 消息处理程序
BOOL CPng_ce_TestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//读取png图片
CoInitializeEx(NULL ,COINIT_MULTITHREADED);
if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory ,(void **) &m_pImageFactory)))
{
MessageBox(_T("创建COM接口失败!"));
}
if(!SUCCEEDED(m_pImageFactory->CreateImageFromFile(_T("\\ResidentFlash\\image.png"),&pImage)))
{
MessageBox(_T("从文件读取图片失败!"));
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CPng_ce_TestDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_PNG_CE_TEST_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_PNG_CE_TEST_DIALOG));
}
}
#endif
void CPng_ce_TestDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
this->GetClientRect(&rect);//获取对话框的大小
if(pImage!=NULL)
{
pImage->Draw(this->GetDC()->m_hDC ,rect,NULL);
}
}
void CPng_ce_TestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_downX=point.x;
m_downY=point.y;
UpdateData(FALSE);
if(m_Rectangle)
{
CPng_ce_TestDlg::OnPaint();//Invalidate();//重绘区域
//lpData=NULL;
m_Rectangle=FALSE;
}
CDialog::OnLButtonDown(nFlags, point);
}
void CPng_ce_TestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
//获得鼠标当前位置
m_Rectangle=TRUE;
m_CreateBmp=TRUE;
m_moveX=point.x;
m_moveY=point.y;
/*r = GetRValue(lpData[0]);
g = GetGValue(lpData[0]);
b = GetBValue(lpData[0]);
r1 = GetRValue(lpData[1]);
g1 = GetGValue(lpData[1]);
b1 = GetBValue(lpData[1]);*/
CClientDC dc(this);
COLORREF ref1 = GetPixel(dc,m_downX,m_downY);
r1 = GetRValue(ref1);
g1 = GetGValue(ref1);
b1 = GetBValue(ref1);
UpdateData(FALSE);
CDialog::OnMouseMove(nFlags, point);
}
void CPng_ce_TestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//CBrush brush(RGB(123,150,200));
CBrush *pOldBrush=dc.SelectObject(pBrush);
CRect rect(m_downX,m_downY,m_moveX,m_moveY);
dc.Rectangle(&rect);
dc.SelectObject(pOldBrush);
if(m_CreateBmp)
{
CFileDialog fileDlg(FALSE,_T("*.bmp"),_T("image.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,_T("Save Fiel(*.bmp)|*.bmp||"));
if(IDOK == fileDlg.DoModal())
{
CreateBMPFile(fileDlg.GetPathName().GetBuffer(MAX_PATH),rect);
}
GetPixel1();
}
r=*lpbit;
CDialog::OnLButtonUp(nFlags, point);
}