.net 异步加载大型位图图像
我尝试将一个非常大的图像(大约16000x7000像素)加载到材质中,并尝试异步加载。我的第一次尝试是创建一个加载BitmapImage的任务,然后将其用于材质:.net 异步加载大型位图图像,.net,wpf,async-await,.net,Wpf,Async Await,我尝试将一个非常大的图像(大约16000x7000像素)加载到材质中,并尝试异步加载。我的第一次尝试是创建一个加载BitmapImage的任务,然后将其用于材质: var bmp = await System.Threading.Tasks.Task.Run(() => { BitmapImage img = new BitmapImage(new Uri(path)); ImageBrush brush = new ImageBrush(img); var mat
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;
谢谢 我不确定这个异步场景,但您通常会设置为强制立即缓存到内存:
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);
...
}
请尝试仅在任务中创建img。我已经尝试过,会立即创建BitmapImage,然后在任务完成后加载并解码该文件。我希望加载和解码发生在任务中,以允许我在解码大图片时显示加载动画。我不是WPF大师,但可能会给你一些想法?谢谢,我尝试过,但没有在我的情况下工作。