MFC对话框中用IPicture类加载了一幅图片,现在想对图片进行操作,想获得指向该图像第一个像素的指针,怎么
voidCTD1::OnOpenPicture(){//TODO:AddyourcontrolnotificationhandlercodehereCFileDialog...
void CTD1::OnOpenPicture()
{
// TODO: Add your control notification handler code here
CFileDialog m_dlg(true);
m_dlg.m_ofn.lpstrFilter="Support Files(*.jpg)\0*.jpg\0Support Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
if(m_dlg.DoModal()==IDOK)
{
CString filepath = m_dlg.GetPathName(); //文件路径
m_pathname=filepath;
UpdateData(FALSE);
// COM 初始化
::CoInitialize(NULL);
// 读入图片文件内容
CFile file;
file.Open( filepath, CFile::modeRead | CFile::shareDenyNone );
//申请内存空间
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
//获得内存指针
LPVOID lpBuf = ::GlobalLock(hMem);
//读文件进内存
file.ReadHuge(lpBuf, dwSize);
//关闭文件
file.Close();
::GlobalUnlock( hMem );
//long nWidth, nHeight;
IStream * pStream = NULL;
//IPicture * pPicture = NULL;
//由hMem创建内存流对象
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
ASSERT(SUCCEEDED(hr));
//从流获取图像
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture,
reinterpret_cast<LPVOID*>(&pPicture));
ASSERT(hr==S_OK);
//long nWidth, nHeight;
pPicture->get_Width(&nWidth); // 宽
pPicture->get_Height(&nHeight); // 高
//获得控件大小及DC
CRect rc;
GetDlgItem(IDC_STATICPICTURE)->GetClientRect(&rc);
CDC* pDC = GetDlgItem(IDC_STATICPICTURE)->GetDC();
//贴图
pPicture->Render(pDC->GetSafeHdc(), 0, 0, rc.Width(), rc.Height(),
0, nHeight, nWidth, -nHeight, NULL);
//清理工作
pPicture->Release();
pStream->Release();
::CoUninitialize();
}
}
以上是我打开图像的程序,希望高手帮帮我,不胜感激!!! 展开
{
// TODO: Add your control notification handler code here
CFileDialog m_dlg(true);
m_dlg.m_ofn.lpstrFilter="Support Files(*.jpg)\0*.jpg\0Support Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
if(m_dlg.DoModal()==IDOK)
{
CString filepath = m_dlg.GetPathName(); //文件路径
m_pathname=filepath;
UpdateData(FALSE);
// COM 初始化
::CoInitialize(NULL);
// 读入图片文件内容
CFile file;
file.Open( filepath, CFile::modeRead | CFile::shareDenyNone );
//申请内存空间
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
//获得内存指针
LPVOID lpBuf = ::GlobalLock(hMem);
//读文件进内存
file.ReadHuge(lpBuf, dwSize);
//关闭文件
file.Close();
::GlobalUnlock( hMem );
//long nWidth, nHeight;
IStream * pStream = NULL;
//IPicture * pPicture = NULL;
//由hMem创建内存流对象
hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
ASSERT(SUCCEEDED(hr));
//从流获取图像
hr = ::OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture,
reinterpret_cast<LPVOID*>(&pPicture));
ASSERT(hr==S_OK);
//long nWidth, nHeight;
pPicture->get_Width(&nWidth); // 宽
pPicture->get_Height(&nHeight); // 高
//获得控件大小及DC
CRect rc;
GetDlgItem(IDC_STATICPICTURE)->GetClientRect(&rc);
CDC* pDC = GetDlgItem(IDC_STATICPICTURE)->GetDC();
//贴图
pPicture->Render(pDC->GetSafeHdc(), 0, 0, rc.Width(), rc.Height(),
0, nHeight, nWidth, -nHeight, NULL);
//清理工作
pPicture->Release();
pStream->Release();
::CoUninitialize();
}
}
以上是我打开图像的程序,希望高手帮帮我,不胜感激!!! 展开
3个回答
展开全部
以pPicture 取得你这个图片的高与宽
建一个同样大小的设备兼容位图,然后pPicture->Render 其中设备描述符句柄HDC使用这个
设备兼容位图的HDC作为参数,这样你的Picture就渲染到了这个设备兼容位图上,然后就是常规操作了。如果你对设备兼容位图的操作不清楚,就去看Win32程序设计这本书,百度文档上肯定有
看位图那章,很多例子的。
建一个同样大小的设备兼容位图,然后pPicture->Render 其中设备描述符句柄HDC使用这个
设备兼容位图的HDC作为参数,这样你的Picture就渲染到了这个设备兼容位图上,然后就是常规操作了。如果你对设备兼容位图的操作不清楚,就去看Win32程序设计这本书,百度文档上肯定有
看位图那章,很多例子的。
更多追问追答
追问
可以给我一个小例子吗,我想知道那图像的首地址,即指向它的指针
追答
这两天公司挺忙没时间写例子给你,你去看看 Win32程序设计 影子位图那章应该可以,如果不行周末我再回你。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询