当前位置: 首页 > news >正文

C#实现图片缩略图生成:多种模式详解与实践

C#实现图片缩略图生成:多种模式详解与实践

在图像处理的场景中,生成图片缩略图是一项常见且实用的功能。无论是搭建图片展示网站,还是开发本地图片管理工具,按需生成合适尺寸的缩略图,能够有效减少图片传输和显示所需的资源,提升用户体验。本文将基于一段 C# 代码,详细介绍如何在 C# 中实现图片缩略图的生成,并支持多种不同的缩放模式。

一、代码整体结构

代码主要包含了三个核心部分:枚举类型ThumbnailMode用于定义缩略图生成模式,类ThumbnailOptions封装生成缩略图所需的参数,类Thumbnail则负责具体的缩略图生成逻辑。

1. 定义缩略图生成模式枚举

public enum ThumbnailMode
{Cut,Hw,H,W,
}

ThumbnailMode枚举定义了四种不同的缩略图生成模式:

  • Cut:指定高宽裁减(不变形)。该模式会根据目标宽高比例和原图宽高比例进行计算,对原图进行裁剪,以保证生成的缩略图符合指定尺寸且不会变形。
  • Hw:指定高宽缩放(可能变形)。直接按照给定的目标宽度和高度对原图进行缩放,不考虑原图的宽高比例,可能导致图片拉伸变形。
  • W:指定宽,高按比例。根据给定的目标宽度,按照原图的宽高比例自动计算出对应的高度,从而生成等比例缩放的缩略图。
  • H:指定高,宽按比例。与W模式类似,根据给定的目标高度,按照原图的宽高比例自动计算出对应的宽度。

2. 封装缩略图生成参数类

public class ThumbnailOptions
{/// <summary>/// 缩略图宽度/// </summary>public int Width { get; set; }/// <summary>/// 缩略图高度/// </summary>public int Height { get; set; }/// <summary>/// 生成缩略图的方式/// </summary>public ThumbnailMode Mode { get; set; }
}

ThumbnailOptions类用于封装生成缩略图所需的参数,包括目标宽度Width、目标高度Height以及选择的生成模式Mode。通过将这些参数封装在一个类中,使得在调用生成缩略图的方法时,参数传递更加清晰和便捷。

3. 实现缩略图生成类

[SupportedOSPlatform("windows")]
internal class Thumbnail
{/// <summary>/// 生成缩略图/// </summary>/// <param name="options">参数</param>/// <return> image</return>public static SystemImage Generate(SystemImage original, ThumbnailOptions options){var towidth = options.Width;var toheight = options.Height;var x = 0;var y = 0;var ow = original.Width;var oh = original.Height;switch (options.Mode){case ThumbnailMode.Hw:  //指定高宽缩放(可能变形)                break;case ThumbnailMode.W:   //指定宽,高按比例                    toheight = original.Height * options.Width/ original.Width;break;case ThumbnailMode.H:   //指定高,宽按比例towidth = original.Width * options.Height/ original.Height;break;default: //指定高宽裁减(不变形)                if ((double)original.Width / original.Height > towidth / (double)toheight){oh = original.Height;ow = original.Height * towidth / toheight;y = 0;x = (original.Width - ow) / 2;}else{ow = original.Width;oh = original.Width * options.Height / towidth;x = 0;y = (original.Height - oh) / 2;}break;}//新建一个bmp图片var bitmap = new Bitmap(towidth, toheight);//新建一个画板var g = Graphics.FromImage(bitmap);//设置高质量插值法g.InterpolationMode = InterpolationMode.High;//设置高质量,低速度呈现平滑程度g.SmoothingMode = SmoothingMode.HighQuality;//清空画布并以透明背景色填充g.Clear(Color.Transparent);//在指定位置并且按指定大小绘制原图片的指定部分g.DrawImage(original, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);return bitmap;}
}

Thumbnail类包含一个静态方法Generate,用于根据传入的原图和生成参数,生成对应的缩略图。方法的参数original为原始图片对象,options为包含目标尺寸和生成模式的参数对象。

二、生成缩略图的核心逻辑

Generate方法中,首先获取目标宽度towidth和目标高度toheight,以及原图的宽度ow和高度oh。然后根据选择的ThumbnailMode模式,执行不同的计算逻辑来确定最终的裁剪或缩放尺寸。

