2016-11-10 88 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 
} 

你甚至可以使位圖吸氣智能加載如果當前沒有加載位圖,並有卸載的另一種方法(處置和設置爲空),直到需要再次