如何把浏览器中的图像变成灰度图像来显示

flyeag 2009-08-15 08:07:45
我想的是通过BHO来实现,关键问题在怎么在DocumentComplete事件后取得图像的数据,然后修改成灰度图像,在进行显示,而且还有一个DownloadComplete事件,不知道是不是在这个事件后处理所下载的图像,然后在显示。 希望那位高手指点下小弟!
...全文
288 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjdev 2009-08-23
  • 打赏
  • 举报
回复
我觉得把图片处理后再放回的方法可行性度不高。
楼上有人说修改css,或使用js脚本,我觉得还比较靠谱。
flyeag 2009-08-21
  • 打赏
  • 举报
回复
STDMETHODIMP CGetTextBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite)
{
m_spWebBrowser2 = pUnkSite;
return RegisterEventHandler(TRUE);
}
return E_FAIL;
}

STDMETHODIMP CGetTextBHO::RegisterEventHandler(BOOL inAdvise)
{
CComPtr<IConnectionPoint> spCP;
CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> spCPC(m_spWebBrowser2);

HRESULT hr = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spCP);

if(FAILED(hr))
return hr;

if (inAdvise)
{
hr = spCP->Advise(reinterpret_cast<IDispatch *>(this),&m_dwCookie);
}
else
{
spCP->Unadvise(m_dwCookie);
}
return hr;
}

STDMETHODIMP CGetTextBHO::Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)
{
USES_CONVERSION;//使用转换宏

if (!pDispParams)
return E_INVALIDARG;

switch (dispIdMember)
{
//
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_BEFORENAVIGATE2: //在打开浏览页面之前的事件处理
break;
case DISPID_NAVIGATECOMPLETE2: //网页打开完毕
break;
case DISPID_DOCUMENTCOMPLETE: //文档打开完毕
{
CComQIPtr<IWebBrowser2> spTempWebBrowser = pDispParams->rgvarg[1].pdispVal;
if ( spTempWebBrowser && m_spWebBrowser2 &&
m_spWebBrowser2.IsEqualObject(spTempWebBrowser))
{
// Get the current document object from browser...
CComPtr<IDispatch> spDispDoc;
if ( SUCCEEDED(m_spWebBrowser2->get_Document(&spDispDoc)) )
{
// ...and query for an HTML document.
CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
if (spHTMLDoc != NULL)
{
// Finally, get the images.
GetPicture(spHTMLDoc);
}
}
}
break;
}
case DISPID_DOWNLOADBEGIN: //下载开始
break;
case DISPID_DOWNLOADCOMPLETE: //下载完毕
break;
case DISPID_NEWWINDOW2: //打开新窗口
break;
case DISPID_PROGRESSCHANGE: // 进度条改变
break;
case DISPID_STATUSTEXTCHANGE: // 状态天文字改变
break;
case DISPID_TITLECHANGE: // 标题改变
break;
case DISPID_QUIT: //退出当前浏览页面
RegisterEventHandler(FALSE);
break;
default:
break;
}

return S_OK;
}

void CGetTextBHO::GetPicture(IHTMLDocument2* spDocument)
{
CComPtr<IHTMLElementCollection> spElements;
CString strTemp2=L"";
int count = 0;

// Get the collection of elements from the DOM.
HRESULT hr = spDocument->get_all(&spElements);
if (hr == S_OK && spElements != NULL)
{
// Get the number of elements in the collection.
long cElements = 0;
hr = spElements->get_length(&cElements);
if (hr == S_OK && cElements > 0)
{
for (int i = 0; i < cElements; i++)
{
CComVariant svarItemIndex(i);
CComVariant svarEmpty;
CComPtr<IDispatch> spdispElement;

// Get the element out of the collection by index.
hr = spElements->item(svarItemIndex, svarEmpty, &spdispElement);
if (hr == S_OK && spdispElement != NULL)
{
CComQIPtr<IHTMLElement> spElement = spdispElement;
if (spElement)
{
BSTR strTagName;
spElement->get_tagName(&strTagName);
CString strTemp = strTagName;
if( strTemp=="img" || strTemp=="IMG" )
{
VARIANT strImgURL;
spElement->getAttribute(L"src",0,&strImgURL);
strTemp = strImgURL;
CString strImgPath = GetImagePath(strTemp);
if (0==count)
{
strTemp2 = strImgPath;
count++;
}
if (!strImgPath.IsEmpty())
GreyPicture(strImgPath);
}
}
}
}

CComPtr<IHTMLLocation> spLocation;
hr = spDocument->get_location(&spLocation);
if (SUCCEEDED(hr))
{
hr = spLocation->reload(VARIANT_FALSE);
}
if(!strTemp2.IsEmpty())
{
CImage image1;
image1.Load(strTemp2);
CDC dc;
dc.CreateDC(L"Display",NULL,NULL,NULL);
image1.Draw(dc.m_hDC,0,0);
dc.DeleteDC();
}
}
}
}

