MFC显示JPG图片之后,如何提取像素值并处理,急!
按钮控件里添加的代码,显示JPG图片:CClientDCdc(this);//COM初始化::CoInitialize(NULL);HRESULThr;CFilefile...
按钮控件里添加的代码,显示JPG图片:
CClientDC dc(this);
// COM 初始化
::CoInitialize(NULL);
HRESULT hr;
CFile file("hxs.jpg", CFile::modeRead | CFile::shareDenyNone);
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);//得到handle
LPVOID lpBuf = ::GlobalLock(hMem);//指针
file.ReadHuge(lpBuf, dwSize);//将图片数据存入内存?
file.Close();
::GlobalUnlock(hMem);
IStream * pStream = NULL;//创建一个IStream接口指针,用来保存图片流
IPicture * pPicture = NULL;//创建一个IPicture接口指针,表示图片对象
// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem,TRUE,&pStream);
ASSERT (SUCCEEDED(hr));
hr=::OleLoadPicture(pStream,dwSize,TRUE,IID_IPicture,(LPVOID*)&pPicture);//此函数可加载JPG、GIF图片
ASSERT(hr==S_OK);
long nWidth,nHeight;
pPicture->get_Width(&nWidth); // 宽
pPicture->get_Height(&nHeight); // 高
CSize sz(nWidth, nHeight);
dc.HIMETRICtoDP(&sz);
pPicture->Render(dc.m_hDC,0,0,sz.cx,sz.cy,0,nHeight,nWidth,-nHeight,NULL);//坐标变换
if (pPicture) pPicture->Release();
if (pStream) pStream->Release();
::CoUninitialize();
现在我想把图像中间部分的1/4图像变黑,就是像素值置零,并显示或保存修改后的图像,怎么操作?特别是怎么知道像素数据的存储位置?刚接触这个,麻烦详细说明,最好有代码,谢谢~~
关于jpg的格式有个地方这么说:.JPG文件由文件头和像素数据两部分组成 数据头是一个BITMAPINFOHEADER类型的对象,保存着整个图像文件的信息,包括长,宽,数据位之类的信息。你可以CFile读取这个图像文件,跳过头部分(即BITMAPINFOHEADER对象的大小的字节不读取),只读取数据部分。数据部分是32位代表一个像素点,一般一个字节是保留用,剩下的三个字节分别为RGB。 我没查到jpg格式的详细资料。真的像这样吗?那不是和BMP一样了?但我用处理BMP的程序带进去,也不对,内存不足。 展开
CClientDC dc(this);
// COM 初始化
::CoInitialize(NULL);
HRESULT hr;
CFile file("hxs.jpg", CFile::modeRead | CFile::shareDenyNone);
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);//得到handle
LPVOID lpBuf = ::GlobalLock(hMem);//指针
file.ReadHuge(lpBuf, dwSize);//将图片数据存入内存?
file.Close();
::GlobalUnlock(hMem);
IStream * pStream = NULL;//创建一个IStream接口指针,用来保存图片流
IPicture * pPicture = NULL;//创建一个IPicture接口指针,表示图片对象
// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem,TRUE,&pStream);
ASSERT (SUCCEEDED(hr));
hr=::OleLoadPicture(pStream,dwSize,TRUE,IID_IPicture,(LPVOID*)&pPicture);//此函数可加载JPG、GIF图片
ASSERT(hr==S_OK);
long nWidth,nHeight;
pPicture->get_Width(&nWidth); // 宽
pPicture->get_Height(&nHeight); // 高
CSize sz(nWidth, nHeight);
dc.HIMETRICtoDP(&sz);
pPicture->Render(dc.m_hDC,0,0,sz.cx,sz.cy,0,nHeight,nWidth,-nHeight,NULL);//坐标变换
if (pPicture) pPicture->Release();
if (pStream) pStream->Release();
::CoUninitialize();
现在我想把图像中间部分的1/4图像变黑,就是像素值置零,并显示或保存修改后的图像,怎么操作?特别是怎么知道像素数据的存储位置?刚接触这个,麻烦详细说明,最好有代码,谢谢~~
关于jpg的格式有个地方这么说:.JPG文件由文件头和像素数据两部分组成 数据头是一个BITMAPINFOHEADER类型的对象,保存着整个图像文件的信息,包括长,宽,数据位之类的信息。你可以CFile读取这个图像文件,跳过头部分(即BITMAPINFOHEADER对象的大小的字节不读取),只读取数据部分。数据部分是32位代表一个像素点,一般一个字节是保留用,剩下的三个字节分别为RGB。 我没查到jpg格式的详细资料。真的像这样吗?那不是和BMP一样了?但我用处理BMP的程序带进去,也不对,内存不足。 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询