我希望我的WPF應用程序成爲放置目標,並且我希望能夠從任何網頁拖動圖像。接收從Web頁面拖動到WPF窗口的圖像
從網頁中拖出圖像時,顯然它處於「DragImageBits」格式,該格式可以反序列化以鍵入ShDragImage。 (請參閱問題的底部瞭解我如何定義它)
如何將其轉換爲WPF圖像?
這是我目前的嘗試。 (如果有人知道正確的方式做desirialization,我所有的耳朵)
private void UserControl_Drop(object sender, System.Windows.DragEventArgs e)
{
string[] formats = data.GetFormats();
// DragImageBits
if (formats.Contains("DragImageBits"))
{
MemoryStream imageStream = data.GetData("DragImageBits") as MemoryStream;
// Now I'm deserializing this, the only way I know how
imageStream.Seek(0, SeekOrigin.Begin);
BinaryReader br = new 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 = new IntPtr(br.ReadInt32());
shDragImage.crColorKey = br.ReadInt32();
var systemDrawingBitmap = System.Drawing.Bitmap.FromHbitmap(shDragImage.hbmpDragImage);
在這一點上,我得到System.Runtime.InteropServices.ExternalException
類型的異常,與消息僅僅是。
有誰知道我應該做什麼?
這裏是支持類的定義。我從 this blog entry複製他們。
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Win32Point
{
public int x;
public int y;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Win32Size
{
public int cx;
public int cy;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct ShDragImage
{
public Win32Size sizeDragImage;
public Win32Point ptOffset;
public IntPtr hbmpDragImage;
public int crColorKey;
}
我有同樣的問題 - 我發現Firefox和IE9都提供了設備無關位圖(DIB)格式。在可用的情況下,不需要使用WebClient下載文件,因爲我們可以以熟悉的(位圖)格式訪問文件。 Firefox也暴露了'FileDrop'格式,但是在解析html和使用存檔格式的情況下,可能下載的對象可能不一定是圖像 – funseiki
這對我很有幫助。感謝發佈。正則表達式無法匹配許多有效的圖像鏈接。我發現@「] + src =」「([^」「] *)」「」效果稍好一些。 –
你是一個真正的救星。如果像我這樣的其他人想要直接從谷歌圖像拖動圖像,請檢查UriString是否以「data」開頭,這些字符串包含已經存在的數據,不應該下載(來自[此問題](http ://stackoverflow.com/q/25748858/3410196)) –