一个自定义格式文件,这个文件能够将图片和文字共存,请问一下思路?

解决方案 »

  1.   


            1.图片和文字全部转为byte数组,每个数组前加长度和类型,然后合并所有数组,存入文件,读出时再解析出来。        2.写一个可序列化的类,类中包含图片和字符串,然后序列化到文件。。不过好像Image是不能序列化的,可定义为byte[]
      

  2.   

    转为二进制保存到文件
    如richetextbox保存
      

  3.   

    自定义格式的文件,一般的处理方式是使用结构体的记录文件。但是你要存放图片的话,由于图片大小是不固定的,因此,设计此类自定义格式的文件就比较麻烦了。
    还不如直接使用现成的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");
      

  4.   

    这里还是有错误:
                dt.Columns.Add("col2");
                dt.Columns.Add("col3", System.Type.GetType("System.Byte[]"));
                DataRow dr = dt.NewRow();
      

  5.   

    可以用System.IO命名空间下的BinaryReader和BinaryWriter读写二进制数据,但文件的格式必须由你自己定,一般情况下有分为头和内容两部分。文件头主要是包含了一些指示性的信息,例如文件标识、文件格式版本、内容数据块的偏移和大小等,当然这些并不一定是必须的,总之你觉得需要哪些就放哪些。
    对文字的读写,直接用之前提到的两个类就可以了,但对于图片的读写就会略微复杂一点了。System.Drawing.Image.Save方法虽然可以直接把图片的内容保存到一个流中,但可能会重置流的位置,也就是说,当图片保存完毕以后,流的当前位置可能不会在下一个读写位,而有可能跑到了流的最头上,这样如果直接使用了文件流,就会出问题了。比较合适的办法是在写入时,先将图片数据保存到一个MemoryStream中,再将此流的内容写入到文件流中,而在读出时则相反,先将文件流的内容读入到MemoryStream,再用这个流去初始化一个Image对象。