ASP.NET生成高质量缩略图通用函数

[ 1843 查看 / 3 回复 ]

ASP.NET生成高质量缩略图通用函数(c#代码) 网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容,俺整理了C#和VB.NET两种代码。 先看下面这一段代码: '将图片缩小后保存 Private Sub SaveSmallPic(ByVal sFileName As String) Dim image As System.Drawing.Image, newimage As System.Drawing.Image Dim callb As System.Drawing.Image.GetThumbnailImageAbort image = System.Drawing.Image.FromStream(Me.File1.PostedFile.InputStream) If image.Width < image.Height Then newimage = image.GetThumbnailImage(480, 640, callb, New System.IntPtr(0)) Else newimage = image.GetThumbnailImage(640, 480, callb, New System.IntPtr(0)) End If image.Dispose() '将新图片及图片变小后存到临时路径中 newimage.Save(sFileName, System.Drawing.Imaging.ImageFormat.Jpeg) newimage.Dispose() End Sub 再看以下生成高质量缩略图代码(C#) C#代码:    **/**///// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) { Image originalImage = Image.FromFile(originalImagePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW": //指定高宽缩放(可能变形) break; case "W": //指定宽,高按比例 toheight = originalImage.Height*width/originalImage.Width; break; case "H": //指定高,宽按比例 towidth = originalImage.Width*height/originalImage.Height; break; case "Cut": //指定高宽裁减(不变形) if ((double) originalImage.Width/(double) originalImage.Height > (double) towidth/(double) toheight) { oh = originalImage.Height; ow = originalImage.Height*towidth/toheight; y = 0; x = (originalImage.Width - ow)/2; } else { ow = originalImage.Width; oh = originalImage.Width*height/towidth; x = 0; y = (originalImage.Height - oh)/2; } break; default: break; } //新建一个bmp图片 Image bitmap = new Bitmap(towidth, toheight); //新建一个画板 Graphics g = Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel); try { //以jpg格式保存缩略图 bitmap.Save(thumbnailPath, ImageFormat.Jpeg); } catch (Exception e) { throw e; } finally { originalImage.Dispose(); bitmap.Dispose(); g.Dispose(); } }
分享 转发
TOP

收藏Net 下获得清晰的缩略图

收藏Net 下获得清晰的缩略图 这里探讨的是生成的质量 最近碰到这样一个需求:把图片保存到数据库中,然后作为上传人的头像之类的。本着程序员的优良“惰性”Google了一把,找到了一大把一大把代码,试了很多号称能得到清晰缩略图的,结果就不用说了。最终在一开源项目中找到了解决办法,为了让后来人免受我所受过的煎熬,所以放出代码! 写一个上传页面: <%...@ Page language="c#" Codebehind="UploadPictureConvertTo.aspx.cs" AutoEventWireup="false" Inherits="PicturesToDB.UI.UploadPictureConvertTo" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML>     <HEAD>         <title>UploadPicture</title>         <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">         <meta name="CODE_LANGUAGE" Content="C#">         <meta name="vs_defaultClientScript" content="JavaScript">         <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">         <script language="javascript">...     function ShowImage(value,img)     ...{             //alert(value);该脚本来源于网络 //检测盘符 //alert(value.indexOf(':')); //检测文件是否有扩展名 //alert(value.length-value.lastIndexOf('.')); //取文件扩展名 //alert(value.substr(value.length-3,3)); //检测文件扩展名是否合法 //alert(CheckExt(value.substr(value.length-3,3)));                     if(value.length>5&&value.indexOf(':')==1&&(value.length-value.lastIndexOf('.'))==4&&CheckExt(value.substr(value.length-3,3)))         ...{             img.src=value;             img.alt="本地图片预览";             img.style.visibility="visible";         }         else         ...{             img.style.visibility="hidden";         }     }     //检查扩展名是否合法,合法返回True function CheckExt(ext)     ...{         //这里设置允许的扩展名 var AllowExt="jpg|gif|jpeg|png|bmp";         var ExtOK=false;             var ArrayExt;             if(AllowExt.indexOf('|')!=-1)             ...{                 ArrayExt=AllowExt.split('|');                 for(i=0;i<ArrayExt.length;i++)                 ...{                     if(ext.toLowerCase()==ArrayExt)                     ...{                         ExtOK=true;                         break;                     }                 }             }             else             ...{                 ArrayExt=AllowExt;                 if(ext.toLowerCase()==ArrayExt)                 ...{                     ExtOK=true;                 }             }             return ExtOK;     }         </script>     </HEAD>     <body MS_POSITIONING="GridLayout">         <form id="Form1" method="post" runat="server" enctype="multipart/form-data">             <table>                 <tr>                     <td colspan="2"><img id="img" STYLE="VISIBILITY:hidden"></td>                 </tr>                 <tr>                     <td>请选择上传图片</td>                     <td><input id="PictureFile" name="PictureFile" type="file" onchange="javascript:ShowImage(this.value,document.getElementById('img'))"                             runat="server"></td>                 </tr>                 <tr>                     <td>描述</td>                     <td>                         <aspextBox id="TextBox1" runat="server"></aspextBox></td>                 </tr>                 <tr>                     <td colspan="2" align="center">                         <asp:Button id="Button1" runat="server" Text="提交"></asp:Button></td>                 </tr>             </table>         </form>     </body> </HTML> 上传按钮的Click事件,以及生成缩略图的方法 private void Button1_Click(object sender, System.EventArgs e)         ...{             //没有做文件类型检测,自己加上  可以参考 清清月儿的Blog                                                               //http://blog.csdn.net/21aspnet/archive/2007/04/01/1548696.aspx                                                               HttpPostedFile picture = PictureFile.PostedFile;             PictureLength = picture.ContentLength;             try             ...{                 if (PictureLength == 0)                 ...{                     Response.Write("<script language=javascript>alert('请选择上传文件');</script>");                 }                 else                 ...{                     Stream PictureStram =picture.InputStream;                     MemoryStream ReduceStream=new MemoryStream(); ReduceStream=ResizeImageFile(PictureStram);                     Byte[] PictureByte =ReduceStream.ToArray();                     string strConn = @"Data Source=localhost;Initial Catalog=CommonCompontTest;User ID=sa;Pwd=sa";                     SqlConnection sqlConn = new SqlConnection(strConn);                     string sqlCommand = @"INSERT INTO [PicturnsTable]( [PictureBinary], [PictureType], [PictureDes], [PiacureSize])                 VALUES( @PictureBinary ,@PictureDes,@PiacureSize)";                     SqlCommand sqlCMD = new SqlCommand(sqlCommand, sqlConn);                     sqlCMD.Parameters.Add("@PictureBinary", SqlDbType.Binary).Value = PictureByte;                     sqlCMD.Parameters.Add("@PictureDes", SqlDbType.VarChar, 200).Value = TextBox1.Text.Trim();                     sqlCMD.Parameters.Add("@PiacureSize", SqlDbType.Int).Value = PictureByte.Length;                     sqlConn.Open();                     sqlCMD.ExecuteNonQuery();                     sqlConn.Close();                               Response.Write(@"<script language=javascript>alert('文件上传功');window.location.href='UploadPictureConvertTo.aspx';</script>");                     //Response.Redirect("UploadPicture.aspx");                 }             }             catch (Exception ex)             ...{                 Console.Write(ex.Message);             }         } //生成缩略图的代码 private static MemoryStream ResizeImageFile(Stream stream)         ...{             Size newSize=new Size(320,240);             using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(stream))             ...{                 using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))                 ...{                     using (Graphics canvas = Graphics.FromImage(newImage))                     ...{                         canvas.SmoothingMode = SmoothingMode.AntiAlias;                         canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;                         canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;                         canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));                         MemoryStream m = new MemoryStream();                         newImage.Save(m, ImageFormat.Jpeg);                         return m;                     }                 }             }         } 数据库表结构很简单,这里就不说了 然后就是获取图片的页面,写得很简单,将就着看哈 private void Page_Load(object sender, System.EventArgs e)         ...{             // 在此处放置用户代码以初始化页面 int PictureID = Convert.ToInt32(Request.Params["PictureID"]);  //ImgID为图片ID             //建立数据库链接 string strConn = @"Data Source=localhost;Initial Catalog=CommonCompontTest;User ID=sa;Pwd=sa";             SqlConnection sqlConn = new SqlConnection(strConn);             String SqlCmd = "SELECT [PictureID], [PictureBinary], PictureDes], [PiacureSize] FROM .[PicturnsTable] where PictureID=@PictureID";             SqlCommand SQLCmd = new SqlCommand(SqlCmd, sqlConn);             SQLCmd.Parameters.Add("@PictureID",SqlDbType.Int).Value=PictureID;             sqlConn.Open();             SqlDataReader SqlReader = SQLCmd.ExecuteReader();             SqlReader.Read();                //输出图象文件二进制数制             Response.OutputStream.Write((byte[])SqlReader["PictureBinary"], 0, (int)SqlReader["PiacureSize"]);                Response.End();             sqlConn.Close();             //很简单吧^_^         } 查看图片的页面就用个Gridview就可以了,更简单的就是,这样写在VS IDE中直接就可以看到了,麻烦就是每次都要改^_^ <%@ Page language="c#" Codebehind="ShowPicture.aspx.cs" AutoEventWireup="false" Inherits="PicturesToDB.UI.ShowPicture" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML>     <HEAD>         <title>ShowPicture</title>         <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">         <meta name="CODE_LANGUAGE" Content="C#">         <meta name="vs_defaultClientScript" content="JavaScript">         <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">     </HEAD>     <body MS_POSITIONING="GridLayout">         <form id="Form1" method="post" runat="server">             <img src="GetThePicture.aspx?PictureID=29" >         </form>     </body> </HTML> 代码就这样,希望能被需要的人Google到
TOP

用ASP.NET上传图片并生成可带版权信息的缩略图

用ASP.NET上传图片并生成可带版权信息的缩略图- - <%@ Page Language="C#" Resp %> <%@ import Namespace="System" %> <%@ import Namespace="System.IO" %> <%@ import Namespace="System.Drawing" %> <%@ import Namespace="System.Drawing.Imaging" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { if(!Page.IsPostBack) { ImgPreview.Visible=false; } } void GetThumbnailImage(int width,int height,string strInfo,int left,int right) { string file="Uploads/"+uploadFile.PostedFile.FileName.Substring(uploadFile.PostedFile.FileName.LastIndexOf('\\')+1); string newfile="Uploads/"+uploadFile.PostedFile.FileName.Substring(uploadFile.PostedFile.FileName.LastIndexOf('\\')+1)+".jpg"; string strAdd=strInfo; System.Drawing.Image oldimage = System.Drawing.Image.FromFile(Server.MapPath(file)); System.Drawing.Image thumbnailImage = oldimage.GetThumbnailImage(width, height,new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); Response.Clear(); Bitmap output=new Bitmap(thumbnailImage); Graphics g=Graphics.FromImage(output); g.DrawString(strAdd,new Font("Courier New", 14),new SolidBrush(Color.Red),left,right); output.Save(Server.MapPath(newfile),System.Drawing.Imaging.ImageFormat.Jpeg); Response.C; ImgPreview.Visible=true; ImgPreview.ImageUrl=newfile; } bool ThumbnailCallback() { return true; } void Button_Click(object sender, EventArgs e) { int width,height,left,right; string strAddInfo=txtAddInfo.Text; width=Int32.Parse(txtWidth.Text); height=Int32.Parse(txtHeight.Text); left=Int32.Parse(txtLeft.Text); right=Int32.Parse(txtRight.Text); if(!(uploadFile.PostedFile.ContentLength>0)) { lblErrInfo.Text="没有选择文件"; } else { string path = Server.MapPath("./Uploads/"+uploadFile.PostedFile.FileName.Substring(uploadFile.PostedFile.FileName.LastIndexOf('\\')+1)); if(File.Exists(path)) { lblErrInfo.Text="已经有同名文件"; } else { uploadFile.PostedFile.SaveAs(path); GetThumbnailImage(width,height,strAddInfo,left,right); } } } </script> <html> <head> </head> <body> <form method="post" enctype="multipart/form-data" runat="server"> <p> <input id="uploadFile" type="file" runat="server" /> <aspabel id="lblErrInfo" runat="server" forecolor="Red"></aspabel> </p> <p> width:<aspextBox id="txtWidth" runat="server" Width="40px">100</aspextBox> height:<aspextBox id="txtHeight" runat="server" Width="40px">150</asp:TextBox> </p> <p> 添加信息:<asp:TextBox id="txtAddInfo" runat="server"> http://bbs.opk123.com</asp:TextBox> </p> <p> 信息位置:left:<asp:TextBox id="txtLeft" runat="server" Width="40px">10</asp:TextBox> right:<asp:TextBox id="txtRight" runat="server" Width="40px">135</asp:TextBox> </p> <p> <input id="button" type="button" value="上传生成所略图"  runat="server" /> </p> <p><asp:Image id="ImgPreview" runat="server"></asp:Image> </p> <!-- Insert content here --> </form> </body> </html>
TOP

哦哦哦















胎教音乐
TOP