2010-07-06 2 views
1

저는 이미지에 WPF 캔버스를 렌더링하고 클립 보드에 고정 시켰습니다.WPF 캔버스가있는 Clipboard.SetImage는 큰 이미지를 위해 클립 보드를 비 웁니다.

캔버스가 작 으면 (< 900px 스퀘어) 모두 정상적으로 작동합니다.

나는 (3000 + PX 광장) 더 큰 캔버스를 클립 보드는 임계 값 크기가있는 경우

var transform = canvas.LayoutTransform; 
canvas.LayoutTransform = null; 

var size = new Size(canvas.Width, canvas.Height); 

canvas.Measure(size); 
canvas.Arrange(new Rect(size)); 

var renderBitmap = new RenderTargetBitmap((int) size.Width, (int) size.Height, 96d, 96d, PixelFormats.Pbgra32); 
renderBitmap.Render(canvas); 

canvas.LayoutTransform = transform; 

Clipboard.SetImage(renderBitmap); 

은 내가 찾은 적이 없다 (포토샵/워드 등 비활성화 붙여 넣기 옵션) 빈입니다 이것이 깨지게한다. 세드릭

3140 X 1903

나던 일, 3140 X 317

합니까?

감사

답변

8

그것은 클립 보드에 이미지를 저장하기 위해, 이미지가 자동으로 여러 가지 형식의 압축되지 않은 비트 맵 (BMP, DIB, 등)로 변환되는 것으로 나타났다. 따라서 압축되지 않은 40MB (8 비트 RGBA)를 차지하는 10MP 이미지가있는 경우 클립 보드에 저장하는 데 200MB의 메모리가 필요할 수 있으므로 다른 포맷 중 하나를 사용하려는 경우가 있습니다.

할 수있는 일은 많은 오버 헤드없이 직접 클립 보드에 놓는 것입니다. 당신이 하나 false로 설정 true 인스턴스 모두와 함께 SetImage 기능의 자신의 버전을 만들 경우

public static void SetImage(Image image) 
{ 
    if (image == null) 
    { 
     throw new ArgumentNullException("image"); 
    } 
    IDataObject data = new DataObject(); 
    data.SetData(DataFormats.Bitmap, true, image); // true means autoconvert 
    Clipboard.SetDataObject(data, true); // true means copy 
} 

하면, 당신은 할 수 있습니다 : 당신이 반사경을 사용하는 경우 Clipboard.SetImage이 보이는 것을 확인할 수 있습니다 불필요한 복사를 극복하고 더 큰 이미지를 클립 보드에 넣을 수 있습니다.

관련 문제