독개

[Avalonia] 화면캡쳐 with Wpf

by #독개#

WPF에서는 System.Drawing.dll이 Winform과 쓰이는게 다르다

그래서 기본적으로 사용이 불가능한데

Nuget에서 System.Drawing.Common 패키지를 설치해주면 동일하게 사용가능하다

 

WPF

// 화면캡쳐
private void btnScreenCapture01_Click(object sender, RoutedEventArgs e)
{
    ScreenShot(DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".png");
}
 
private void ScreenShot(string filename)
{
    // 주화면의 크기 정보 읽기
    int width = (int)SystemParameters.PrimaryScreenWidth;
    int height = (int)SystemParameters.PrimaryScreenHeight;
 
    // 화면 크기만큼의 Bitmap 생성
    // 0,0에서 width,height만큼 가져온다
    using (Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
    {
        // Bitmap 이미지 변경을 위해 Graphics 객체 생성
        using (Graphics gr = Graphics.FromImage(bmp))
        {
            // 화면을 그대로 카피해서 Bitmap 메모리에 저장
            gr.CopyFromScreen(0, 0, 0, 0, bmp.Size);
        }
        // Bitmap 데이타를 파일로 저장
        bmp.Save(filename, ImageFormat.Png);
    }
}
응용 UI에 뿌려주기
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;

namespace SimcityBuilditMacro
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            // 캡쳐
            // 비교
        }

        private void BtnCapture_Click(object sender, RoutedEventArgs e)
        {
            ScreenCapture();
        }

        public void ScreenCapture()
        {
            // 주화면의 크기 정보 읽기
            int width = (int)SystemParameters.PrimaryScreenWidth;
            int height = (int)SystemParameters.PrimaryScreenHeight;

            // 화면 크기만큼의 Bitmap 생성
            using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
            {
                // Bitmap 이미지 변경을 위해 Graphics 객체 생성
                using (Graphics gr = Graphics.FromImage(bmp))
                {
                    // 화면을 그대로 카피해서 Bitmap 메모리에 저장
                    gr.CopyFromScreen(0, 0, 0, 0, bmp.Size);
                }
                // Bitmap 데이타를 파일로 저장
                //bmp.Save("test.png", ImageFormat.Png);
                
                // Bitmap 2 BitmapImage
                // Image에 캡처한 이미지를 뿌려주기 위해 Bitmap을 BitmapImage로 변환한다.
                using (MemoryStream memory = new MemoryStream())
                {
                    bmp.Save(memory, ImageFormat.Bmp);
                    memory.Position = 0;
                    BitmapImage bitmapimage = new BitmapImage();
                    bitmapimage.BeginInit();
                    bitmapimage.StreamSource = memory;
                    bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapimage.EndInit();

                    imgCapture.Source = bitmapimage;
                }
            }
        }
    }
}

Avalonia

아발로니아에서도 동일하게 모두 작동하나 전체화면의 크기 정보를 읽어오는

   // 주화면의 크기 정보 읽기
    int width = (int)SystemParameters.PrimaryScreenWidth;
    int height = (int)SystemParameters.PrimaryScreenHeight;

이부분이 안된다

방법을 한번 찾아봐야 할것 같다

블로그의 정보

독한 개발자

#독개#

활동하기