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

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

议题

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

解决方案

使用以下的类来调整上传的图片文件的宽和高: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

更多相关:

  • 为了方便创建Component,请自行安装插件       接下来就是创建组件需要绑定入参in和事件out(用于输出参数)  运行效果如下(可以点击红色文字,就获取到了子组件传出的内容)...

  • 第1步 在stmg/src/main/webapp/subsystem下创建一个newPage文件夹 在newPage文件夹下新建一个newSubPage.jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <%String pat...

  • 学习在Substance Designer中创建复杂材料的高级技术。 如果你想进入游戏行业,想学习如何创建高质量的纹理和学习物质设计,那么这个课程是给你的。 我设计了这个课程,从一开始就带你,教你我用来创建AAA纹理的3个步骤:图案,雕刻和细节。 看完这个课程后,你会觉得非常有信心创造一个AAA级纹理,你可以把它放在你的作品集里...

  • 了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建强大且通用的人工智能 创造具有多重能力的角色 创建级别组件 MP4 |视频:h264,1280×720 |音频:AAC,44.1...

  • 在Unity中学习高级粒子系统和视觉效果创建。初级到中级 你会学到: 游戏的视觉效果 Unity粒子系统 Unity中的Vfx 创建Unity视觉效果的初级到中级指南 课程获取:Unity粒子系统创建VFX游戏特效学习教程-云桥网 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言...

  • 点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...

  • RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...

  • MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...

  • 文章目录先说问题:再说解决尝试1:尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试): 感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜 先说问题: ceph 12.2.1生产环境:3副本 tier + 3副本data 机房在拥有业务的情况下重启集群交换机,产生如下场景...

  • 这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...