Asp. Net Upload pictures and generate high definition thumbnails

  • 2021-07-01 07:08:37
  • OfStack

In asp. net, the upload image function is commonly used, and thumbnail generation is also commonly used. baidu or google, c # method is also a lot, but 1 with found thumbnail is not clear ah, thumbnail picture is too big and so on, the following is my code in dealing with the picture, the effect is good, so take it out to share, (the effect can achieve the effect of 1 drawing software)

The code is as follows:


 /// <summary>
  /// asp.net上传图片并生成缩略图
  /// </summary>
  /// <param name="upImage">HtmlInputFile控件</param>
  /// <param name="sSavePath">保存的路径,些为相对服务器路径的下的文件夹</param>
  /// <param name="sThumbExtension">缩略图的thumb</param>
  /// <param name="intThumbWidth">生成缩略图的宽度</param>
  /// <param name="intThumbHeight">生成缩略图的高度</param>
  /// <returns>缩略图名称</returns>
  public string UpLoadImage(HtmlInputFile upImage, string sSavePath, string sThumbExtension, int intThumbWidth, int intThumbHeight)
  {
   string sThumbFile = "";
   string sFilename = "";  
   if (upImage.PostedFile != null)
   {
    HttpPostedFile myFile = upImage.PostedFile;
    int nFileLen = myFile.ContentLength;
    if (nFileLen == 0)
     return "没有选择上传图片";   
    //获取upImage选择文件的扩展名
    string extendName = System.IO.Path.GetExtension(myFile.FileName).ToLower();
    //判断是否为图片格式
    if (extendName != ".jpg" && extendName != ".jpge" && extendName != ".gif" && extendName != ".bmp" && extendName != ".png")
     return "图片格式不正确";
    
    byte[] myData = new Byte[nFileLen];
    myFile.InputStream.Read(myData, 0, nFileLen);
    sFilename = System.IO.Path.GetFileName(myFile.FileName);
    int file_append = 0;
    //检查当前文件夹下是否有同名图片,有则在文件名+1
    while (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sFilename)))
    {
     file_append++;
     sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
      + file_append.ToString() + extendName;
    }
    System.IO.FileStream newFile
     = new System.IO.FileStream(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sFilename),
     System.IO.FileMode.Create, System.IO.FileAccess.Write);
    newFile.Write(myData, 0, myData.Length);
    newFile.Close();
    //以上为上传原图
    try
    {
     //原图加载
     using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sFilename)))
     {
      //原图宽度和高度
      int width = sourceImage.Width;
      int height = sourceImage.Height;
      int smallWidth;
      int smallHeight;
      //获取第1张绘制图的大小,(比较 原图的宽/缩略图的宽 和 原图的高/缩略图的高)
      if (((decimal)width) / height <= ((decimal)intThumbWidth) / intThumbHeight)
      {
       smallWidth = intThumbWidth;
       smallHeight = intThumbWidth * height / width;
      }
      else
      {
       smallWidth = intThumbHeight * width / height;
       smallHeight = intThumbHeight;
      }
      //判断缩略图在当前文件夹下是否同名称文件存在
      file_append = 0;
      sThumbFile = sThumbExtension + System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) + extendName;
      while (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sThumbFile)))
      {
       file_append++;
       sThumbFile = sThumbExtension + System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +
        file_append.ToString() + extendName;
      }
      //缩略图保存的绝对路径
      string smallImagePath = System.Web.HttpContext.Current.Server.MapPath(sSavePath) + sThumbFile;
      //新建1个图板,以最小等比例压缩大小绘制原图
      using (System.Drawing.Image bitmap = new System.Drawing.Bitmap(smallWidth, smallHeight))
      {
       //绘制中间图
       using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
       {
        //高清,平滑
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.Clear(Color.Black);
        g.DrawImage(
        sourceImage,
        new System.Drawing.Rectangle(0, 0, smallWidth, smallHeight),
        new System.Drawing.Rectangle(0, 0, width, height),
        System.Drawing.GraphicsUnit.Pixel
        );
       }
       //新建1个图板,以缩略图大小绘制中间图
       using (System.Drawing.Image bitmap1 = new System.Drawing.Bitmap(intThumbWidth, intThumbHeight))
       {
      //绘制缩略图 http://www.cnblogs.com/sosoft/
        using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap1))
        {
         //高清,平滑
         g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
         g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
         g.Clear(Color.Black);
         int lwidth = (smallWidth - intThumbWidth) / 2;
         int bheight = (smallHeight - intThumbHeight) / 2;
         g.DrawImage(bitmap, new Rectangle(0, 0, intThumbWidth, intThumbHeight), lwidth, bheight, intThumbWidth, intThumbHeight, GraphicsUnit.Pixel);
         g.Dispose();
         bitmap1.Save(smallImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
       }
      }
     }
    }
    catch
    {
     //出错则删除
     System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sFilename));
     return "图片格式不正确";
    }
    //返回缩略图名称
    return sThumbFile;
   }
   return "没有选择图片";
  }

HtmlInputFile control I think everyone should know, is input type = file....

Let's call the code from C


 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
  <title> Picture upload - Ke Leyi </title>
 </head>
 <body>
  <form id="form1" runat="server">
  <div>  
   <input id="File1" runat="server" type="file" /></div><asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
  </form>
 </body>
 </html>


 protected void Button1_Click(object sender, EventArgs e)
  {
   string a = this.UpLoadImage(this.File1, "UpLoad/", "thumb_", 118, 118); 
  }

This will create two more images in your UpLoad folder, one original and one thumbnail.

Provide a better algorithm, because there is no time to test and debug, for reference only

That is, in the first step of scaling down, you can divide it into several times, that is, the original image to the middle image of the above code is scaled down by a percentage.

For example, the original picture is 500*500, I want to abbreviate it to 100*80. The above code program will draw a middle picture of 100*100 first, and then draw 100*80 on this picture. Before drawing 100*100 middle picture, if you draw 300*300 middle picture first, then draw 100*100 and then draw 100*80 on the basis of 300*300, this will be better than my above code. The picture is clearer, that is, the more middle pictures, the better the effect.


Related articles: