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

下面我将为你详细讲解asp.net生成高质量缩略图通用函数的攻略。

1. 简介

在很多网站中,我们经常需要使用到缩略图功能。ASP.NET提供了一种方便快捷的方法来生成缩略图。我们可以使用System.DrawingSystem.Drawing.Imaging命名空间中的类来实现。这里,我们将制作一个通用函数,它支持多种生成方式,能够根据需要生成指定大小和质量的缩略图。

2. 实现

首先,我们需要在项目中引用System.DrawingSystem.Drawing.Imaging,并声明它们的命名空间。

using System.Drawing;
using System.Drawing.Imaging;

接下来,我们可以在代码中声明一个缩略图生成函数,用来生成指定大小和质量的缩略图。

public static void GenerateThumbnail(string sourcePath, string destinationPath, int width, int height, long quality)
{
    using (var sourceImage = new Bitmap(sourcePath))
    {
        var sourceWidth = sourceImage.Width;
        var sourceHeight = sourceImage.Height;

        var destWidth = width;
        var destHeight = height;
        var sourceRatio = (double)sourceWidth / sourceHeight;
        var destRatio = (double)destWidth / destHeight;

        if (sourceRatio > destRatio)
        {
            destHeight = (int)(width / sourceRatio);
        }
        else
        {
            destWidth = (int)(height * sourceRatio);
        }

        var destImage = new Bitmap(destWidth, destHeight);

        using (var graphics = Graphics.FromImage(destImage))
        {
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            graphics.DrawImage(sourceImage, new Rectangle(0, 0, destWidth, destHeight));

            var qualityParamId = Encoder.Quality;
            var encoderParameters = new EncoderParameters(1);
            encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality);
            var jpgEncoder = GetEncoder(ImageFormat.Jpeg);
            destImage.Save(destinationPath, jpgEncoder, encoderParameters);
        }
    }
}

这个函数的参数比较简单:

  • sourcePath: 原始图片的路径
  • destinationPath: 生成缩略图的路径
  • widthheight: 缩略图的宽度和高度
  • quality: 缩略图的质量,从0到100

在函数内部,我们首先获取原始图像的宽度和高度,并根据源模板的宽高比和目标模板的宽高比计算目标图像的宽度和高度。然后,我们使用System.Drawing命名空间中的类来创建一个新的位图来保存缩略图,然后使用System.Drawing中的Graphics类来绘制缩略图,并将缩略图保存到指定的路径中。

3. 示例

以下是一个完整的示例代码,展示了如何使用上述函数来生成缩略图:

var sourcePath = "source.jpg";
var destinationPath = "destination.jpg";
var width = 200;
var height = 200;
var quality = 80L;
GenerateThumbnail(sourcePath, destinationPath, width, height, quality);

这将生成一个200x200像素的JPEG格式缩略图,并将其保存到destinationPath路径中,质量为80。注意:在实际的生产环境中,请根据需要设置正确的宽度,高度和质量。

下面是另一个生成缩略图的示例,该示例尝试连接到并下载远程图像:

public static void GenerateThumbnailFromUrl(string sourceUrl, string destinationPath, int width, int height, long quality)
{
    using(var webClient = new WebClient())
    {
        using(var sourceStream = webClient.OpenRead(sourceUrl))
        {
            using(var destinationStream = File.Open(destinationPath, FileMode.Create))
            {
                var sourceImage = new Bitmap(sourceStream);
                var sourceWidth = sourceImage.Width;
                var sourceHeight = sourceImage.Height;

                var destWidth = width;
                var destHeight = height;
                var sourceRatio = (double)sourceWidth / sourceHeight;
                var destRatio = (double)destWidth / destHeight;

                if (sourceRatio > destRatio)
                {
                    destHeight = (int)(width / sourceRatio);
                }
                else
                {
                    destWidth = (int)(height * sourceRatio);
                }

                var destImage = new Bitmap(destWidth, destHeight);

                using (var graphics = Graphics.FromImage(destImage))
                {
                    graphics.SmoothingMode = SmoothingMode.HighQuality;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage(sourceImage, new Rectangle(0, 0, destWidth, destHeight));

                    var qualityParamId = Encoder.Quality;
                    var encoderParameters = new EncoderParameters(1);
                    encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality);
                    var jpgEncoder = GetEncoder(ImageFormat.Jpeg);
                    destImage.Save(destinationStream, jpgEncoder, encoderParameters);
                }
            }
        }
    }
}

