最近做了个基于CF 2.0上开发的手机程序,当中有一个功能是图片存储,感觉用数据库(SQL CE)存储的话过于复杂和麻烦。同时效率也会降低,不景它是手机,呵呵!为了得到更好移植和方便,我这次使用了二进制+Base64编码形式存储,顺便帖上来,希望对需要的人有点帮助!
思想:图片先转换为 二进制文件 再经 Base64编码 存储在文件中的,由于转换成二进制文件后,数据存储空间变大,利用Base64具有的压缩空间优势,使转换后的文本数据只是原数据大小的4/3倍(大概),图片量大的话,节省不少内存空间。同理,通过原先Base64编码过的文本数据解码成二进制文件后再转换为图片对象。
代码如下:
- //using System.IO;
- //using System.Drawing;
- //using System.Drawing.Imaging;
- //图片转换为字符串
- private string ImageToString(Image img, string ImgFormat)//参数ImgFormat是指定图片的类型
- {
- //定义一个内存流对象
- try
- {
- using (MemoryStream memoryStream = new MemoryStream())
- {
- //把Image以ImageFormat图片类型保存为二进制格式
- img.Save(memoryStream, ReImgFormat(ImgFormat));
- //定义b存放二进制数据
- byte[] b = memoryStream.GetBuffer();
- //将二进制数据转换为Base64编码字符串
- string PicString = Convert.ToBase64String(b);
- //关闭内存流和清空变量
- memoryStream.Close();
- b = null;
- //返回转换后的字符串
- return PicString;
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- return ""; //返回空字符串
- }
- }
- //字符串转换为图片
- private Image StringToImage(string PicString)
- {
- if (PicString.Equals(""))
- {
- //字符串为空的时候返回空对象
- return null;
- }
- else
- {
- try
- {
- using (MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(PicString)))
- {
- Image img = new System.Drawing.Bitmap(memoryStream);
- memoryStream.Close();
- return img;
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- return null; //返回空对象
- }
- }
- }
- //返回图片的类型对象
- private ImageFormat ReImgFormat(string imgformat)
- {
- switch (imgformat.ToLower())
- {
- case "jpg":
- return ImageFormat.Jpeg;
- case "gif":
- return ImageFormat.Gif;
- case "bmp":
- return ImageFormat.Bmp;
- case "png":
- return ImageFormat.Png;
- //没有指定类型默认Jpeg
- default:
- return ImageFormat.Jpeg;
- }
- }