在 WPF 中加载多个图像时防止内存膨胀

2023-12-02

我有一个非常简单的 WPF 应用程序,用于预览任何给定文件夹中的图像,一次一张图像。您可以将其视为 Windows Image Viewer 的克隆。该应用程序有一个 PreviewKeyUp 事件,用于在按下左箭头或右箭头键时加载文件夹中的上一张或下一张图像。

<Grid>
    <Image x:Name="CurrentImage" />
</Grid>

private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.Left:
            DecreaseIndex();
            break;
        case Key.Right:
            IncreaseIndex();
            break;
    }

    var currentFile = GetCurrentFile();
    CurrentImage.Source = new BitmapImage(new Uri(currentFile));
}

我试图解决的问题是,加载多个图像时会出现大量内存膨胀,直到发生垃圾收集。您可以在我拍摄的应用程序内存使用情况的屏幕截图中看到这一点。在垃圾回收发生之前,其大小超过 300 MB 的情况并不少见。

screenshot

我尝试将图像包装在 using 语句中,但这不起作用,因为 BitmapImage 没有实现 IDisposable。

using (var image = new BitmapImage(new Uri(currentFile)))
{
    CurrentImage.Source = image;
}

将多个图像加载到应用程序中时,如何防止内存膨胀?


当您说预览时,您可能不需要完整的图像尺寸。所以除了打电话Freeze,您还可以设置 BitmapImage 的DecodePixelWidth or DecodePixelHeight财产。

我还建议直接从FileStream而不是Uri。请注意,在线文档UriCachePolicy说它是

...表示来自 HTTP 源的图像的缓存策略的值。

因此它可能不适用于本地文件 Uris。

为了安全起见,你可以这样做:

var image = new BitmapImage();

using (var stream = new FileStream(currentFile, FileMode.Open, FileAccess.Read))
{
    image.BeginInit();
    image.DecodePixelWidth = 100;
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}

