재료에 매우 큰 이미지 (약 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;
고마워!
만 작업에 IMG를 만들어보십시오. – Paparazzi
이미 시도했지만 BitmapImage가 즉시 생성 된 후 작업 완료 후 파일이로드되고 디코딩됩니다. 큰 그림을 디코딩하는 동안로드 애니메이션을 표시 할 수 있도록 작업에로드 및 디코드가 발생하도록합니다. – jmservera
WPF 전문가는 아니지만 [이 스레드] (http://stackoverflow.com/questions/36748/asynchronously-loading-a-bitmapimage-in-c-sharp-using-wpf) 아이디어를 줄 것입니다. ? – Neolisk