2012-10-10 2 views
2

재료에 매우 큰 이미지 (약 16000x7000 픽셀)를로드하려고하는데 비동기 적으로로드하려고했습니다. 내 첫 번째 시도는 BitmapImage를로드 작업을 만든 후 재료로 사용했다 :큰 BitmapImage를 비동기 적으로로드하십시오.

var bmp = await System.Threading.Tasks.Task.Run(() => 
{ 
    BitmapImage img = new BitmapImage(new Uri(path)); 
    ImageBrush brush = new ImageBrush(img); 
    var material = new System.Windows.Media.Media3D.DiffuseMaterial(brush); 
    material.Freeze(); 
    return material; 
}); 
BackMaterial = bmp; 

하지만 내가 찾은 것은로드 메모리로 확장되지 않은 이미지가 재료가 표시 될 때까지이다 (ImageBrush를 직접 사용하면 동일합니다.)

내 UI가 정지되기 때문에 비트 맵을 강제로로드하고 디코딩하는 올바른 방법을 찾지 못했습니다. 나는 사진의 부하가 작업 내에서 수행되는 WriteableBitmap을 추가 할 수 있지만 그때는 메모리의 양이 사용되는 배로 해요 경우

var bmp = await System.Threading.Tasks.Task.Run(() => 
{ 
    BitmapImage img = new BitmapImage(new Uri(path)); 
    WriteableBitmap wbmp = new WriteableBitmap(img); 
    ImageBrush brush = new ImageBrush(wbmp); 
    var material = new System.Windows.Media.Media3D.DiffuseMaterial(brush); 
    material.Freeze(); 
    return material; 
}); 
BackMaterial = bmp; 

는 메모리에 두배없이 부하를 강제 할 수있는 방법이 있습니까. 디코더로로드하려고 시도했지만 메모리에 두 번로드됩니다.

var decoder = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.PreservePixelFormat, 
    BitmapCacheOption.None); 
var frame = decoder.Frames[0]; 
int stride = frame.PixelWidth * frame.Format.BitsPerPixel/8; 
byte[] lines = new byte[frame.PixelHeight * stride]; 
frame.CopyPixels(lines, stride, 0); 
var img = BitmapImage.Create(
    frame.PixelWidth, frame.PixelHeight, frame.DpiX, frame.DpiY, frame.Format, 
    frame.Palette, lines, stride); 
frame = null; 
lines = null; 

고마워!

+0

만 작업에 IMG를 만들어보십시오. – Paparazzi

+0

이미 시도했지만 BitmapImage가 즉시 생성 된 후 작업 완료 후 파일이로드되고 디코딩됩니다. 큰 그림을 디코딩하는 동안로드 애니메이션을 표시 할 수 있도록 작업에로드 및 디코드가 발생하도록합니다. – jmservera

+1

WPF 전문가는 아니지만 [이 스레드] (http://stackoverflow.com/questions/36748/asynchronously-loading-a-bitmapimage-in-c-sharp-using-wpf) 아이디어를 줄 것입니다. ? – Neolisk

답변

5

나는이 비동기 시나리오에 대해 잘 모르겠지만, 당신은 일반적으로 메모리에 즉시 캐시를 강제로 BitmapCacheOption.OnLoad을 설정합니다 :

var bmp = await System.Threading.Tasks.Task.Run(() => 
{ 
    BitmapImage img = new BitmapImage(); 
    img.BeginInit(); 
    img.CacheOption = BitmapCacheOption.OnLoad; 
    img.UriSource = new Uri(path); 
    img.EndInit(); 
    ImageBrush brush = new ImageBrush(img); 
    ... 
} 
관련 문제