ASP.NET C# 按原图片大小缩放生成缩略图

前段时间研究了JS+CSS的图片裁减,在FF正常,在IE下却提示JS参数错误.无解.只好老老实实搞缩略图.在网上搜索了一下.找到一个还算不错的代码(查看),但那个生成缩略图的函数不够完美,缩略图生成后某些部分裁剪掉了,不能实现完美的缩略.所以改写那个函数,终于成功鸟.

原图片的宽和高除以倍数后,如果宽比高长,除后的数四舍五入后一般都是等于缩图的宽.而如果高比宽长的话,除后的高也是等于缩略图的高.这个貌似是个规律.没研究过四边形的东东.还不大确定.我试了N张图片都是一样的结果.

一般原始图片的宽和高稍大于缩略图,裁剪后基本上差不多.反之,原始图片宽和高大过缩略图很多很多,缩放后的缩略图就越小.

aspx页面

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="test_img.aspx.cs" Inherits="test_test_img"  %>   
<! 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 > 缩略图测试 </ title >   
</ head >   
< body  style ="text-align:center;" >   
< form  id ="form1"  runat ="server" >   
原图:
< br  />   
< asp:Image  ID ="Image1"  runat ="server"   />   
< br  />   
 缩略图:
< br  />   
 
< asp:Image  ID ="Image2"  runat ="server"   />   
 
< br  />   
</ form >   
</ body >   
</ html >  
cs页,以下这个缩略图函数生成后空白部分是用背景色填充的.

    1 using  System;  
   
2 using  System.Data;  
   
3 using  System.Configuration;  
   
4 using  System.Collections;  
   
5 using  System.Web;  
   
6 using  System.Web.Security;  
   
7 using  System.Web.UI;  
   
8 using  System.Web.UI.WebControls;  
   
9 using  System.Web.UI.WebControls.WebParts;  
  
10 using  System.Web.UI.HtmlControls;  
  
11 public   partial   class  test_test_img : System.Web.UI.Page  
  
12 {  
  
13protected void Page_Load(object sender, EventArgs e)  
  
14{  
  
15//原图片路径  
  16string source = Server.MapPath("~/images/Source/test1.jpg");  
  
17string type = "";  
  
18//获取原图片格式  
  19string fileExtension = System.IO.Path.GetExtension(source).ToLower();  
  
20switch (fileExtension)  
  
21{  
  
22case ".gif": type = ".gif"break;  
  
23case ".jpg": type = ".jpg"break;  
  
24case ".bmp": type = ".bmp"break;  
  
25case ".png": type = ".png"break;  
  
26. }
  
  
27//缩略图保存位置和文件名,图片格式  
  28string small = Server.MapPath("~/images/Small/Small_test"+type);  
  
29. MakeThumbnail(source, small, 180,130);  
  
30. Image1.ImageUrl = source;  
  
31. Image2.ImageUrl = small;  
  
32. }
  
  
33///<summary>  
  34/// 生成缩略图  
  35/// </summary>  
  36/// <param name="originalImagePath">源图路径(物理路径)</param>  
  37/// <param name="thumbnailPath">缩略图路径(物理路径)</param>  
  38/// <param name="width">缩略图宽度</param>  
  39/// <param name="height">缩略图高度</param>  
  40public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height)  
  
41{  
  
42//获取原始图片  
  43. System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);  
  
44//缩略图画布宽高  
  45int towidth = width;  
  
46int toheight = height;  
  
47//原始图片写入画布坐标和宽高(用来设置裁减溢出部分)  
  48int x = 0;  
  
49int y = 0;  
  
50int ow = originalImage.Width;  
  
51int oh = originalImage.Height;  
  
52//原始图片画布,设置写入缩略图画布坐标和宽高(用来原始图片整体宽高缩放)  
  53int bg_x = 0;  
  
54int bg_y = 0;  
  
55int bg_w = towidth;  
  
56int bg_h = toheight;  
  
57//倍数变量  
  58double multiple = 0;  
  
