2010-06-04 4 views
4

내 WPF 응용 프로그램의 일부로 JPG를 만들려고합니다. 스크린 샷과 마찬가지로 개별 UIElement 만 가능합니다. 나는 여기에서 시작했다 : http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/WPF Screenshot C#을 사용하는 UIElement의 JPG

그의 확장 방법을 사용하고 있는데, 이것은 필수적으로 UIElement.GetJpgImage()으로 바이트 []를 얻을 수있게한다. 그런 다음 파일 스트림을 사용하여 JPG 이미지에 기록 할 수 있습니다. 전체 창에서 JPG를 만들면 멋지게 보입니다. 그러나 이것은 사용자가 보는 것을 캡처하기 때문에 이상적이지 않습니다. 스크롤 뷰어 때문에 표시되지 않거나 부모가 작은 크기로 애니메이션 되었기 때문에 표시되지 않습니다. 나는 말의 "스크린 샷"내가 레이아웃에 사용하는 그리드 걸릴 경우

는 : alt text http://img697.imageshack.us/img697/4233/fullscreenshot2.jpg

을 나는 검은 색이 쓰레기를 얻을. 나는 그것을 원하지 않는다. 또한 애니메이션을 사용하여이 격자의 높이를 축소 한 경우 아무 것도 얻을 수 없습니다. 그것들은 실제로 템플리트 화 된 체크 박스이고, 그 위에 검정색 텍스트가 있어야하며 그리드의 배경은 흰색이어야합니다. 우리가 검은 색을 얻고, 거기에

public static byte[] GetJpgImage(this UIElement source, double scale, int quality) 
{ 
    double actualHeight = source.RenderSize.Height; 
    double actualWidth = source.RenderSize.Width; 

    double renderHeight = actualHeight * scale; 
    double renderWidth = actualWidth * scale; 

    RenderTargetBitmap renderTarget = new RenderTargetBitmap((int) renderWidth, (int) renderHeight, 96, 96, PixelFormats.Pbgra32); 
    VisualBrush sourceBrush = new VisualBrush(source); 

    DrawingVisual drawingVisual = new DrawingVisual(); 
    DrawingContext drawingContext = drawingVisual.RenderOpen(); 

    using (drawingContext) 
    { 
     drawingContext.PushTransform(new ScaleTransform(scale, scale)); 
     drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 
    } 
    renderTarget.Render(drawingVisual); 

    JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder(); 
    jpgEncoder.QualityLevel = quality; 
    jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget)); 

    Byte[] _imageArray; 

    using (MemoryStream outputStream = new MemoryStream()) 
    { 
     jpgEncoder.Save(outputStream); 
     _imageArray = outputStream.ToArray(); 
    } 

    return _imageArray; 
} 

어딘가에 : 여기에 다른 사람이 파일 스트림에 기록됩니다 바이트 [] 배열을 반환 쓴 코드입니다. 어떤 통찰력?

편집 : 그리드의 배경 속성을 흰색으로 설정하면 스크린 샷이 예상대로 나옵니다. 그러나 스크린 샷을 찍는 데 필요한 모든 것을 배경으로 설정할 수는 없습니다.

답변

5

검은 색 배경은이 과정에서 아무 것도 설정되지 않은 바이트 배열 부분을 나타낼 것이라고 생각합니다. 배열의 처음 0은 검은 색으로 표시됩니다.

이 문제를 피하려면 0xFF (byte.MaxValue) 값을 사용하여 배열을 초기화하는 것이 좋습니다.

업데이트 :

가까이이보고에서

, 나는 당신이 UI 요소를 렌더링하기 전에 이미지에 흰색 사각형을 그립니다한다고 생각합니다. 어쨌든 일해야합니다. 코드

drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 

의이 행이 바로 XAML에서 요소의 배경을 설정 한 일이

drawingContext.DrawRectangle(Brushes.White, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 
+0

"_imageArray = outputStream.ToArray();"로 배열을 채울 때 어떻게 할 수 있습니까? –

+0

검은 색이 아닌 투명한 검정색 (PNG로 저장하여 신속하게 확인할 수 있음)이라고 생각합니다. 따라서 원하는 배경 위에 이미지를 그릴 수 있으며 결과 이미지를 저장할 수 있습니다. – max

+0

is가 @max가 나타내는 것처럼 투명하게 검은 색이면, 알파 채널에 0이있는 각 픽셀의 색을 설정하는 바이트 배열을 스캔 할 수 있습니다. –

0

불행하게도 유일하게 같은 것을 넣어 직전

. 나는 이것을하고 싶지 않았지만,이 경우에해야 할 일이라고 생각합니다. 어쨌든 제안에 감사드립니다.

관련 문제