image.Freeze();
CurrentImage.Source = image;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WPF 中加载多个图像时防止内存膨胀 的相关文章

  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • boost变体简单调用常用方法

    我有两个指针 只能设置其中之一 所以我正在考虑使用 boost variant 例如 boost variant
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • 从动态服务器中抓取 html 列表数据

    哈喽大家好 抱歉提出转储问题 这是我最后的手段 我发誓我尝试了无数其他 Stackoverflow 问题 不同的框架等 但这些似乎没有帮助 我有以下问题 一个网站显示一个数据列表 前面有大量的 div li span 等标签 它是一个很大的
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 向量和常量

    考虑一下这个 void f vector
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 我使用 tm/mktime 是否错误,如果没有,有解决方法吗?

    我认为下面的程序应该输出从公元 1 年到 1970 年每年第一天到 1970 年的秒数 前面是time t在编译它的系统上 CHAR BIT是一个宏 所以我认为你不能只是复制编译后的可执行文件并假设它是正确的 尽管实际上一切都使用 8 位c
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • MFC CImage alpha 混合出错

    我必须在图片控件上呈现由两个 PNG 文件组成的图像 其中顶部图像在某些位置具有透明像素 结果应该是plotter png 与 bar png 顶部重叠显示为 注意条上奇怪的白色轮廓 但应该是 我为它编写的代码很简单 CImage imag
  • 如何使用 MVVM 更改数据网格或列表视图中的内容

    我有一个 MainWindowViewModel DataContext 它公开不同的 ObservableCollections 带有 INotifyProperty 的 poco 对象的视图模型 从组合框中选择一个值后 我想单击一个加载
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • 在 C++11 中设置 std::thread 优先级的可移植方法

    在后 C 11 世界中设置 std thread 实例的优先级的正确方法是什么 是否有一种至少在 Windows 和 POSIX Linux 环境中有效的可移植方法 或者是获取句柄并使用可用于特定操作系统的任何本机调用的问题 无法通过 C
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 如何使用PHP CURL绕过跨域

    我需要 PHP 将参数从一个域提交到另一个域 JavaScript 不适合我的情况 我现在尝试将 CURL 与 PHP 结合使用 但未能成功绕过跨域 从domain A 我有一个包含以下 PHP 和 CURL 脚本的页面 if iscurl
  • 错误 - 方案“pkg/runtime/scheme.go:100”中的版本“authentication.gke.io/v2alpha1”没有注册任何种类“ClientConfig”

    下面是代码 谷歌云中的 kubernetes 集群 URL 无效 10 xx xx xx package main import fmt k8s io client go kubernetes k8s io client go tools
  • 散点图上的不同颜色编码和标记

    我想创建一个seaborn散点图 使用以下数据框 df pd DataFrame A 1 2 3 4 B 2 4 6 8 C y y n n D 1 1 2 2 在我的图表中A应该是x variable and B the y variab
  • Flutter 未在发布的 apk 上在真实设备中渲染 UI

    我一直在为我的应用程序编写 ui 在调试模式下构建时没问题 但是当我构建发布 apk 时 用户界面变得模糊 并且文本不显示 小部件的渲染不符合预期 并且它们的大小渲染不正确 我在不同的手机上检查过 但结果是一样的 是我的代码有问题还是flu
  • 通过排除导航和 Chrome 内容从 HTML 页面中提取纯内容/文本

    我正在爬取新闻网站 想要提取新闻标题 新闻摘要 第一段 等 我插入了 webkit 解析器代码 以树状方式轻松导航网页 为了消除导航和其他非新闻内容 我采用文章的文本版本 减去 html 标签 webkit 提供了相同的 api 然后我运行
  • Codeigniter 显示错误:未选择数据库

    我正在使用 Codeigniter DBForge 类在该数据库中创建数据库和表 这是代码 if this gt dbforge gt create database new db fields array blog id gt array
  • 对 sprintf 格式 '-Flag 的跨平台支持

    The 单一 UNIX 规范版本 2指定sprintf的格式 将行为标记为 The integer portion of the result of a decimal conversion i d u f g or G will be f
  • 通过非制表符分隔符实现非结构化 XML?

    我们有一个复杂的 XML 结构 而且非常大 gt 500 MB 该结构的XSD为 This XSD 众所周知 这是一个复杂的问题 由于大小或非制表符分隔符结构 我无法将其转换为可读性更好的演示文稿 我想通过 C 读取这个文件并搜索药物名称
  • SQL Server LAG() 函数计算行之间的差异

    我是 SQL Server 新手 对 lag 函数有一些疑问 我必须计算两个用户活动之间的平均距离 以天为单位 然后 我必须对所有用户进行分组 计算每个用户的行之间的所有日期差异 最后选择该组的平均值 Just to be clear I
  • CUDA 中的全局内存与动态全局内存分配

    我有一个 CUDA v5 5 应用程序需要使用全局内存 理想情况下 我更喜欢使用常量内存 但我已经耗尽了常量内存 溢出的内容必须放置在全局内存中 我还有一些需要偶尔写入的变量 在 GPU 上进行一些缩减操作之后 我将其放置在全局内存中 为了
  • 请求另一个域/服务器上的内容

    我正在尝试请求位于另一个域 服务器上的数据 但是当我尝试发送请求时遇到异常 var request new XMLHttpRequest request open GET http www w3schools com ajax cd cat
  • nginx proxy_pass 与socks5 代理?

    我正在尝试设置 proxy pass 同时也使用袜子5代理 我可以使用以下命令通过curl 访问我的支持服务 curl x socks5h localhost 8001 svo dev null I http abcd 1234 8000
  • 如何使用 Ruby 找到目录中最近修改的文件夹?

    如何使用 Ruby 在目录中找到最近修改的文件夹 不是文件 Dir glob a directory max by f File mtime f Dir glob a directory 返回中的所有目录名称a directory 作为字符
  • 警告消息澄清

    我在用着SNPassoc用于查找数据 SNP 和连续变量结果之间关联的 R 包 我进行了分析并得到了结果 但是 我收到警告消息 Warning in terms formula formula data data varlist has c
  • 使用 dplyr 将唯一 ID 分配给组内的不同值

    问题 我需要为具有两级分组的数据创建一个唯一的 ID 字段 在这里的示例代码中 它是Emp and Color ID 的结构需要如下 Emp 每个的唯一编号Color 重复的序列号Colors 这些值由句点分隔 示例数据 dat lt da
  • 当我使用 GZIPOutputStream 将文件发布到 servlet 时文件已损坏

    我尝试修改 BalusC优秀教程here发送 gzip 压缩文件 这是一个工作java类 import java io File import java io FileInputStream import java io FileNotFo
  • 如何在 Mercurial 队列中仅推送一个特定补丁?

    这就是我所做的 hg init hg qnew m p1 p1 patch some changes hg qrefresh hg qpop hg qnew m p2 p2 patch some changes hg qrefresh hg
  • Angular 正则表达式测试输入的 ng-pattern 验证不一致

    我对我的输入进行了 ng 模式验证 ng pattern g 这并不是每次都起作用 并表现出非常奇怪的行为 See plnkr ngMessage 仅在我输入的每两个字符上显示 但控制台正确评估正则表达式测试 我在浏览器开发工具中的 Ang
  • PHPWord 转 PDF 无法加载库

    我一整天都在努力让它发挥作用 现在我可以将文档另存为 docx 文件 但我希望能够将文档另存为 PDF 我已尝试使用 DOMPDF 和 TCPDF 但我不断收到错误 无法加载 PDF 库 我确认路径是正确的 我错过了什么吗 感谢您的帮助 r
  • 在 WPF 中加载多个图像时防止内存膨胀

    我有一个非常简单的 WPF 应用程序 用于预览任何给定文件夹中的图像 一次一张图像 您可以将其视为 Windows Image Viewer 的克隆 该应用程序有一个 PreviewKeyUp 事件 用于在按下左箭头或右箭头键时加载文件夹中