Загрузите WPF BitmapImage из системы. Рисование. Битовый массив

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

216
задан Thomas Freudenberg 17 July 2012 в 23:18
поделиться

5 ответов

Благодаря Hallgrim вот код, с которым я закончил:

ScreenCapture = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
   bmp.GetHbitmap(), 
   IntPtr.Zero, 
   System.Windows.Int32Rect.Empty, 
   BitmapSizeOptions.FromWidthAndHeight(width, height));

я также закончил тем, что связал с BitmapSource вместо BitmapImage как в моем исходном вопросе

80
ответ дан devdigital 23 November 2019 в 04:18
поделиться

Самая легкая вещь состоит в том, если можно сделать битовый массив WPF из файла непосредственно.

Иначе необходимо будет использовать Систему. Windows. Interop. Обработка изображений. CreateBitmapSourceFromHBitmap.

10
ответ дан Hallgrim 23 November 2019 в 04:18
поделиться

Я работаю в поставщике обработки изображений и записал адаптер для WPF к нашему формату изображения, который подобен Системе. Рисование. Битовый массив.

я записал этого КБ, чтобы объяснить его нашим клиентам:

http://www.atalasoft.com/kb/article.aspx?id=10156

И существует код там, который делает это. Необходимо заменить AtalaImage Битовым массивом и сделать эквивалентную вещь, которую мы делаем - это должно быть довольно просто.

5
ответ дан Lou Franco 23 November 2019 в 04:18
поделиться

Как насчет загрузки из 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();
}
259
ответ дан 23 November 2019 в 04:18
поделиться

Я знаю, что на это уже был дан ответ, но вот несколько методов расширения (для .NET 3.0+), которые выполняют преобразование. :)

        /// <summary>
    /// Converts a <see cref="System.Drawing.Image"/> into a WPF <see cref="BitmapSource"/>.
    /// </summary>
    /// <param name="source">The source image.</param>
    /// <returns>A BitmapSource</returns>
    public static BitmapSource ToBitmapSource(this System.Drawing.Image source)
    {
        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(source);

        var bitSrc = bitmap.ToBitmapSource();

        bitmap.Dispose();
        bitmap = null;

        return bitSrc;
    }

    /// <summary>
    /// Converts a <see cref="System.Drawing.Bitmap"/> into a WPF <see cref="BitmapSource"/>.
    /// </summary>
    /// <remarks>Uses GDI to do the conversion. Hence the call to the marshalled DeleteObject.
    /// </remarks>
    /// <param name="source">The source bitmap.</param>
    /// <returns>A BitmapSource</returns>
    public static BitmapSource ToBitmapSource(this System.Drawing.Bitmap source)
    {
        BitmapSource bitSrc = null;

        var hBitmap = source.GetHbitmap();

        try
        {
            bitSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }
        catch (Win32Exception)
        {
            bitSrc = null;
        }
        finally
        {
            NativeMethods.DeleteObject(hBitmap);
        }

        return bitSrc;
    }

и класс NativeMethods (чтобы успокоить FxCop)

    /// <summary>
/// FxCop requires all Marshalled functions to be in a class called NativeMethods.
/// </summary>
internal static class NativeMethods
{
    [DllImport("gdi32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool DeleteObject(IntPtr hObject);
}
53
ответ дан 23 November 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: