C#将图片保存到数据库字段并反向读取
2016-05-09 22:23
453 查看
在.Net程序中有时候需要生成和存储一些图片,当需要的时候供程序调用。做法有很多,其中常用的一种是将图片存储在本地,需要的时候去本地查找,这种方法实现简单,方便查看。但是随着程序运行时间的增长,会产生很多图片垃圾。还有一点就是处理重名图片等问题比较麻烦。因此,本文讨论的是如何将图片存储在数据库的字段中,需要的时候去数据库查找,避免以上所说的问题。 本文采用的实现环境是VS2013,c#语言,SQLSERVER2008R2数据库。 数据库中可以保存大容量的数据类型的有Image类型,VarBinary(MAX)等可选,微软的建议是采用后者取代前者成为存储图片的数据类型。不多说程序很简单,先上代码。 首先定义一个图片存储的类,代码如下:
public class ImageSaveTest { private byte[] imageConferenceTitle; public byte[] ImageConferenceTitle { get { return imageConferenceTitle; } set { imageConferenceTitle = value; } } }
可以看到此处定义的是byte[]类型的字段和属性,没错,我们需要的是将图片转化为字节数组后再存储到数据库中。可以采用序列化的方法,本文不讨论序列化的问题,来个简单的图片转化和存储。 定义一个转化图片的类,类名叫StreamHelper,代码如下:
public class StreamHelper { public static byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } /// 将 byte[] 转成 Stream public static Stream BytesToStream(byte[] bytes) { Stream stream = new MemoryStream(bytes); return stream; } public static byte[] ImageToBytes(Image img) { MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); return bytes; } public static Image BytesToImage(byte[] bytes) { MemoryStream ms = new MemoryStream(bytes); Image img = Image.FromStream(ms); return img; } public static string SaveImage(Image image,string imagename) { string savepath = ConfigurationManager.AppSettings["FilePath"].ToString(); savepath = savepath + imagename + ".bmp"; image.Save(savepath); return savepath; }
代码定义了5个静态函数,功能从函数的名字上可以看的出来。流和字节的相互转化,Image和字节的相互转化。还有一个是将图片存储到本地的代码,返回一个存储路径(这个是验证图片存储和读取是否成功用的)。下面是数据库的字段更新代码,假设数据库表为TB_ImageSaveTable
public static void modifImage(ImageSaveTest imageSave) { using (SqlConnection conn = new SqlConnection(connString)) { string sql = "update TB_ImageSaveTable set ImageConferenceTitle=@ImageConferenceTitle; SqlCommand command = new SqlCommand(sql, conn); command.CommandType = CommandType.Text; //将imageSave的ImageConferenceTitle属性保存到数据库的 //ImageConferenceTitle属性中 if (imageSave.ImageConferenceTitle!= null) { command.Parameters.Add("@ImageConferenceTitle", SqlDbType.VarBinary).Value = imageSave.ImageConferenceTitle; } else { command.Parameters.Add("@ImageConferenceTitle", SqlDbType.VarBinary).Value = DBNull.Value; } conn.Open(); command.ExecuteNonQuery(); }
此处是获取图片,并转化为二进制字节的代码,并存储到数据库
ImageSaveTest myImageClass = new ImageSaveTest(); Image myimage = this.pictureBox1.Image;(从一个picturebox获取图片,也可以从其他任何途径) byte[] imagebytes = null; imagebytes = StreamHelper.ImageToBytes(myimage); myImageClass.ImageConferenceTitle =imagebytes; modifImage(myImageClass);
至于数据库的连接等内容在此不做细述,总之现在已经可以将Image类型的图片转化为二进制的字节,存储到数据库中了。 下面是反向读取可验证的代码,非常简单,贴出来供大家参考。
byte[] imagebytes = null; imagebytes = myImageClass .ImageConferenceTitle; Image myimage = StreamHelper.BytesToImage(imagebytes); this.pictureBox1.Image = myimage; this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
PS:StreamHelper中写的四个函数,虽然比较简单,但是在此处其实都很有用,可以将图片流化,还可以从流中还原图片,本文为了简单直接从picturebox中取了一个图片。
相关文章推荐
- 有关Mysql分库分表,读写分离数据库水平拆分
- sqlnet.ora
- mysql授权
- Can't connect to MySQL server on localhost (10061)解决方法
- mysql源码安装
- ContentProvider 之 短信数据库和表结构
- redis学习笔记(12)---server基本流程
- oracle笔记
- Redis 防缓存雪崩锁方法实现
- 2016-5-9oracle测试面试
- SQL优化--发现问题
- 使用html2canvas截屏,利用itextpdf转为pdf保存到数据库
- 商品超市管理系统作业
- mysql的多表连接
- MySQL 数据导入
- Mysql下载与版本选择
- SQLite 介绍
- MySQL存储过程简单记录
- Spark中文手册7:Spark-sql由入门到精通【续】
- Spark中文手册6:Spark-sql由入门到精通