您的位置:首页 > 数据库

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中取了一个图片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: