Gridview 读取数据库图片并 改变大小
本例是model使用LINQ写的,数据库SQLserver,解决了数据库累心转换的麻烦问题。同时,通过函数的调用,使得数据库图片读取之后,可以虽数据值的改变,按着比例改变图片的大小。数据库的存储是,图片上传之后,使用二进制存储。感谢abe的指导和帮助。
LINQ 的model
Code
private Binary _image;
[Column(Storage = "_image", DbType = "varbinary")]
public Binary image
{
get
{
return this._image;
}
set
{
this._image = value;
}
}
DAL层数据的读取。通过产品的分类。读取相应的产品。
Code
/// <summary>
/// Get all the products by classify
/// </summary>
/// <param name="classify"></param>
/// <returns></returns>
public List<Products> GetSomeCProducts(string classify )
{
var pspInfo = from u in db.Products
where u.classification == classify
orderby u.lastMTime
select u;
return pspInfo.ToList<Products>();
}
Gridview前台代码的设置。没什么好讲的。模板列的使用大家都很熟悉。
Code
<asp:GridView ID ="productsList" runat ="server" AllowPaging = "true" AutoGenerateColumns = "false"
SkinID = "GridView" OnRowDataBound = "List_RowDataBound" OnPageIndexChanging = "List_PageIndexChanging">
<Columns>
<asp:ImageField DataImageUrlField="filename"
HeaderText="图片">
</asp:ImageField>
<asp:TemplateField HeaderText="图片">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" />
</ItemTemplate>
</Columns>
</asp:GridView>
后台代码简要说明一下。由于数据库是存储的二进制,而Gridview的机制是使用ImageUrl才能读取,所以我们必须读取出来,存到一个缓存中,然后把缓存的URL给Gridview才能够显示图片。。。。CreateImage是把二进制的转换成Image格式,而下面的那个函数是,对图片自定义大小和背景颜色而后显示。因为图片大小不一定能满足你原有的比例,裁剪之后不一定合适,最后有背景颜色进行填充最好。。最后一个函数是Gridview的分页。
Code
private void InitProductsList()
{
string prodInfo = string.Empty;
//分类的名称。和数据库里面的classify对应。
prodInfo = "psp";
BLOProducts blp = new BLOProducts();
productsList.DataSource = blp.GetProInfo(prodInfo);
productsList.DataBind();
}
/// <summary>
/// DataBound
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void List_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string prodInfo = string.Empty;
if (e.Row.RowIndex < 0)
return;
string strPersonName = (string)DataBinder.Eval(e.Row.DataItem, "filename");
System.Web.UI.WebControls.Image tmp_Image = (System.Web.UI.WebControls.Image)e.Row.Cells[2].FindControl("Image1");
if (!System.Convert.IsDBNull(DataBinder.Eval(e.Row.DataItem, "image")))
{
byte[] photo = (DataBinder.Eval(e.Row.DataItem, "image") as Binary).ToArray();
System.Drawing.Image img = CreateImage(photo);
System.Drawing.Image aPhoto = CreateThumb(img, 60, 60, Color.Purple);
string strPath = "~/images/" + strPersonName.Trim() + ".JPG";
string strPhotoPath = Server.MapPath(strPath);
//保存图片文件
aPhoto.Save(strPhotoPath);
tmp_Image.ImageUrl = strPath;
}
}
}
protected System.Drawing.Image CreateImage(Byte[] pBytes)
{
MemoryStream aStream = new MemoryStream(pBytes);
System.Drawing.Image rImg = System.Drawing.Image.FromStream(aStream);
aStream.Close();
return rImg;
}
protected System.Drawing.Image CreateThumb(System.Drawing.Image pSource, int pWidth, int pHeight, Color pBkColor)
{
int aWidth = pSource.Width;
int aHeight = pSource.Height;
double xScale = (aWidth * 1.0) / pWidth;
double yScale = (aHeight * 1.0) / pHeight;
double mScale = xScale;
bool fitX = true;
if (yScale > xScale)
{
mScale = yScale;
fitX = false;
}
int offset = 0;
if (fitX)
offset = (int)(pHeight - aHeight / mScale) / 2;
else
offset = (int)(pWidth - aWidth / mScale) / 2;
int rWidth = (int)(aWidth / mScale);
int rHeight = (int)(aHeight / mScale);
System.Drawing.Image rImg = new Bitmap(pWidth, pHeight);
Graphics aGC = Graphics.FromImage(rImg);
aGC.Clear(pBkColor);
if (fitX)
{
int x = 0;
int y = offset;
aGC.DrawImage(pSource, x, y, rWidth, rHeight);
}
else
{
int x = offset;
int y = 0;
aGC.DrawImage(pSource, x, y, rWidth, rHeight);
}
return rImg;
}
/// <summary>
/// PageChanging
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void List_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
productsList.PageIndex = e.NewPageIndex;
InitProductsList();
}
作者:Alexliu(alex dotNet Learning)
出处:http://alexliu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,转载请注明。并且保留文章链接。否则保留追究法律责任的权利。