Как преобразовать растровое изображение из памяти в ImageSource, а затем установить его в качестве фона для холста, чтобы рисовать поверх него? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь сделать скриншот всего рабочего стола, сохранить его в растровое изображение, преобразовать растровое изображение в ImageSource и установить этот ImageSource в качестве фона для Canvas, на котором я собираюсь рисовать прозрачные прямоугольники.

  1. Я пытался добавить изображение непосредственно в Canvas.
  2. Я пытался добавить изображение в качестве фона для Canvas.
  3. Я даже пытался добавить изображение в качестве фона длясоздать прозрачный холст, ничего не получилось.

Я начал с снятия рабочего стола и конвертировал изображение:

Bitmap bitmapImage = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
myNewImageSource = Miscellaneous.ImageSourceFromBitmap(bitmapImage);

И это функция преобразования, найденная на другомнить:

[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteObject([In] IntPtr hObject);

public static System.Windows.Media.ImageSource ImageSourceFromBitmap(Bitmap bmp)
{
    var handle = bmp.GetHbitmap();
    try
    {
        return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
    }
    finally { DeleteObject(handle); }
}
  1. Установка изображения напрямую:
AddImageToCanvas(0, 0, new System.Windows.Controls.Image() { Source = myNewImageSource });

public void AddImageToCanvas(Int32 x, Int32 y, System.Windows.Controls.Image z)
{
    imageHolder.Children.Add(z);
    Canvas.SetLeft(z, x);
    Canvas.SetTop(z, y);
}
Добавление изображения в качестве фона для холста:
imageHolder.Background = new ImageBrush(){ ImageSource = myNewImageSource };
Установка изображения в качестве фона формы и создание прозрачного холста:
Background = new ImageBrush(){ ImageSource = myNewImageSource }
imageHolder.Background = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 0, 0)) { Opacity = 0 }
//I tried making the background transparent by both setting the Opacity to 0 and trying with argb to set the alpha value to 0, neither worked.

Я ожидаю увидеть фрагмент моего рабочего стола в качестве фона для холста, но ничего не происходит иЯ не получаю ошибки. Иногда я получаю полностью черное окно.

1 Ответ

0 голосов
/ 15 октября 2019

Для тех, кому это нужно, я забыл сделать снимок экрана. Вот мой код для этого:

Graphics g = Graphics.FromImage(bitmapImage);
g.CopyFromScreen(0, 0, 0, 0, bitmapImage.Size);
...