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日

相关文章

  • asp.net高效替换大容量字符实现代码

    下面是“asp.net高效替换大容量字符实现代码”的完整攻略: 问题描述 当需要对一个包含大量字符的字符串进行替换时,常规的字符串替换方式很容易导致性能问题,进而影响网站的响应速度。此时,需要考虑如何高效地替换大容量的字符,以提高网站的性能。 解决方案 一种高效替换大容量字符的解决方案就是使用 StringBuilder 类型。StringBuilder 提…

    C# 2023年5月31日
    00
  • C#中如何使用redis

    下面是使用C#连接Redis的完整攻略: 准备工作 在开始使用C#连接Redis之前,需要确保机器上已经安装了Redis。如果没有安装Redis,可以从https://redis.io/download这个官网下载Redis并安装。 安装完成后,需要启动Redis服务,可以通过命令行输入 redis-server 来启动Redis服务。 在C#中连接Redi…

    C# 2023年6月6日
    00
  • asp.net 关于字符串内范围截取的一点方法总结

    下面是关于”asp.net 关于字符串内范围截取的一点方法总结”的完整攻略: 标题 背景介绍 在asp.net的开发中,我们经常需要对字符串进行截取操作。这个过程中涉及到字符串的长度、起始位置、截取长度等多个参数的填写。本文将对这些参数的关系进行总结,并介绍一些常见的截取操作方法,帮助读者更好地掌握字符串截取操作。 方法总结 Substring方法 stri…

    C# 2023年6月1日
    00
  • c#中判断类是否继承于泛型基类

    要判断一个类是否继承于泛型基类,可以使用C#中的Type类和反射机制。 首先,使用Type类获取这个类的Type对象,然后使用Type对象的IsSubclassOf方法判断这个类是否继承于泛型基类。IsSubclassOf方法需要一个参数,即要判断的基类的Type对象。下面是一个示例代码: using System; class Program { stat…

    C# 2023年5月15日
    00
  • C#使用Enum.TryParse()实现枚举安全转换

    当我们需要将字符串或整数等类型转换为枚举类型时,可以使用C#提供的Enum.TryParse()方法来实现安全转换,避免了在转换时可能会抛出异常的情况。 什么是枚举类型 枚举类型是一种特殊的值类型(Value Type),它限定了该类型变量只能是预先定义好的枚举值中的一种。枚举类型可以在程序中用于表示特定的常量值,例如星期几、性别等。 Enum.TryPar…

    C# 2023年5月14日
    00
  • .NET中的IO操作之文件流用法分析

    当涉及到文件或者文件夹的操作时,我们就要使用文件流。文件流是.NET框架中常用的IO流之一,用于在程序与文件之间传输数据。在本文中,我将详细介绍文件流的使用方法,并提供两个示例。 文件流的基本使用方法 文件流的基本使用步骤如下: 打开或创建文件流 通过读取或写入方法读取或写入数据 关闭文件流 示例代码: using System.IO; // 打开或创建文件…

    C# 2023年5月31日
    00
  • C#中调用MySQL存储过程的方法

    当我们使用C#与MySQL打交道时,使用存储过程可以提高代码重用性和安全性,同时可以减少代码维护成本。下面将介绍C#中调用MySQL存储过程的方法,不仅解释了如何使用存储过程,还提供了两个示例说明。 步骤1:建立MySQL存储过程 首先在MySQL数据库中建立存储过程。 示例: 假设我们有一张students表,该表中包含以下列:id、name和age。我们…

    C# 2023年6月2日
    00
  • C#程序中类数量对程序启动的影响详解

    针对“C#程序中类数量对程序启动的影响详解”这个主题,以下是一个完整攻略: 1. 背景介绍 在C#程序开发过程中,有时候会需要设计大型的类库,但是我们是否思考了这么多类数量在程序启动上会造成什么影响呢?这个主题正是想探讨这个问题。 2. 影响分析 类的数量对程序启动速度的影响是由以下几个方面组成的: JIT编译 资源文件嵌入 元数据加载 JIT编译 当我们第…

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