CString CGetTextBHO::GetImagePath(LPCTSTR lpszImgUrl)
{
CString strPath;
DWORD dwEntrySize=0;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;

if (!GetUrlCacheEntryInfo(lpszImgUrl,NULL,&dwEntrySize))
{
if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
{
TRACE("GetUrlCacheEntryInfo Error:%d\n",GetLastError());
return _T("");
}
else
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
}
else
return _T(""); // should not be successful w/ NULL buffer and 0 size

if (!GetUrlCacheEntryInfo(lpszImgUrl,lpCacheEntry,&dwEntrySize))
{
return _T("");
}
else
{
strPath = lpCacheEntry->lpszLocalFileName;
}
delete [] lpCacheEntry;
return strPath;
}

HRESULT CGetTextBHO::GreyPicture(LPCTSTR lpszImgPath)
{
CImage image;
image.Load(lpszImgPath);
if( !image.IsDIBSection())
return E_FAIL;
if ( !image.IsIndexed() )
{
// 直接修改像素颜色
COLORREF pixel;
int maxY = image.GetHeight(), maxX = image.GetWidth();
BYTE r,g,b,avg;
for (int x=0; x<maxX; x++)
{
for (int y=0; y<maxY; y++)
{
pixel = image.GetPixel(x,y);
r = GetRValue(pixel);
g = GetGValue(pixel);
b = GetBValue(pixel);
avg = (BYTE)(((WORD)r * 30 + (WORD)g * 59 + (WORD)b * 11) / 100);
image.SetPixelRGB(x,y,avg,avg,avg);
}
}
}
else
{
// 获取并修改颜色表
int MaxColors = image.GetMaxColorTableEntries();
RGBQUAD * ColorTable;
ColorTable = new RGBQUAD[MaxColors];
image.GetColorTable(0,MaxColors,ColorTable);
for (int i=0; i<MaxColors; i++)
{
BYTE avg = (BYTE)(((WORD)ColorTable[i].rgbRed * 30 + (WORD)ColorTable[i].rgbGreen * 59 + (WORD)ColorTable[i].rgbBlue * 11) / 100);
ColorTable[i].rgbBlue = avg;
ColorTable[i].rgbGreen = avg;
ColorTable[i].rgbRed = avg;
}
image.SetColorTable(0,MaxColors,ColorTable);
delete(ColorTable);
}
image.Save(lpszImgPath);
CImage image1;
image1.Load(lpszImgPath);
CDC dc;
dc.CreateDC(L"Display",NULL,NULL,NULL);
image1.Draw(dc.m_hDC,0,0);
dc.DeleteDC();
return S_OK;
}
flyeag 2009-08-21
  • 打赏
  • 举报
回复
那位高手 来回答下啊。
flyeag 2009-08-20
  • 打赏
  • 举报
回复
js 没有用过,能给点代码吗? 我查到一个可以通过IHTMLLocation::reload这个方法来让浏览器重载页面,但是没有效果 有人用过没?
abomber2 2009-08-20
  • 打赏
  • 举报
回复
网页插入js代码,用js来做这个事情
das_jack 2009-08-20
  • 打赏
  • 举报
回复
onCompleted 中动态注入javascript脚本,然后用CSS样式
flyeag 2009-08-20
  • 打赏
  • 举报
回复
弄了几天,又来问了。 我现在通过GetUrlCacheEntryInfo函数取得图像在电脑上的存储路径,然后用CImage对象来把图像变灰了,要怎样才能让浏览器显示修改后的图像了?
蒋晟 2009-08-17
  • 打赏
  • 举报
回复
IImageDecodeFilter
仅限于浏览器不内部支持的图像格式。
flyeag 2009-08-17
  • 打赏
  • 举报
回复
是不是有什么函数或者接口能直接把修改后的图像放回到网页中? 希望各位继续关注。
flyeag 2009-08-17
  • 打赏
  • 举报
回复
对于图像解码器,我找到了一个接口IImgCtx,能够取得图像数据了,但是怎样把修改后的图像放回到网页中显示了?
w29468 2009-08-17
  • 打赏
  • 举报
回复
直接用CSS样式就可以了
蒋晟 2009-08-17
  • 打赏
  • 举报
回复
可以自己注册图像解码器,不过仅限于浏览器不内部支持的图像格式。
也可以写代理服务器来做,不过这超出了BHO的范畴。
  • 打赏
  • 举报
回复
对于图像中某红、绿、蓝三基色分量分别为R、G、B的像素来说,其灰度值为
Gray=R×0.299+G×0.587+B×0.114,其中Gray表示灰度值
sjdev 2009-08-16
  • 打赏
  • 举报
回复
貌似要做个什么彩色过滤吧。咱也不懂。
flyeag 2009-08-16
  • 打赏
  • 举报
回复
进行灰度处理的方法我知道,但是就是没法获取图像的数据啊。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