C#里面使用数据库存储图片并读取图片,
并且在C#作出的窗体,,显示成QQ头像那样的图片集,
+问,图片集失真问题。。。800*500的图片,,使用图片集显示要失真。。我想做个相册,别说用图片框存路径。。。跪求大神解答
C#里面使用数据库存储图片并读取图片,
并且在C#作出的窗体,,显示成QQ头像那样的图片集,
+问,图片集失真问题。。。800*500的图片,,使用图片集显示要失真。。我想做个相册,别说用图片框存路径。。。跪求大神解答
存路径不会失真,如果存的是image类型的话
给你个例子,刚好最近做项目做过。
protected void linSaveImg_Click(object sender, EventArgs e)
{
string fileName = this.GenFileName();
string FileLastName = fileName.Substring(fileName.LastIndexOf(".") + 1);//得到文件的扩展名
List<QueryCriteria> condList = new List<QueryCriteria>()
{
new QueryCriteria(){ FieldName="SP_GUID", Comparison= EnumSqlComparison.Equal, Value=guid}
};
SHANGPIN2Info shangpin = new SHANGPIN2().GetFirst(condList);
Stream ImageStream;
string Path = fileName;// 文件名称
int Size = FileLoadIMG.PostedFile.ContentLength; // 文件大小【不处理它的话一定不会失真
】 string Type = FileLoadIMG.PostedFile.ContentType; // 文件类型
ImageStream = FileLoadIMG.PostedFile.InputStream;
shangpin.IMAGES2 = System.Drawing.Image.FromStream(ImageStream);
shangpin.SP_GUID = guid;
SHANGPINInfo sp = new SHANGPIN().GetEntity(guid);
sp.Images = shangpin.IMAGES2;
new SHANGPIN().Update(sp);
new SHANGPIN2().Update(shangpin);
}
/// <summary>
/// 循环生成新的文件名
/// </summary>
/// <returns></returns>
private string GenFileName()
{
string FileName = this.FileLoadIMG.FileName;//获取文件名
string FileLastName = FileName.Substring(FileName.LastIndexOf(".") + 1);//得到文件的扩展名
string FileTime = DateTime.Now.ToString("yyyyMMddHHmmss");//得到系统时间(格式化)并加上随机数以便生成上传图片名称
FileName = FileTime + "." + FileLastName;//产生上传图片的名称
return FileName;
}
读图片
private void GetProductImage(HttpContext context)
{
if (context.Request.QueryString["PID"] != null)
{
spguid = context.Request.QueryString["PID"].ToString();
SHANGPINInfo spM = new SHANGPINInfo();
SHANGPIN BLL = new SHANGPIN();
spM = BLL.GetEntity(spguid);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
if (spM.Images != null)
{
spM.Images.Save(ms, spM.Images.RawFormat);
byte[] pic = ms.ToArray();
ms.Close();
ms.Dispose();
context.Response.ContentType = "image/Gif";
context.Response.BinaryWrite(pic);
}
else
{
context.Response.Write("暂无图片");
}
}
}
<img id="MiddleImage" src='<%=Common.GetPic(guid,true) %>' />
#region 获取商品图片
public static string GetPic(string spguid)
{
return ApplicationPath + "/Handler/ProductImgHandler.ashx?PID=" + spguid;
}
就在在数据库里面,把原来的数据列,变成一个字符串列,保存的是一个图片路径,
比如是
/Images/xx.jpg
而图片就是相对路径放在这位置,
这样用硬盘保存文件,而数据库只做个路径的记录,
//Image转换为byte[]数组 public static byte[] imageToByteArray(System.Drawing.Image imageIn) { if (imageIn == null) return null; using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); return ms.ToArray(); } }
//byte[]数组转换为Image public static System.Drawing.Image byteArrayToImage(byte[] byteArrayIn) { if (byteArrayIn == null) return null; using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArrayIn)) { System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms); return returnImage; } }
上面的代码是用来将图片与byte数组相互转换的C#代码,你把图片以二进制的形式保存在数据库里面然后在读出时候将数据库的内容读取到一个DataSet变量里面,然后对二进制数据进行转换为Image并显示在PictrueBox上面,图片大小自己设定,这样就应该不会失真,我最近做了个软件就是这样处理,希望对你有帮助
你用数据流来将图片互转,当然会失真!!!
你既然用VS那你应该也会用SQL吧,,
1,在sql中建个表,专门用来存图片的名字。
2,在VS里连接数据库,并建个images文件夹来村图片,
3,写个根据ID查找的触发器,
用fileupload控件浏览要保存的图片,并保持。
引用空间,using System.IO;
【HttpPostedFile hpf = FileUpload1.PostedFile; string name = hpf.FileName; string filename = Path.GetFileName(name); hpf.SaveAs(Server.MapPath("images") + "\\" + filename);】上传图片的代码,
要取出的时候将图片显示在image控件中,
Image1.ImageUrl ="images\\"+ ds.Tables[0].Rows[0]["photo"].ToString();(images控件的URL)
*******操作要在连接了数据库的前提下才行*********