议题

用户上传到网站上的大多数的图片都是大尺寸的照片,通常在用户想看完整图片之前网站会展示出这些图片或照片的缩略图。

解决方案

使用以下的类来调整上传的图片文件的宽和高:FileStream,Image,Bitmap和Graphics。

讨论

在下面的示例中,将修改和重组之前创建的FileUpload类。创建一个新的称为“ResizeImage”的方法来调整图片大小。调整之后的图片文件将被保存到源文件存储文件夹的子文件夹“Thumbnails”中。同时也要修改DeleteFile方法,添加同时删除原始图像和缩略图,并且为了避免重复代码要创建一个新的删除功能的方法。下面显示变化部分的类代码:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using System.Drawing;using System.Drawing.Drawing2D;namespace MvcApplication4.Utils{public static class FileUpload    {public static char DirSeparator =        System.IO.Path.DirectorySeparatorChar;public static string FilesPath = "Content" +        DirSeparator + "Uploads" + DirSeparator;public static string UploadFile(HttpPostedFileBase file)        {            ...// 保存缩略图            ResizeImage(file, 150, 100);            ...        }public static void DeleteFile(string fileName)        {// 如果没有指定文件名就什么都不做            if (fileName.Length == 0) return;// 设置删除路径            string path = FilesPath + DirSeparator + fileName;string thumbPath = FilesPath + DirSeparator +"Thumbnails" + DirSeparator + fileName;            RemoveFile(path);            RemoveFile(thumbPath);        }private static void RemoveFile(string path)        {// 检查文件是否存在            if (File.Exists(Path.GetFullPath(path)))            {// 删除文件                File.Delete(Path.GetFullPath(path));            }        }public static void ResizeImage(HttpPostedFileBase file,int width, int height)        {string thumbnailDirectory =            String.Format(@"{0}{1}{2}", FilesPath,            DirSeparator, "Thumbnails");// 检查目标文件夹是否存在            if (!Directory.Exists(thumbnailDirectory))            {// 假如文件夹不存在就创建它                Directory.CreateDirectory(thumbnailDirectory);            }// 设置缩略图保存路径            string imagePath =            String.Format(@"{0}{1}{2}", thumbnailDirectory,            DirSeparator, file.FileName);// 将文件流保存到磁盘            FileStream stream = new FileStream(Path.GetFullPath(            imagePath), FileMode.OpenOrCreate);// 缩放上传的文件            Image OrigImage = Image.FromStream(file.InputStream);// 创建缩略图对象            Bitmap TempBitmap = new Bitmap(width, height);// 创建缩略图画质            Graphics NewImage = Graphics.FromImage(TempBitmap);            NewImage.CompositingQuality =            CompositingQuality.HighQuality;            NewImage.SmoothingMode =            SmoothingMode.HighQuality;            NewImage.InterpolationMode =            InterpolationMode.HighQualityBicubic;// 创建Rectangle对象进行绘制            Rectangle imageRectangle = new Rectangle(0, 0,            width, height);            NewImage.DrawImage(OrigImage, imageRectangle);// 保存缩略图            TempBitmap.Save(stream, OrigImage.RawFormat);// 释放资源            NewImage.Dispose();            TempBitmap.Dispose();            OrigImage.Dispose();            stream.Close();            stream.Dispose();        }    }}

在上面的示例中,我们做了许多修改,特别创建ResizeImage方法。首先,判断“Thumbnails”文件夹是否存在以及创建功能。接下来,会创建一个新的FileStream对象,并将编辑后的图片保存到“Thumbnails”文件夹中。

从提交的InputStream创建原始图片对象。然后基于缩略图的尺寸创建缩略图的Bitmap位图实例。然后基于这个Bitmap对象创建新的Graphics对象,然后设置图像的画质、平滑度、插值模式,如果不设置这些值,缩略图会因为很像素化和比例变形变的很难看。

将这些值都设置完毕,创建一个原始尺寸的Recangle对象,将这个对象缩放后绘制到之前创建的Graphics对象中,这时才实际调整尺寸。最后保存Bitmap对象,释放所有资源。

参考

FileStream Image Bitmap Graphics 原书地址 书籍源代码

转载于:https://www.cnblogs.com/o2ds/archive/2011/12/17/2290921.html

[翻译]ASP.NET MVC 3 开发的20个秘诀(十二)[20 Recipes for Programming MVC 3]:缩放图片尺寸创建缩略图...相关推荐

  1. libGDX游戏开发之打包游戏(十二)

    libGDX游戏开发之打包游戏(十二) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goog ...

  2. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  3. iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图

    第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库. ...

  4. 敏捷开发相关(四大价值观+十二原则)

    ● 为什么需要敏捷? ● 敏捷怎么做? ● 敏捷做些什么? 在这里插入图片描述](https://img-blog.csdnimg.cn/495f7164c242465d8fe5c9c04173438 ...

  5. ASP.net控件开发系列之(一、二)

    早段时间,同事之间很流行打CS,所以那段时间的问候变成了"今天你杀XX了吗?" 控件开发也许是程序员最能发掘自己创造力的一件事情吧?控件开发不仅要求你对当前的开发有一个较全面和略深 ...

  6. ASP.NET动态网站开发培训-22.论文管理系统(二、制作论文标题页面)

    第二十二讲:论文管理系统(二.制作论文标题页面) 课程安排: 配置数据源 设置GridView控件 在表格中加入HyperLinkField字段 使用样式表文件(CSS) 加入检索功能 配置数据源 S ...

  7. Android开发笔记(一百三十二)矢量图形与矢量动画

    矢量图形VectorDrawable 与水波图形RippleDrawable一样,矢量图形VectorDrawable也是Android5.0之后新增的图形类.矢量图不同于一般的图形,它是由一系列几何 ...

  8. Android开发笔记(一百六十二)蓝牙设备的连接与配对

    蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展. 因为手机内部的通讯芯片 ...

  9. 滴滴java开发面试题_Java开发经典面试题(十二)

    好久没有来更新我的面试题了,不知道关注我的小伙伴有没有失联啊?!呼叫! 好了开始我们今天的正题分享! 1.如何从FutureTask不阻塞获取结果 get(long timeout,TimeUnit ...

最新文章

  1. 银行背景下分库分表技术选型
  2. [转]深入理解CSS中的层叠上下文和层叠顺序
  3. python解释器工作原理_Python解释器执行原理
  4. RHEL6关闭IPv6
  5. 添加请求头 retrofit_Python爬虫偷懒神器 — 快速构造请求头!
  6. c3p0依赖导入失败问题
  7. zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。...
  8. 高度不定垂直居中_你真的能写好CSS垂直水平居中吗?
  9. Search in Rotated Sorted Array
  10. 学phython的小笔记
  11. Food Webs - 网络中度及集聚系数实现
  12. win10系统迁移后系统重装_Win10技巧:Windows 10系统迁移方法!
  13. talentq测试题库rb_talentq测试题目拐
  14. [html]分享一个喜庆节日能用的代码
  15. BigBrother的大数据之旅 Day 4 Linux(4)
  16. 操作系统真象还原 第一章
  17. UE4特效萌新上手笔记- 从Houdini到Niagara的基本工作流程
  18. 众怒难犯 三星在李在镕接班计划上采取迂回策略
  19. MSA应用――MSA手册第四版的新亮点
  20. 高通骁龙660/骁龙662/骁龙665/骁龙670/骁龙675参数对比介绍

热门文章

  1. linux 窗口z order,wxPython窗口z-order设置
  2. 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
  3. Awcing算法--二进制
  4. python 解决最佳方案_python使用列表的最佳方案
  5. 使用Python,OpenCV检测摄像机到标记对象的距离
  6. C++:多线程中的小白(3)线程传参详解
  7. Halcon 点云拟合平面并获取单位法向量及位姿
  8. 数据结构与算法(6-5)二叉树的应用--哈夫曼树与哈夫曼编码
  9. 【网络爬虫】(1) 网络请求,urllib库介绍
  10. java 模仿支付成功_Java工程师薪资为何这么高?60W年薪如何轻松拿到手