接收从网页拖动到WPF窗口的图像(Receiving an image dragged from Web Page to WPF window)

   IT问题网   2018-05-27 00:00:00

问 题

我希望我的wpf应用程序是一个下降的目标,我希望能够从任何网页拖动图像。

当图像被从网页拖动,显然它是在"dragimagebits"格式,其可以被反序列化到输入<一href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb759778(v=vs.85).aspx">shdragimage. (见的问题如何我定义它的底部)

我如何将此转换为wpf的形象?

下面是我当前的尝试。 (如果有人知道做desirialization正确的方法,我所有的耳朵)

 私人无效usercontrol_drop(对象发件人,system.windows.drageventargs e)
{

字符串[]格式= data.getformats();

// dragimagebits
如果(formats.contains("dragimagebits"))
{
memorystream的的imagestream = data.getdata("dragimagebits")作为memorystream的;

//现在我反序列化这一点,唯一的办法我知道如何
imagestream.seek(0,seekorigin.begin);
br binaryreader在新= binaryreader在(的imagestream);

shdragimage shdragimage;
shdragimage.sizedragimage.cx = br.readint32();
shdragimage.sizedragimage.cy = br.readint32();
shdragimage.ptoffset.x = br.readint32();
shdragimage.ptoffset.y = br.readint32();
shdragimage.hbmpdragimage =新的intptr(br.readint32());
shdragimage.crcolorkey = br.readint32();


var systemdrawingbitmap = system.drawing.bitmap.fromhbitmap(shdragimage.hbmpdragimage);
 

在这一点上我得到一个异常类型的 system.runtime.interopservices.externalexception ,该消息仅仅是通用gdi +误差。

有谁知道我应该做的事情?


这里是支持类的定义。我从<复制的他们href="http://blogs.msdn.com/adamroot/pages/shell-style-drag-and-drop-in-net-wpf-and-winforms.aspx">this博客条目。

<$p$p><$c$c>[system.runtime.interopservices.structlayout(system.runtime.interopservices.layoutkind.sequential)] 公共结构win32point { 公众诠释x; 公众诠释; } [system.runtime.interopservices.structlayout(system.runtime.interopservices.layoutkind.sequential) 公共结构win32size { 公众诠释cx; 公众诠释cy; } [system.runtime.interopservices.structlayout(system.runtime.interopservices.layoutkind.sequential) 公共结构shdragimage { 公共win32size sizedragimage; 公共win32point ptoffset; 公众的intptr hbmpdragimage; 公众诠释crcolorkey; }
解决方案

下面是我所学到的:

"dragimagebits"是由windows外壳程序提供,是指只为拖动光标,而不是最终的数据。外壳通过调整大小和透明度转换图像到适当的拖动光标。

例如,如果拖动这个图片:

在shdragimage将呈现为这样的:

如果你真的想从shdragimage提取图像,这里是code。 (部分来自这个答案)

 的memorystream的imagestream = data.getdata("dragimagebits")作为memorystream的;
imagestream.seek(0,seekorigin.begin);
br binaryreader在新= binaryreader在(的imagestream);
shdragimage shdragimage;
shdragimage.sizedragimage.cx = br.readint32();
shdragimage.sizedragimage.cy = br.readint32();
shdragimage.ptoffset.x = br.readint32();
shdragimage.ptoffset.y = br.readint32();
shdragimage.hbmpdragimage =新的intptr(br.readint32()); //我不知道这是什么!
shdragimage.crcolorkey = br.readint32();
int跨距= shdragimage.sizedragimage.cx * 4;
var为imagedata =新的字节[步幅* shdragimage.sizedragimage.cy]。
//我们必须读取的图像数据作为一个循环,所以它是一个翻转的格式
的for(int i =(shdragimage.sizedragimage.cy-1)*步幅; i = 0; i-=步幅)
{
br.read(为imagedata,我,步幅);
}
var的bitmapsource = bitmapsource.create(shdragimage.sizedragimage.cx,shdragimage.sizedragimage.cy,
96,96,
pixelformats.bgra32,
空值,
为imagedata,
步幅);
 

如果你想利用dragimagebits为它的预期目的(作为拖动图像),请参阅<一href="http://blogs.msdn.com/adamroot/pages/shell-style-drag-and-drop-in-net-wpf-and-winforms.aspx">this博客一种简单,可下载的例子。


所以,在"dragimagebits"是pretty的多,从实际的问题,这是接受的图像的分心从网页拖

从网页拖动图像变得复杂,因为火狐,chrome,ie9和全部给你一组不同的格式。此外,要同时处理图像和图像的超链接,而这些又区别对待。

谷歌和火狐提供了一个"text / html的"格式,它给你一个单一的html元素为图像。谷歌把它交给你作为一个ascii字符串,而firefox将其提供给您作为一个单code字符串。因此,这里的code我写来处理它:

system.windows.idataobject数据= e.data;
字符串[]格式= data.getformats();


如果(formats.contains("text / html的"))
{

var obj = data.getdata("text / html的");
字符串的html =的string.empty;
如果(obj是字符串)
{
html =(字符串)目标文件;
}
否则,如果(obj为memorystream的)
{
的memorystream毫秒=(memorystream的)目标文件;
byte []的缓冲区=新的字节[ms.length]
ms.read(缓冲液,0,(int)的ms.length);
如果(缓冲[1] ==(字节)0)//检测单code
{
html = system.text.encoding.uni code.getstring(缓冲区);
}
其他
{
的html = system.text.encoding.ascii.getstring(缓冲液);
}
}
//使用正则表达式解析html,但只是在这个例子中:-)
var匹配=新的正则表达式(@" img [^ /] src =""([^""] *)","")。匹配(html);
如果(match.success)
{
开放的我们的uri =新的uri(match.groups [1]。价值);
setimagefromuri(uri);
}
}
 

在这种情况下,常规的前pression将同时处理一直图像和图像的超链接。

和我的 setimagefromuri 功能:

 私人无效setimagefromuri(uri uri)
{
字符串文件名= system.io.path.gettempfilename();
使用(web客户端web客户端=新的web客户端())
{
webclient.downloadfile(uri,文件名);
}
使用(的filestream fs = file.openread(文件名))
{
byte []的为imagedata =新的字节[fs.length]
fs.read(为imagedata,0,(int)的fs.length);
this.imagebinary =为imagedata;
}
file.delete(文件名);
}
 

有关ie9可以处理"filedrop"格式。这在ie9效果很好。 chrome浏览器不支持它。 firefox没有支持它,但将图像转换为位图和透明的像素转换为黑色。出于这个原因,你应该只处理"filedrop"格式,如果"text.html"的格式是不具备的。

 否则,如果(formats.contains("filedrop"))
{
var文件路径=(字符串[])data.getdata("filedrop");
使用(var filestream = file.openread(文件路径[0]))
{
var缓冲区=新的字节[filestream.length]
filestream.read(缓冲液,0,(int)的filestream.length);
this.imagebinary =缓冲区;
}
}
 

如果你从ie9拖动图像的超链接,不提供"filedrop"格式。我还没有想出如何从ie9图像超链接的图像拖到我的形象的控制。


额外的资讯

如果您使用的是这个例子,但还是需要这个二进制数据转换成图像,这里是一个有用的code片断:

 的bitmapimage sourceimage =新的bitmapimage();
使用(memorystream的毫秒=新的memorystream(imagebinary))
{
sourceimage.begininit();
sourceimage.cacheoption = bitmapcacheoption.onload;
sourceimage.streamsource =毫秒;
sourceimage.endinit();
}
 

标签:接收接管网页拖动窗口图像图象



分享:

  • 微信
  • QQ好友
  • QQ空间
  • 新浪微博


热门推荐

变新鲜担保.NET(挥发性与挥发性读)(Variable freshness guarantee in .NET (volatile vs. volatile read))

problem i have read many contradicting information (msdn, ...

OpenOffice和.NET(OpenOffice and .NET)

problem is there a .net api for openoffice edit: is the ...

VB.NET FileSystemWatcher的多个更改事件(VB.NET FileSystemWatcher Multiple Change Events)

problem i have the following code: imports system.io ...

光速VS NHibernate的(Lightspeed vs NHibernate)

problem what is the experience with lightspeedthe compari ...

实现在C#中的生产者/消费者模式(Implementing the Producer/Consumer Pattern in C#)

problem how can i implement the producer/consumer pattern ...

没有tnsnames.ora文件Oracle连接字符串(Oracle connection string without tnsnames.ora file)

problem i am using the .net framework with the system.dat ...

我如何可以访问WCF服务实例,在当前的背景下?(How do I get access to the WCF service instance in the current context)

problem if i am executing within the context of a particu ...

如何崩溃的.NET公共语言运行库(CLR)在纯.NET(How to crash the .NET common language runtime (CLR) in pure .net)

problem there is a similar question targeting the java vm ...

类/模型级别验证(而不是属性级别)? (ASP.NET MVC 2.0)(Class/Model Level Validation (as opposed to Property Level) (ASP.NET MVC 2.0))

problem basically, what the title says. i hav ...

为了避免出现InvalidOperationException最佳实践:集合已修改?(Best practice to avoid InvalidOperationException: Collection was modified)

problem very often i need something like that: foreach ...

为什么在C#4.0的可选参数需要编译时常?(Why do optional parameters in C# 4.0 require compile-time constants)

problem also is there a way to use run-time v ...

不能添加欣赏到EDMX(cannot add view to the edmx)

problem when trying to add a view to the edmx ...

目前已经在IP端点0.0.0.0:13000监听器。 ? (TCP使用WCF)(There is already a listener on IP endpoint 0.0.0.0:13000. (TCP using WCF))

problem i'm trying to figure out why the port is being us ...

这是使用System.Security.Principal.WindowsIdentity的合理的安全?(Is this use of System.Security.Principal.WindowsIdentity reasonably secure)

problem is system.security.principal.windowsidentity reas ...

C#拖放放大器;从列表框中下降到TreeView控件(C# Drag &amp; drop from listbox to treeview)

problem i have a winform with a listbox and a treeview. ...

C#检查远程服务器(C# Check Remote Server)

problem can anyone advise what the best way to check (usi ...

如何获取数字HTTP状态codeS在PowerShell中(How to obtain numeric HTTP status codes in PowerShell)

problem i know of a few good ways to build web clients in ...

反映从基类的私人领域(Reflecting a private field from a base class)

problem here is the structure: myclass : superclass2 su ...

除通过JavaScript来本地磁盘作为.png文件渲染SVG图像(Save svg image rendered by a javascript to local disk as .png file)

problem i am new to svg and not an advanced user of javas ...

单元测试System.Timers.Timer的(unit testing system.timers.timer)

problem i've been reading over the questions about unit t ...