gpt4 book ai didi

.net - 异步加载大型 BitmapImage

转载 作者:行者123 更新时间:2023-12-02 22:26:59 27 4
gpt4 key购买 nike

我正在尝试将非常大的图像(大约 16000x7000 像素)加载到 Material 中,并且尝试异步加载它。我的第一个尝试是创建一个加载 BitmapImage 的任务,然后将其用于 Material 中:

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;

但我发现,在 Material 显示之前,图像不会加载并扩展到内存中(如果我直接使用 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;

谢谢!

最佳答案

我不确定这种异步情况,但您通常会设置 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);
...
}

关于.net - 异步加载大型 BitmapImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com