switch (options.Mode)
{case ThumbnailMode.Hw:  //指定高宽缩放(可能变形)               break;case ThumbnailMode.W:   //指定宽,高按比例                   toheight = original.Height * options.Width / original.Width;break;case ThumbnailMode.H:   //指定高,宽按比例towidth = original.Width * options.Height / original.Height;break;default: //指定高宽裁减(不变形)               if ((double)original.Width / original.Height > towidth / (double)toheight){oh = original.Height;ow = original.Height * towidth / toheight;y = 0;x = (original.Width - ow) / 2;}else{ow = original.Width;oh = original.Width * options.Height / towidth;x = 0;y = (original.Height - oh) / 2;}break;
}
  • Hw模式:由于直接按照给定的宽高进行缩放,在这部分代码中未做特殊处理,后续绘制时会直接使用传入的目标宽高。
  • W模式:根据原图的宽高比例,计算出与目标宽度对应的高度,确保图片在缩放过程中保持比例。
  • H模式:与W模式类似,根据原图比例计算出与目标高度对应的宽度。
  • Cut模式:通过比较原图和目标图的宽高比例,确定需要裁剪的区域。如果原图宽高比大于目标宽高比,说明原图更 “宽”,则保持高度不变,计算出对应的宽度,并确定水平方向的裁剪偏移量x;反之,如果原图宽高比小于目标宽高比,说明原图更 “高”,则保持宽度不变,计算出对应的高度,并确定垂直方向的裁剪偏移量y

确定好裁剪或缩放的尺寸后,接下来使用System.Drawing命名空间下的类来创建新的图片对象和绘图上下文,并进行图片绘制:

//新建一个bmp图片
var bitmap = new Bitmap(towidth, toheight);
//新建一个画板
var g = Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(original, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
return bitmap;

创建一个指定尺寸的Bitmap对象作为缩略图,获取其绘图上下文Graphics对象。通过设置InterpolationModeSmoothingMode,可以提升图片缩放时的质量,使生成的缩略图更加平滑。清空画布后,使用DrawImage方法将原图的指定部分绘制到新的缩略图中,最后返回生成的缩略图对象。

三、使用示例

以下是一个简单的使用示例,展示如何调用上述代码生成缩略图:

using System;
using System.Drawing;
class Program
{static void Main(){// 加载原始图片var originalImage = Image.FromFile("path/to/your/original/image.jpg");// 创建缩略图生成参数对象var options = new ThumbnailOptions{Width = 200,Height = 200,Mode = ThumbnailMode.Cut};// 生成缩略图var thumbnail = Thumbnail.Generate(originalImage, options);// 保存缩略图thumbnail.Save("path/to/save/thumbnail.jpg");// 释放资源originalImage.Dispose();thumbnail.Dispose();}
}

在上述示例中,首先通过Image.FromFile方法加载原始图片,然后创建ThumbnailOptions对象并设置目标尺寸和生成模式,接着调用Thumbnail.Generate方法生成缩略图,最后将缩略图保存到指定路径,并释放相关资源。

四、总结

通过上述代码和讲解,我们了解了如何在 C# 中基于System.Drawing库实现图片缩略图的生成,并支持多种不同的缩放和裁剪模式。在实际项目中,我们可以根据具体需求选择合适的模式来生成高质量的缩略图。需要注意的是,代码中使用了[SupportedOSPlatform("windows")]特性,表明该代码仅适用于 Windows 操作系统,如果需要在其他平台上运行,可能需要考虑使用其他图像处理库或进行相应的适配。希望本文对你在 C# 图像处理方面有所帮助,如果你有任何疑问或改进建议,欢迎在评论区交流!

上述博客全面解析了缩略图生成代码。若你觉得某些部分需要补充,或有新的展示需求,欢迎随时和我说。

相关文章:

  • 3. JavaScript基础:自增自减、运算符优先级、条件语句、循环与错误处理
  • 帕金森常见情况解读
  • 【GESP真题解析】第 18 集 GESP 二级 2024 年 12 月编程题 1:寻找数字
  • 【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)
  • `docker commit` 和 `docker save`区别
  • JavaScript极致性能优化全攻略
  • Linux服务器运维10个基础命令
  • 一文读懂 STP:交换机接口状态详解及工作原理
  • 探讨分贝计在医疗环境中的具体应用及其重要性
  • Docker环境构建:MySQL 双主四从集群
  • SAP Business ByDesign:无锡哲讯科技赋能中大型企业云端数字化转型
  • 8位单通道数据保存为JPG
  • WSL里执行python深度学习的一些方法记录
  • 北京大学肖臻老师《区块链技术与应用》公开课:05-BTC-实现
  • windows无法安装到这个磁盘,选中的磁盘采用gpt分区仪式
  • 研华工控机安装Windows10系统,适用UEFI(GPT)格式安装
  • 烟草工业数字化转型:科技领航,重塑传统产业新生态
  • CppCon 2014 学习:Making C++ Code Beautiful
  • Linux中的shell脚本
  • 【Dockerfile 完全参数化的通用 APT 源配置方案】
  • 泰安网站制作/网络营销案例视频
  • 织梦网站地图调用全站文章/经典seo伪原创
  • ae模板精品站/如何创建一个app平台
  • 自己做的网站怎么放视频教程/网站网址大全
  • 网络安全监测服务/网站seo入门基础教程书籍
  • 网站技术维护/网络推广可做哪些方面