博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
阅读量:5327 次
发布时间:2019-06-14

本文共 2207 字,大约阅读时间需要 7 分钟。

在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式.
ExpandedBlockStart.gifContractedBlock.gif        
/**/
/// <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)
ExpandedBlockStart.gifContractedBlock.gif        
{
            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)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{        
                
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        oh 
= originalImage.Height;
                        ow 
= originalImage.Height*towidth/toheight;
                        y 
= 0;
                        x 
= (originalImage.Width - ow)/2;
                    }
                    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        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
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{            
                
//以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            
catch(System.Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw e;
            }
            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                originalImage.Dispose();
                bitmap.Dispose();                        
                g.Dispose();
            }
        }
关键方法Graphics.DrawImage见ms
-
help:
//
MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfsystemdrawinggraphicsclassdrawimagetopic11.htm

转载于:https://www.cnblogs.com/yongheng178/archive/2008/08/22/1274324.html

你可能感兴趣的文章
操作系统 chapter1 操作系统概述
查看>>
JSP指令、动作和对象
查看>>
自然语言处理--中文文本向量化counterVectorizer()
查看>>
luogu_4551【题解】最长异或路径 trie树
查看>>
每周必写
查看>>
文件操作其他方法
查看>>
jQuery插件之ajaxFileUpload
查看>>
MMO-SNS类游戏服务器间数据交互策略分享
查看>>
记录:protobuf在网游中的用法
查看>>
【C++】指针的引用及面向对象
查看>>
《设计模式之禅》--摘要
查看>>
poj2976(二分搜索,最大化平均值)
查看>>
24种设计模式
查看>>
[bzoj3532][Sdoi2014]Lis
查看>>
HDU 2546 饭卡 动态规划01背包
查看>>
devexpress TreeList递归及点击获取数据
查看>>
记一次渗透测试某路由器
查看>>
使用gatling做压力测试与负载测试
查看>>
[转载]Linux shell中的竖线(|)——管道符号
查看>>
python 生成器和迭代器
查看>>