CODEKILLER

반응형

▶일반적인 Screen Capture를 하면 Application 상단에 Topmost로 올라가 있는 화면까지 캡쳐가 됩니다.

이러한 것을 방지하기 위해 RenderTargetBitmap를 이용하여 캡쳐하는 예제입니다.

public static void ScreenCapture(FrameworkElement fr, string outFilePath)
{
    // System.Windows.Media.VisualTreeHelper를 이용하여 FrameworkElement의 영역을 가져옵니다.
    Rect bounds = VisualTreeHelper.GetDescendantBounds(fr);

    // 대상의 좌표를 렌더링 대상 디바이스로 변환하는 데 사용할 수 있는 행렬정보를 가져옵니다.
    Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
    double dx = m.M11; // notice it's divided by 96 already
    double dy = m.M22; // notice it's divided by 96 already

    double xDpi = 96d / dx;
    double yDpi = 96d / dy;

    // RenderTargetBitmap으로 targetBitmap을 생성합니다.
    var targetBitmap = new RenderTargetBitmap((int)(fr.ActualWidth), (int)(fr.ActualHeight), xDpi, yDpi, PixelFormats.Pbgra32);
    targetBitmap.Render(fr);

    // PngBitmapEncoder를 이용하여 frame을 추가합니다.
    PngBitmapEncoder enc = new PngBitmapEncoder();
    enc.Frames.Add(BitmapFrame.Create(targetBitmap));

    // 파일저장합니다.
    using (var file = File.OpenWrite(outFilePath))
    {
        enc.Save(file);
        
        // 메모리스트림을 사용할때.
        //enc.Save(Stream);
    }

    // bitmap을 해제합니다.
    targetBitmap.Clear();
}

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band