首页 > 解决方案 > Wpf 共享图像内存

问题描述

我想优化我的 WPF 应用程序中的内存使用情况。我想从磁盘加载一个 jpg 图像并显示它的真实大小。然后我想显示从磁盘加载的原始图像的 5 个裁剪正方形部分。(对任何图像都没有调整大小)。我想通过一次加载原始图像并在图像控件之间共享该数据来完成所有这一切,这样就不会浪费内存并且所有控件都从同一内存位置获取数据。

我尝试使用内存流对象,但最终由于位图和位图图像之间的一些转换,我最终复制了数据。

标签: c#.netwpf

解决方案


我在这里找到了一种从 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一次,并且在两个元素中都使用它。


推荐阅读