作者:木子 http://blog.csdn.net/derny/ 下面利用ashx文件可以方便实现从数据库中读取图片并显示在datagrid当中
//---------------------------------------BindImage.aspx ----------------------------------------
<%@ Page language="c#" Codebehind="BindImage.aspx.cs" AutoEventWireup="false" Inherits="ShowImage.BindImg" %>
BindImg
<%@ Page language="c#" Codebehind="BindImage.aspx.cs" AutoEventWireup="false" Inherits="ShowImage.BindImage" %>
// ------------------------------------BindImage.aspx.cs --------------------------------------------- P>using System; using System.Data; using System.Drawing; using System.Web; using System.Data.SqlClient;namespace ShowImage { ///
/// BindImg 的摘要说明。 /// public class BindImage: System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid MyDataGrid; private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if(!Page.IsPostBack) { SqlConnection conn = new SqlConnection(@"Server=shoutor/mydb;database=northwind;uid=sa;Pwd=shoutor"); try { conn.Open(); SqlCommand cmd = new SqlCommand("select employeeID,lastname,firstname,title from employees",conn); SqlDataReader reader = cmd.ExecuteReader(); MyDataGrid.DataSource = reader; MyDataGrid.DataBind(); } finally { conn.Close(); } } } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }//-----------------------------GetImage.ashx ---------------------------------------
<%@ WebHandler Language="C#" Class="ShowImage.GetImage" CodeBehind="GetImage.ashx.cs" %>
//--------------------------------GetImage.ashx.cs----------------------------------
using System; using System.Web; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Drawing.Imaging; using System.IO;
namespace ShowImage { ///
/// GetImg 的摘要说明。 /// public class GetImage : IHttpHandler { public void ProcessRequest(HttpContext context) { string id = (string)context.Request["id"]; if(id!=null) { MemoryStream stream = new MemoryStream(); SqlConnection conn = new SqlConnection(@"Server=;database=;uid=;Pwd="); Bitmap bm = null; Image image = null; try { conn.Open(); SqlCommand cmd = new SqlCommand("select photo from employees where employeeid='"+id+"'",conn); byte[] blob = (byte[])cmd.ExecuteScalar(); stream.Write (blob,78,blob.Length-78); bm = new Bitmap(stream);int width=48; int height = (int)(width*((double)bm.Height/(double)bm.Width));
// GetThumbnailImage生成缩略图 image = bm.GetThumbnailImage(width,height,null,IntPtr.Zero);
context.Response.ContentType = "image/jpeg";
image.Save(context.Response.OutputStream,ImageFormat.Jpeg); } finally { if(image!=null) image.Dispose(); if(bm!=null) bm.Dispose(); stream.Close(); conn.Close(); } } } public bool IsReusable { get { return true; } } } }
ProcessRequest使用了空架类库的易用的Image.GetThumbnailImage方法来把位图缩小到宽度为48像素,同时保持图象的长宽比。可以使用类似的技术来创建显示来自其他数据库图象的DataGrid。基本的思想是使用模板列来输出一个引用某个HTTP处理句柄的标签,并在查询字符串中包含唯一标识图片所在的记录的信息。之后,HTTP处理句柄使用ADO.NET来获取图象数据位,并使用GDI+(图象设备接口+)来构建图象。