59//获取宽长的或是高长与缩略图的倍数  
  60if (originalImage.Width >= originalImage.Height) multiple = (double)originalImage.Width / (double)width;  
  
61else multiple = (double)originalImage.Height / (double)height;  
  
62//上传的图片的宽和高小等于缩略图  
  63if (ow <= width && oh <= height)  
  
64{  
  
65//缩略图按原始宽高  
  66. bg_w = originalImage.Width;  
  
67. bg_h = originalImage.Height;  
  
68//空白部分用背景色填充  
  69. bg_x = Convert.ToInt32(((double)towidth - (double)ow) / 2);  
  
70. bg_y = Convert.ToInt32(((double)toheight - (double)oh) / 2);  
  
71. }
  
  
72//上传的图片的宽和高大于缩略图  
  73else  
  
74{  
  
75//宽高按比例缩放  
  76. bg_w = Convert.ToInt32((double)originalImage.Width / multiple);  
  
77. bg_h = Convert.ToInt32((double)originalImage.Height / multiple);  
  
78//空白部分用背景色填充  
  79. bg_y = Convert.ToInt32(((double)height - (double)bg_h) / 2);  
  
80. bg_x = Convert.ToInt32(((double)width - (double)bg_w) / 2);  
  
81. }
  
  
82//新建一个bmp图片,并设置缩略图大小.  
  83. System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);  
  
84//新建一个画板  
  85. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);  
  
86//设置高质量插值法  
  87. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;  
  
88//设置高质量,低速度呈现平滑程度  
  89. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;  
  
90//清空画布并设置背景色  
  91. g.Clear(System.Drawing.ColorTranslator.FromHtml("#F2F2F2"));  
  
92//在指定位置并且按指定大小绘制原图片的指定部分  
  93//第一个System.Drawing.Rectangle是原图片的画布坐标和宽高,第二个是原图片写在画布上的坐标和宽高,最后一个参数是指定数值单位为像素  
  94. g.DrawImage(originalImage, new System.Drawing.Rectangle(bg_x, bg_y, bg_w, bg_h), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);  
  
95try  
  
96{  
  
97//获取图片类型  
  98string fileExtension = System.IO.Path.GetExtension(originalImagePath).ToLower();  
  
99//按原图片类型保存缩略图片,不按原格式图片会出现模糊,锯齿等问题.  
 100switch (fileExtension)  
 
101{  
 
102case ".gif": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Gif); break;  
 
103case ".jpg": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); break;  
 
104case ".bmp": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Bmp); break;  
 
105case ".png": bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png); break;  
 
106. }
  
 
107. }
  
 
108catch (System.Exception e)  
 
109{  
 
110throw e;  
 
111. }
  
 
112finally  
 
113{  
 
114. originalImage.Dispose();  
 
115. bitmap.Dispose();  
 
116. g.Dispose();  
 
117. }
  
 
118. }
  
 
119. }
  
不用背景色填充空白部分 ,只需要修改判断条件这一部分,和去掉画布背景色的设置这段代码(也可以不去掉,因为不填充空白部分^ ^)

    1 // 上传的图片的宽和高小等于缩略图  
    2 if  (ow  <=  width  &&  oh  <=  height)  
   
3 {  
   
4//图片按缩略图宽高  
   5. bg_w = originalImage.Width;  
   
6. bg_h = originalImage.Height;  
   
7//缩略图按原始宽高.  
   8. towidth = originalImage.Width;  
   
9. toheight = originalImage.Height;  
  
10. }
  
  
11 // 上传的图片的宽和高大于缩略图  
   12 else   
  
13 {  
  
14//宽高按比例缩放  
  15. bg_w = Convert.ToInt32((double)originalImage.Width / multiple);  
  
16. bg_h = Convert.ToInt32((double)originalImage.Height / multiple);  
  
17//缩略图宽高按比例缩放.  
  18. towidth = Convert.ToInt32((double)originalImage.Width / multiple);  
  
19. toheight = Convert.ToInt32((double)originalImage.Height / multiple);  
  
20//设置坐标  
  21. bg_x = 0;  
  
22. bg_y = 0;  
  
23. }
  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值