一个自定义格式文件,这个文件能够将图片和文字共存,请问一下思路?
解决方案 »
- 如何得到 当前窗口的 上一个窗口,下一个窗口,父窗口 ?
- 问一个关于C#学习的问题
- 修改注册表表,使Windows启动后自动运行程序
- int 转成两个字节
- 怎么用正则表达式提取字符串中的汉字?
- .Net 怎样引用第三方写好的接口(xx.dll)并实现中的方法。
- C#(web)中当DataGrid有两个(或以上)相同的命令名时,如何处理
- 如何给ListBox中的项加上tip?急。。。
- 把C#集合给扩展了个类不知道是个鸡肋骨还是个精华,大家都来发表下意见。
- 如何写一个让系统在每天的固定时间重启的程序?
- 关于实时(频率很快)【序列化】出现的问题!!!
- C#无法声明全局对象 在多窗口的情况下 一个应用程序只用一个数据库连接对象
1.图片和文字全部转为byte数组,每个数组前加长度和类型,然后合并所有数组,存入文件,读出时再解析出来。 2.写一个可序列化的类,类中包含图片和字符串,然后序列化到文件。。不过好像Image是不能序列化的,可定义为byte[]
如richetextbox保存
还不如直接使用现成的xml文件格式处理,既可以记录文字,也可以记录图片。
另外使用DataSet作为存储和读取xml文件的途径,还可以省去很多的处理步骤和检索步骤。
以下代码纯属现场编写,仅供参考。
DataSet ds = new DataSet();
DataTable dt = ds.Table.Add("abc");
dt.Columns.Add("col1", SqlType.string);
dt.Columns.Add("col2", SqlType.string);
dt.Columns.Add("col3", SqlType.byte[]);
DataRow dr = dt.Rows.NewRow;
dr[0] = "id";
dr[1] = "name";
FileStream fs = new FileStream("C:\\abc.jpg", FileMode.OpenOrCreate);
byte[] bdata = new byte[fs.Length];
fs.Read(bdata, 0, bdata.Length);
fs.Close();
dr[2] = bdata;
dt.Rows.Add(dr);
ds.Writexml("C:\\abc.xml");
....
ds.Readxml("C:\\abc.xml");
dt.Columns.Add("col2");
dt.Columns.Add("col3", System.Type.GetType("System.Byte[]"));
DataRow dr = dt.NewRow();
对文字的读写,直接用之前提到的两个类就可以了,但对于图片的读写就会略微复杂一点了。System.Drawing.Image.Save方法虽然可以直接把图片的内容保存到一个流中,但可能会重置流的位置,也就是说,当图片保存完毕以后,流的当前位置可能不会在下一个读写位,而有可能跑到了流的最头上,这样如果直接使用了文件流,就会出问题了。比较合适的办法是在写入时,先将图片数据保存到一个MemoryStream中,再将此流的内容写入到文件流中,而在读出时则相反,先将文件流的内容读入到MemoryStream,再用这个流去初始化一个Image对象。