Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:将多个图像保存到单个文件中_C#_Image_Stream - Fatal编程技术网

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

C#:将多个图像保存到单个文件中,c#,image,stream,C#,Image,Stream,我正在开发一个维护图像词典的类。 此词典应保存到文件中并从文件中加载 我实现了以下解决方案,但问题是根据MSDN Image.FromStream()的文档 “如果使用相同的流连续调用此方法,则流将重置为零。” 有没有办法解决这个问题?加载字典的速度至关重要 class ImageDictionary { private Dictionary<string, Image> dict = new Dictionary<string, Image>();

我正在开发一个维护图像词典的类。 此词典应保存到文件中并从文件中加载

我实现了以下解决方案,但问题是根据MSDN Image.FromStream()的文档

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

有没有办法解决这个问题?加载字典的速度至关重要

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();

    }



}
类图像字典
{
专用字典dict=新字典();
public void AddImage(字符串资源名、字符串文件名)
{
//...
}
公共映像GetImage(字符串resourceName)
{
//...
}
公共作废保存(字符串文件名)
{
var stream=newfilestream(文件名,FileMode.Create);
var writer=新的二进制编写器(流);
writer.Write((Int32)dict.Count);
foreach(dict.Keys中的字符串键)
{
writer.Write(键);
图像img;
dict.TryGetValue(键,输出img);
保存(stream、System.Drawing.Imaging.ImageFormat.Png);
}
writer.Close();
stream.Close();
}
公共无效加载(字符串文件名)
{
var stream=新文件流(文件名,FileMode.Open);
var reader=新的二进制读取器(流);
Int32 count=reader.ReadInt32();
格言(Clear);
for(int i=0;i
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);
    }
}
public void保存(字符串文件名)
{
var serializer=新的二进制格式化程序();
使用(var stream=File.Create(文件名))
{
序列化(流,dict);
}
}
公共无效加载(字符串文件名)
{
var serializer=新的二进制格式化程序();
使用(var stream=File.Open(filename,FileMode.Open))
{
dict=(字典)序列化程序。反序列化(流);
}
}

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);
    }
}
public void保存(字符串文件名)
{
var serializer=新的二进制格式化程序();
使用(var stream=File.Create(文件名))
{
序列化(流,dict);
}
}
公共无效加载(字符串文件名)
{
var serializer=新的二进制格式化程序();
使用(var stream=File.Open(filename,FileMode.Open))
{
dict=(字典)序列化程序。反序列化(流);
}
}
您可以尝试使用来序列化/反序列化您的字典
dict
到/从文件。

您可以尝试使用来序列化/反序列化您的字典
dict
到/从文件。

一个可能有效的现成想法(我肯定没有测试过这个):

  • 创建一个派生自
    子流
    类,并封装底层
    。它的构造函数将
    偏移量
    放入
    子流
    视为零的流中
    Substream
    基本上是另一个流(在本例中是您的文件流)的受约束视图或窗口
  • 首先,在
    文件流
    上创建一个偏移量为零的
    子流
  • 调用
    Image.FromStream
    时,
    子流的位置将前进到某个新位置(称此
    p
  • 文件流
    上创建一个新的
    子流
    ,偏移量为
    p
  • 循环直到完成
这个想法是,即使
Image.FromStream
重置底层流,它也会将
子流
重置为
文件流
中的某个偏移量,这是您真正想要的。

一个可能可行的现成想法(我肯定没有测试过这个):

  • 创建一个派生自
    子流
    类,并封装底层
    。它的构造函数将
    偏移量
    放入
    子流
    视为零的流中
    Substream
    基本上是另一个流(在本例中是您的文件流)的受约束视图或窗口
  • 首先,在
    文件流
    上创建一个偏移量为零的
    子流
  • 调用
    Image.FromStream
    时,
    子流的位置将前进到某个新位置(称此
    p
  • 文件流
    上创建一个新的
    子流
    ,偏移量为
    p
  • 循环直到完成

其思想是,即使
Image.FromStream
重置基础流,它也会将
子流
重置为
文件流
中的某个偏移量,这是您真正想要的。

为什么不为该文件创建自定义头,其中包括(图像数量,实际图像的起始地址,并在每个图像之间设置一个行分隔符)

为什么不为该文件创建自定义标题,其中包括(图像数量,实际图像的起始地址,并在每个图像之间设置一个行分隔符)

请注意链接文档中的另一行,上面写着:您可以