C#:将多个图像保存到单个文件中
我正在开发一个维护图像词典的类。 此词典应保存到文件中并从文件中加载 我实现了以下解决方案,但问题是根据MSDN Image.FromStream()的文档C#:将多个图像保存到单个文件中,c#,image,stream,C#,Image,Stream,我正在开发一个维护图像词典的类。 此词典应保存到文件中并从文件中加载 我实现了以下解决方案,但问题是根据MSDN Image.FromStream()的文档 “如果使用相同的流连续调用此方法,则流将重置为零。” 有没有办法解决这个问题?加载字典的速度至关重要 class ImageDictionary { private Dictionary<string, Image> dict = new Dictionary<string, Image>();
“如果使用相同的流连续调用此方法,则流将重置为零。” 有没有办法解决这个问题?加载字典的速度至关重要
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
重置基础流,它也会将子流
重置为文件流
中的某个偏移量,这是您真正想要的。为什么不为该文件创建自定义头,其中包括(图像数量,实际图像的起始地址,并在每个图像之间设置一个行分隔符)为什么不为该文件创建自定义标题,其中包括(图像数量,实际图像的起始地址,并在每个图像之间设置一个行分隔符)请注意链接文档中的另一行,上面写着:您可以