2016-11-10 74 views
0

此问题特定于System.Drawing.BitmapC#位图记住它来自哪里?

考虑这种情况:我创建了一个位图,像这样

public Bitmap GetImage(string sourceImage) 
{ 
    //sourceImage contains something like "C:\\Users\\my.name\\path\\to\\image.jpg" 
    //error/valid filename checking omitted in this example 
    Bitmap img = new Bitmap(sourceImage); 
    return img; 
} 

现在我的代码都和做的事情与Bitmap。之后,代码的无关部分决定使用该图像完成该操作,并且不需要再保留Bitmap对象。但是,有可能再次需要它,所以它想要记住什么是sourceImage,以便如果它确实需要它,它就知道如何重新创建它。这主要是由于记忆力;存储路径字符串比存储(可能)较大的图像占用更少的空间。

Bitmap是否记得它来自哪里,或者它是否必须带着这些信息?

我认为只是分配sourceImageTag财产,但是我使用Tag其他的事情,我不想过于复杂了。我希望源信息仍然可以帮助我省去麻烦。

+2

不 - https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,b2315d1ff08bc616和令人讨厌的类是密封的,所以你不能创建派生类用ImagePath作为属性 – pm100

+0

为什么不使用标签?制作你自己的班级,并在那里放置一个实例,听起来就像你想要的那样。 – DavidG

+0

@DavidG我正在使用标签来传送一些其他信息。如果我修改它以携带更多的信息,那么由此产生的重构将是相当大的麻烦。如果可能,我希望避免这种情况。 – Cody

回答

5

我会建议建立一个容器类,以提供额外的功能

class BitmapContainer : IDisposable 
{ 
    Bitmap Value {get; private set;} 
    string OriginalLocation {get; private set;} 

    public BitmapContainer(string sourceImage) 
    { 
     Value = new Bitmap(sourceImage); 
     OriginalLocation = sourceImage; 
     //you get the picture 
    } 

    //Don't forget to implement a dispose pattern because Bitmap uses native resources 
} 

你甚至可以使位图吸气智能加载如果当前没有加载位图,并有卸载的另一种方法(处置和设置为空),直到需要再次