当前位置: 首页 > news >正文

asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式

在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式.

        
/**/ /// <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 System.Drawing.Bitmap(towidth,toheight);

            
//新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            
//设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            
//设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            
//清空画布并以透明背景色填充
            g.Clear(Color.Transparent);        

            
//在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new Rectangle(00, towidth, toheight), 
                
new Rectangle(x, y, ow,oh),
                GraphicsUnit.Pixel);

            
try
            
{            
                
//以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }

            
catch(System.Exception e)
            
{
                
throw e;
            }

            
finally
            
{
                originalImage.Dispose();
                bitmap.Dispose();                        
                g.Dispose();
            }

        }


关键方法Graphics.DrawImage见ms
- help: // MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfsystemdrawinggraphicsclassdrawimagetopic11.htm

相关文章:

  • [翻译]简单谈谈事件与委托
  • WCF学习(一)
  • 新年第一天开通我的博客
  • 使用fail2ban保护系统一例(ssh)
  • javascript 中的xml dom
  • .NET中统一的存储过程调用方法(收藏)
  • Sun全球媒体高峰论坛开幕 CEO称重回快速增长轨道
  • 电脑总是丢失文件
  • ATL7.0 中 已经没有了CComModule
  • C++编程规范
  • RedHat ip配不上
  • Silverlight2.0 将直接支持中文
  • Win32汇编学习笔记(二)
  • 重新回归
  • 企业信息化:Web2.0带来的启示
  • 「面试题」如何实现一个圣杯布局?
  • Android Studio:GIT提交项目到远程仓库
  • axios 和 cookie 的那些事
  • Fundebug计费标准解释:事件数是如何定义的?
  • java多线程
  • laravel with 查询列表限制条数
  • PAT A1120
  • php的插入排序,通过双层for循环
  • python大佬养成计划----difflib模块
  • SpringCloud集成分布式事务LCN (一)
  • vue.js框架原理浅析
  • 诡异!React stopPropagation失灵
  • 基于Android乐音识别(2)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么软件可以剪辑音乐?
  • linux 淘宝开源监控工具tsar
  • python最赚钱的4个方向,你最心动的是哪个?
  • 整理一些计算机基础知识!
  • ​flutter 代码混淆
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #100天计划# 2013年9月29日
  • (2)STM32单片机上位机
  • (3)nginx 配置(nginx.conf)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (第27天)Oracle 数据泵转换分区表
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)插入排序
  • (原創) 物件導向與老子思想 (OO)
  • .Net CF下精确的计时器
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 反射 Reflect
  • .Net8 Blazor 尝鲜
  • .net分布式压力测试工具(Beetle.DT)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net中wcf服务生成及调用
  • @EnableAsync和@Async开始异步任务支持