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();
}
posted @ 2008-10-21 11:23  AlexLiu  阅读(2006)  评论(0编辑  收藏  举报