获取网页中的jpeg图片

tiancanyue 2009-11-02 10:48:34
用webbrowser打开一个网页后,想取得其中的jpeg图片,我用的是IHTMLControlRange::execCommand执行Copy,将图片拷贝至剪切板中,但是从剪切板中取出时出现了麻烦:
if (Clipboard()->HasFormat(CF_METAFILEPICT))//此时无论是CF_METAFILEPICT,CF_PICTURE还是BITMAP,返回都是false

若直接LoadFromClipboardFormat(CF_BITMAP,Clipboard()->GetAsHandle(CF_BITMAP), 0),则发生异常,说
“unsupported clipboard format”.

求解~,也可以通过其它方式

但不想通过取得图片链接然后再下载的方式

也可以通过获得图片的缓存地址的方法,但对GetUrlCacheEntryInfo不熟,而且听说此函数对网址的识别有问题。希望老大解释用法~

分不多了,可以去http://topic.csdn.net/u/20091101/23/b4e581b2-575a-4d4e-89c7-30c53f47b1c1.html再领分
...全文
288 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiancanyue 2009-12-04
  • 打赏
  • 举报
回复
哎,想办法绕过了
蒋晟 2009-11-12
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/ms649013(VS.85).aspx
看看这些剪贴板格式是否支持
  • 打赏
  • 举报
回复
你找个解释jpg的lib....有很多现成的....直接对数据操作
tiancanyue 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hbxtlhx 的回复:]
显示出下载的图片,或保存为文件都可以通过this->m_pPic来实现,比如画出图片:
this->m_pPic->Render(...)
[/Quote]多谢,但不想用这种方式
tiancanyue 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hdqqq 的回复:]
LoadFromClipboardFormat 不是标准api, 是不是用了封装的类, 你应该先取得clipboard中的类型,然后在想办法从里面取数据,另外, 你用其他程序试过吗? 可以 paste 图片文件吗?
[/Quote]
取过格式,但取出来不知道怎么操作~
取出来想显示一下,结果是乱码。不知道什么鬼格式
北京的雾霾天 2009-11-04
  • 打赏
  • 举报
回复
显示出下载的图片,或保存为文件都可以通过this->m_pPic来实现,比如画出图片:
this->m_pPic->Render(...)
北京的雾霾天 2009-11-04
  • 打赏
  • 举报
回复
参考下面的代码:

#include<wininet.h>
#pragma comment(lib,"wininet.lib")
void SetImage(LPCTSTR imgUrl)
{
DWORD length(1024*10);
DWORD readLength(0);
BYTE* pBuffer(NULL);
BYTE* p(NULL);
HINTERNET hInternet;

hInternet=InternetOpen(_T("someName"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (hInternet==NULL)
{
return;
}

HINTERNET hUrl;
hUrl=InternetOpenUrl(hInternet,imgUrl,NULL,0,INTERNET_FLAG_RELOAD,0);
if (hUrl==NULL)
{
InternetCloseHandle(hInternet);
return;
}

try
{
//下载图片
pBuffer=new BYTE[length];
memset(pBuffer,0,length);
p=pBuffer;
BOOL read;
while(true)
{
read=InternetReadFile(hUrl,p,1024,&readLength);
if(!read||readLength==0)
break;
if ((p-pBuffer+readLength)>=length)
{
DWORD len=2*length;
BYTE* tmp=new BYTE[len];
memset(tmp,0,len);
memcpy(tmp, pBuffer, length);
int offset=p-pBuffer;
delete[] pBuffer;

pBuffer=tmp;
p=pBuffer+offset;
length=len;
}
p+=readLength;
}
int btslen=p-pBuffer;

//生成图片
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, btslen);
LPVOID pvData = NULL;

if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
errno_t err;
err = memcpy_s(pvData, btslen, pBuffer, btslen);
if (!err)
{
GlobalUnlock(hGlobal);

IPicture *pPic;
IStream *pStm;
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

HRESULT hr;
hr=OleLoadPicture(pStm,btslen,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(hr==S_OK)
{
this->m_pPic=pPic;//m_pPic缓存图片信息
}
}
}
}
if (pBuffer!=NULL)
{
delete[] pBuffer;
}
}
catch(...){}
InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);
}
北京的雾霾天 2009-11-04
  • 打赏
  • 举报
回复
我觉得使用链接下载比较好,如下的四个函数就可以了
InternetOpen
InternetOpenUrl
InternetReadFile
InternetCloseHandle
WFORLS 2009-11-03
  • 打赏
  • 举报
回复
偶是菜鸟,飘过学习+帮顶。
hdqqq 2009-11-03
  • 打赏
  • 举报
回复
LoadFromClipboardFormat 不是标准api, 是不是用了封装的类, 你应该先取得clipboard中的类型,然后在想办法从里面取数据,另外, 你用其他程序试过吗? 可以 paste 图片文件吗?
tiancanyue 2009-11-02
  • 打赏
  • 举报
回复
没人吗?失望~
跪求高手~
tiancanyue 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hdqqq 的回复:]
可以用ie的dom模型接口或者自己用正则表达式分析html页面.
[/Quote]

已经分析出来了,图片的src已经取出,已经把图片复制至剪切板,问题是,怎么从剪切板取出。因为不是bmp图片,总是提示格式错误
hdqqq 2009-11-02
  • 打赏
  • 举报
回复
可以用ie的dom模型接口或者自己用正则表达式分析html页面.
tiancanyue 2009-11-02
  • 打赏
  • 举报
回复
自己顶~

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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