Chcę, aby moja aplikacja WPF była celem upuszczania i chcę mieć możliwość przeciągania obrazu z dowolnej strony internetowej.Odbieranie obrazu przeciągniętego ze strony sieci Web do okna WPF
Kiedy obraz jest przeciągany ze strony internetowej, widocznie znajduje się on w formacie "DragImageBits", który można przekształcić do postaci ShDragImage. (Zobacz podsumowanie tego, jak je zdefiniowałem)
Jak przekonwertować to na obraz WPF?
Oto moja obecna próba. (Jeśli ktoś wie jak poprawnie wykonaj desirialization, jestem wszystkich uszy)
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);
W tym momencie pojawia się wyjątek typu System.Runtime.InteropServices.ExternalException
z komunikatu po prostu będąc .
Czy ktoś wie, co powinienem robić?
A oto definicje klas pomocniczych. Skopiowałem je z 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;
}
Mam ten sam problem - odkryłem, że zarówno Firefox, jak i IE9 udostępniają również format niezależnej od urządzenia bitmapy (DIB). W przypadku, gdy jest to dostępne, nie ma potrzeby używania programu WebClient do pobrania pliku, ponieważ mamy dostęp do pliku w znanym formacie (bitmapowym). Firefox wyświetla również format "FileDrop", ale w przypadku parsowania html i używania formatu filedrop, możliwe jest pobieranie obiektów, które niekoniecznie muszą być obrazami. – funseiki
To mi bardzo pomaga. Dzięki za publikację. Wyrażenia regularne nie pasują do wielu poprawnych linków graficznych. Znalazłem @ "
] + src =" "([^" "] *)" "" działa trochę lepiej. –
Jesteś prawdziwym ratownikiem. Jeśli inni ludzie, tacy jak ja, chcą przeciągać obrazy prosto z obrazów google, sprawdź w UriString, czy zaczyna się od "danych", ciągi te zawierają już dane i nie powinny być pobierane (z [to pytanie] (http : //stackoverflow.com/q/25748858/3410196)) –