在这个示例中,我们首先使用WebClient类连接到远程URL,然后打开该URL,然后使用创建的输入流读取图像数据。然后,我们通过使用System.Drawing命名空间中的类来生成缩略图,然后将其保存到指定的路径中。

4. 结语

到这里,我们完成了asp.net生成高质量缩略图通用函数的完整攻略。这个函数是使用System.DrawingSystem.Drawing.Imaging命名空间中的类来生成缩略图。我们还展示了如何根据需要生成指定大小和质量的缩略图,并提供了两个示例。希望这篇攻略能够对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# 函数返回多个值的方法详情

    下面我给你讲解一下C#函数返回多个值的方法详情: 1. 使用out关键字 使用out关键字是一个简单的方式,可以让函数返回多个值。out参数必须在方法内部赋值,否则编译器会报错。下面是一个返回三个整数的函数示例: public void GetValues(out int val1, out int val2, out int val3) { val1 = …

    C# 2023年5月15日
    00
  • Linux系统docker部署.net core3.1的详细步骤

    下面就为您详细讲解“Linux系统docker部署.net core3.1的详细步骤”的完整攻略。 1. 安装docker 首先在Linux系统上安装docker,以Ubuntu系统为例,可以通过以下命令进行安装: sudo apt-get update sudo apt-get install docker.io 2. 下载.net core3.1 镜像 …

    C# 2023年6月3日
    00
  • .Net core 的热插拔机制的深入探索及卸载问题求救指南

    .Net Core的热插拔机制是指在应用程序运行时,可以动态地添加、删除或替换程序集,而无需停止应用程序。本文将深入探索.Net Core的热插拔机制,并提供卸载问题的求救指南。 热插拔机制的实现 .Net Core的热插拔机制是通过应用程序域(AppDomain)实现的。应用程序域是一个隔离的执行环境,可以在其中加载和卸载程序集。在.Net Core中,应…

    C# 2023年5月16日
    00
  • C#中的事件介绍

    C#中的事件介绍 在C#中,事件是一种典型的观察者设计模式的应用。事件机制使得对象间的协作变得更加松散,同时也易于扩展。本篇文章将介绍C#中的事件,包括事件的定义、事件的注册和注销以及如何触发事件。 定义事件 在C#中,事件是一种特殊的委托,它定义了一个回调函数的集合。定义事件的方式是使用event关键字,语法如下: public event EventHa…

    C# 2023年5月31日
    00
  • 利用C#实现最基本的小说爬虫示例代码

    以下是利用C#实现最基本的小说爬虫示例代码的完整攻略: 1. 爬虫工具的选择 爬取小说需要借助爬虫工具,此处选择C#语言中一个开源的爬虫框架——HtmlAgilityPack,它能够以DOM的方式来解析HTML文档。 2. 分析小说网站的HTML结构 在编写爬虫前需要对小说网站的HTML结构进行分析,确定目标数据的XPath表达式。 以某小说网站为例,网站每…

    C# 2023年5月31日
    00
  • c#中string的特性介绍及注意事项小结

    首先,让我们来介绍一下C#语言中的string类型。string类型表示一个字符串,字符串是一组字符组成的序列。在C#中,字符串是一个对象,它属于System.String类。字符串是不可变的,也就是说,一旦创建就不能被改变。 操作字符串的方法和属性: Length属性:获取字符串的长度 IndexOf方法:查找字符串中某个字符或子字符串第一次出现的位置 S…

    C# 2023年6月1日
    00
  • 采用easyui tree编写简单角色权限代码的方法

    下面我将为您详细讲解 “采用easyui tree编写简单角色权限代码的方法”的完整攻略,过程中将包含两条示例说明。 一、使用EasyUI Tree组件 1.1 引入EasyUI和jQuery 在使用EasyUI Tree组件前,需要先引入官方提供的EasyUI库和jQuery库。具体方法可以参考以下代码块: <!– 引入JQuery –> …

    C# 2023年6月1日
    00
  • C# winform跨线程操作控件的实现

    本文主要讲解 C# WinForm 中如何跨线程操作控件的实现方法,下面是完整的攻略过程。 什么是跨线程操作控件 在 C# WinForm 中,所有控件都必须在创建它的线程中操作。如果在其他线程中访问控件,将会抛出一个”跨线程操作无效“的异常。因此,当我们在工作中需要在多个线程中操作同一个控件时,就需要用到跨线程操作控件的方法。 实现方法 C# WinFor…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部