Mam instancję System.Drawing.Bitmap
i chciałbym udostępnić ją mojej aplikacji WPF w formie System.Windows.Media.Imaging.BitmapImage
.
Jakie byłoby najlepsze podejście do tego?
Co powiesz na ładowanie go z MemoryStream?
using(MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, ImageFormat.Png);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
}
ms.Seek(0, SeekOrigin.Begin);
przed ustawieniembi.StreamSource
. Używam .NET 4.0.Dzięki Hallgrim, oto kod, który skończyłem z:
Skończyło się też wiązaniem z BitmapSource zamiast BitmapImage, jak w moim pierwotnym pytaniu
źródło
DeleteObject
ten uchwyt.BitmapSizeOptions.FromEmptyOptions()
i to działa dobrze w mojej sytuacji.Wiem, że odpowiedziano na to pytanie, ale oto kilka metod rozszerzenia (dla .NET 3.0+), które dokonują konwersji. :)
i klasa NativeMethods (aby uspokoić FxCop)
źródło
Zajęło mi trochę czasu, aby konwersja działała w obie strony, więc oto dwie metody rozszerzenia, które wymyśliłem:
źródło
Najłatwiej jest, jeśli bitmapę WPF można utworzyć bezpośrednio z pliku.
W przeciwnym razie będziesz musiał użyć System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap.
źródło
źródło
Możesz po prostu udostępnić pixeldata między obiema przestrzeniami nazw (Media i Drawing), pisząc niestandardowe źródło bitmaps. Konwersja nastąpi natychmiast i nie zostanie przydzielona dodatkowa pamięć. Jeśli nie chcesz jawnie tworzyć kopii mapy bitowej, jest to metoda, którą chcesz.
źródło
Pracuję u dostawcy obrazowania i napisałem adapter do WPF do naszego formatu obrazu, który jest podobny do System.Drawing.Bitmap.
Napisałem ten KB, aby wyjaśnić to naszym klientom:
http://www.atalasoft.com/kb/article.aspx?id=10156
I jest tam kod, który to robi. Musisz zastąpić AtalaImage Bitmapą i zrobić równoważną rzecz, którą my robimy - powinno być całkiem proste.
źródło
Moje spojrzenie na to zbudowane z wielu zasobów. https://stackoverflow.com/a/7035036 https://stackoverflow.com/a/1470182/360211
źródło
Przyszedłem do tego pytania, ponieważ próbowałem zrobić to samo, ale w moim przypadku Bitmapa pochodzi z zasobu / pliku. Znalazłem najlepsze rozwiązanie, jak opisano w poniższym linku:
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.aspx
źródło