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日

相关文章

  • 基于jquery的分页控件(C#)

    基于jQuery的分页控件(C#)攻略 概述 本文将介绍如何使用jQuery编写基于C#的分页控件。分页控件可以提高页面的易读性和易用性,方便用户查看数据。 分页控件的实现方式 实现一个分页控件主要分为两个部分: 服务端代码,用于提供数据或者查询数据(本文中使用C#做演示)。 客户端代码,用于实现分页控件的交互和显示(本文中使用jQuery做演示)。 服务端…

    C# 2023年5月31日
    00
  • C#多线程死锁介绍与案例代码

    C#多线程死锁介绍与案例代码 死锁的概念 死锁(Deadlock)指的是多个线程因相互等待而陷入的一种僵局,每个线程都在等待其他线程释放资源。因此,所有线程都处于无法继续执行的状态,形成了死锁。 死锁产生的原因 死锁是由于多个线程相互等待对方所占用的资源而产生的。举例来说,有两个线程 A 和 B,他们需要占用相互持有的两个资源 R1 和 R2,但由于占用资源…

    C# 2023年5月31日
    00
  • 浅谈C#泛型的用处与特点

    浅谈C#泛型的用处与特点 什么是C#泛型? C# 泛型是一种类型参数化的技术,可以使用一个通用的方法或类来处理多种数据类型。通过使用泛型,可以编写更加灵活和可重用的代码,同时也可以提高代码的可维护性和可读性。 C#泛型的用处 提高代码的复用性 使用泛型可以编写更加通用的代码,可以处理多种类型的数据。不同于传统的方法和类,使用泛型可以更加直观和简单地完成类型的…

    C# 2023年5月15日
    00
  • C#通过属性名字符串获取、设置对象属性值操作示例

    下面来详细讲解一下“C#通过属性名字符串获取、设置对象属性值操作示例”的完整攻略。 1. 获取属性值 我们可以使用反射来获取对象的属性值。示例代码如下: var obj = new MyClass(); var propName = "Prop1"; // 要获取的属性名 var propValue = obj.GetType().Get…

    C# 2023年6月1日
    00
  • C#8 的模式匹配实现

    C#8 的模式匹配实现 模式匹配是 C#8 中新增的一项语言特性,它可以有效地增强代码的可读性和可维护性。本文将介绍 C#8 的模式匹配实现及其使用方法。 基本概念 模式匹配是一种根据值的类型和其他属性,以及预定义模式或用户指定的模式来确定该值是否与给定模式匹配的过程。C#8 中可以使用以下模式: 常量模式 类型模式 var 模式 指定类型模式 合并模式 常…

    C# 2023年6月6日
    00
  • C#使用private font改变PDF文件的字体详解

    下面是 “C#使用private font改变PDF文件的字体详解” 的完整攻略。 什么是Private Font Private Font是一种自定义字体,可以正常安装和使用,但在未安装该字体的计算机上会出现显示问题。因此我们需要在程序中安装该字体,在PDF文件中使用该字体。 安装Private Font 首先在项目目录下新建一个名为“Fonts”的文件夹…

    C# 2023年6月3日
    00
  • C#中Array与ArrayList用法及转换的方法

    下面就来详细讲解一下C#中Array与ArrayList用法及转换的方法。 一、Array用法 1. 创建Array 在C#中创建一个Array实际上就是创建一个固定大小的数组,可以通过以下方式来创建一个由5个整型元素组成的Array: int[] arr = new int[5]; 也可以通过对数组直接进行初始化的方式创建: int[] arr = {1,…

    C# 2023年6月7日
    00
  • 在ASP.NET 2.0中操作数据之二:创建一个业务逻辑层

    创建一个业务逻辑层(Business Logic Layer, BLL)是在ASP.NET 2.0中操作数据的一个重要方面,这个层次实现了在数据层之上的逻辑层次。 以下是在ASP.NET 2.0中创建业务逻辑层的完整攻略: 1. 在项目中加入一个业务逻辑层 创建一个新Web应用程序,并选择ASP.NET空白网站模板。选择一个好的名称和位置,然后创建并打开解决…

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