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的程序带进去,也不对,内存不足。
展开
 我来答
归悦欣cf
2012-12-20 · TA获得超过1444个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1332万
展开全部
pPicture->Render到内存dc后从内存dc中获取和编辑数据。
百度网友80b396a
2012-12-07
知道答主
回答量:51
采纳率:0%
帮助的人:22.4万
展开全部
先解码吧,变成bmp在操作,去看看jpg解码程序
追问
但要再保存修改之后的图像,JPG格式的,用这个办法的话,处理过之后就得再压缩为JPG了吧?这样解码再压缩,信息会不会有细微的变化了?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式