C#:将多个图像保存到单个文件中

Mik*_*ner 2 c# image stream

我正在研究一个维护图像字典的类.此字典应保存到文件并从文件加载.

我实现了以下解决方案,但问题是根据MSDN文档中的Image.FromStream();
http://msdn.microsoft.com/en-us/library/93z9ee4x(v=VS.80).aspx

"如果使用相同的流连续调用此方法,则流将重置为零."

任何想法如何解决这一问题?加载字典的速度至关重要.

class ImageDictionary
{
    private Dictionary<string, Image> dict = new Dictionary<string, Image>();

    public void AddImage(string resourceName, string filename)
    {
       //...
    }

    public Image GetImage(string resourceName) 
    {
       //...
    }


    public void Save(string filename)
    {
        var stream = new FileStream(filename, FileMode.Create);
        var writer = new BinaryWriter(stream);
        writer.Write((Int32) dict.Count);
        foreach (string key in dict.Keys)
        {
            writer.Write(key);

            Image img;
            dict.TryGetValue(key, out img);
            img.Save(stream,System.Drawing.Imaging.ImageFormat.Png);
        }
        writer.Close();
        stream.Close();
    }

    public void Load(string filename)
    {
        var stream = new FileStream(filename, FileMode.Open);
        var reader = new BinaryReader(stream);
        Int32 count = reader.ReadInt32();
        dict.Clear();

        for (int i = 0; i < count; i++)
        {
            string key = reader.ReadString();
            Image img = Image.FromStream(stream);
            dict.Add(key, img);

        }

        reader.Close();
        stream.Close();

    }



}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

Image.FromStream方法需要有效的图像流.您将多个图像连接到一个文件中,如果要重建它们,除了它们的编号之外,还需要保存它们的大小.一个更简单的解决方案是简单地二进制序列化图像字典:

public void Save(string filename)
{
    var serializer = new BinaryFormatter();
    using (var stream = File.Create(filename))
    {
        serializer.Serialize(stream, dict);
    }
}

public void Load(string filename)
{
    var serializer = new BinaryFormatter();
    using (var stream = File.Open(filename, FileMode.Open))
    {
        dict = (Dictionary<string, Image>)serializer.Deserialize(stream);
    }
}
Run Code Online (Sandbox Code Playgroud)