Quiero que mi aplicación WPF sea un destino de bajada, y quiero poder arrastrar una imagen desde cualquier página web.Recibir una imagen arrastrada de la página web a la ventana de WPF
Cuando se arrastra una imagen desde una página web, aparentemente está en el formato "DragImageBits", que se puede deserializar para escribir ShDragImage. (Consulte la parte inferior de la pregunta para ver cómo lo he definido)
¿Cómo convierto esto en una imagen WPF?
Aquí está mi intento actual. (Si alguien sabe la forma correcta de hacer el desirialization, soy todo oídos)
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);
En este punto me sale una excepción de tipo System.Runtime.InteropServices.ExternalException
, con el mensaje simple hecho de estar .
¿Alguien sabe lo que debería hacer?
Y aquí están las definiciones de las clases de soporte. Los copié desde 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;
}
estoy teniendo el mismo problema: descubrí que tanto Firefox como IE9 también ofrecen un formato de mapa de bits independiente del dispositivo (DIB). En el caso de que esté disponible, no es necesario usar WebClient para descargar el archivo, ya que tenemos acceso al archivo en un formato familiar (mapa de bits). Firefox también expone un formato 'FileDrop', pero en el caso de analizar el html y usar el formato de archivo de archivo, es posible descargar objetos que pueden no ser necesariamente imágenes – funseiki
Esto me ayuda mucho. Gracias por publicar. La expresión regular no puede coincidir con muchos enlaces de imagen válidos. He encontrado @ "] + src =" "([^" "] *)" "" funciona un poco mejor. –
Eres un verdadero salvavidas. Si otras personas como yo quieren arrastrar imágenes directamente desde las imágenes de Google, compruebe el UriString si comienza con '" datos "', esas cadenas ya contienen los datos y no deben descargarse (de [esta pregunta] (http : //stackoverflow.com/q/25748858/3410196)) –