c# - Wpf 共享图像内存
问题描述
我想优化我的 WPF 应用程序中的内存使用情况。我想从磁盘加载一个 jpg 图像并显示它的真实大小。然后我想显示从磁盘加载的原始图像的 5 个裁剪正方形部分。(对任何图像都没有调整大小)。我想通过一次加载原始图像并在图像控件之间共享该数据来完成所有这一切,这样就不会浪费内存并且所有控件都从同一内存位置获取数据。
我尝试使用内存流对象,但最终由于位图和位图图像之间的一些转换,我最终复制了数据。
解决方案
我在这里找到了一种从 BitmapImage 裁剪图像的有趣方法,我认为它可以解决您的问题。这样做,您可以只使用一个显示所有图像BitmapImage
在您的 xaml 中,您的全分辨率图像将只是一个常规图像元素,但您裁剪的图像将是一个矩形元素,使用带有特定视图框的图像画笔。只需使用您想要的裁剪图像的高度和宽度定义矩形,然后将视图框定义为“xy 宽度高度”(在我的示例中为“10 20 100 200”)并记住 x 从 0 开始left 并且是向右移动的正数,y 从 0 开始表示顶部并且是正数向下移动。
<Image Source="{Binding Image}"></Image>
<Rectangle Height="200" Width="100">
<Rectangle.Fill>
<ImageBrush ViewboxUnits="Absolute" Viewbox="10,20,100,200" ImageSource="{Binding Image}"></ImageBrush>
</Rectangle.Fill>
</Rectangle>
请注意,Image 和 ImageBrush 的绑定是相同的,因此您只需定义Image
一次,并且在两个元素中都使用它。
推荐阅读
- sql - 优化查询以检查计数是否 = 子选择中所有匹配项的计数
- powershell - PowerShell 子字符串“字符串长度之外的索引”
- eclipse-plugin - Eclipse 的 ADT 插件在 2020 年仍然有效吗?
- javascript - 创建一个列表元素并使用用户的输入为它着色(使用 javascript)
- c# - C# HTML 表的输出格式不正确
- powershell - 仅当路径有空格时,使用 Raw 非参数获取内容错误
- javascript - 即使默认选中无线电,表单提交也会显示错误
- c# - 使用派生类重载控制流
- android - 在 Android 上设置 StatusBar 颜色的正确方法
- javascript - Socket.io 发出返回不同值的事件