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# 圖像處理方面有所幫助,如果你有任何疑問或改進建議,歡迎在評論區交流!

上述博客全面解析了縮略圖生成代碼。若你覺得某些部分需要補充,或有新的展示需求,歡迎隨時和我說。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85540.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年- H57-Lc165--994.腐爛的橘子(圖論,廣搜)--Java版

1.題目描述 2.思路 3.代碼實現 import java.util.LinkedList; import java.util.Queue;public class H994 {public int orangesRotting(int[][] grid) {//1.獲取行數int rowsgrid.length;int colsgrid[0].length;//2.創建隊列用于bfsQueue<int[]> quenew LinkedList<…

005 flutter基礎,初始文件講解(4)

書接上回&#xff0c;今天繼續完成最后的講解&#xff1a; class _MyHomePageState extends State<MyHomePage> {int _counter 0;void _incrementCounter() {setState(() {_counter;});}可以看到&#xff0c;這里的_MyHomePageState是一個類&#xff0c;繼承于 State&l…

DeepSeek R1開源模型的技術突破與AI產業格局的重構

引言? 2025年&#xff0c;中國AI企業深度求索&#xff08;DeepSeek&#xff09;推出的開源模型DeepSeek-R1&#xff0c;以低成本、高性能和開放生態為核心特征&#xff0c;成為全球人工智能領域的技術焦點。這一模型不僅通過算法創新顯著降低算力依賴&#xff0c;更通過開源策…

輕量級swiper插件推薦

推薦插件列表&#xff08;按體積從小到大排序&#xff09; 1. Embla Carousel 體積&#xff1a;約 5KB (gzipped) 官網&#xff1a;A lightweight carousel library with fluid motion and great swipe precision | Embla Carousel 特點&#xff1a; 極小體積&#xff0c;高…

設計模式——訪問者設計模式(行為型)

摘要 訪問者設計模式是一種行為型設計模式&#xff0c;它將數據結構與作用于結構上的操作解耦&#xff0c;允許在不修改數據結構的前提下增加新的操作行為。該模式包含關鍵角色如元素接口、具體元素類、訪問者接口和具體訪問者類。通過訪問者模式&#xff0c;可以在不改變對象…

Vue基礎(12)_Vue.js循環語句用法:列表渲染

js補充 術語解釋 循環(loop)&#xff1a;最基礎的概念, 所有重復的行為。 遞歸(recursion)&#xff1a; 在函數內調用自身, 將復雜情況逐步轉化成基本情況。 (數學)迭代(iterate) &#xff1a;在多次循環中逐步接近結果。 (編程)迭代(iterate) &#xff1a;按順序訪問線性結構中…

Linux入門(十三)動態監控系統監控網絡狀態

top與ps 命令很相似&#xff0c;它們都是用來顯示正在執行的進程&#xff0c;top與ps大的區別是top在執行一段時間可以更新正在運行的進程。 #-d 更新秒數 如果不寫-d 那默認是3秒更新 # -i 隱藏不活躍進程 top -d 5交互操作 P 按cpu使用大小排序&#xff0c;默認此項 M 按內存…

Java 中 MySQL 索引深度解析:面試核心知識點與實戰

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Java 中 MySQL 索引深度解析&#xff1a;面試…

Kafka集成Flume/Spark/Flink(大數據)/SpringBoot

Kafka集成Flume Flume生產者 ③、安裝Flume&#xff0c;上傳apache-flume的壓縮包.tar.gz到Linux系統的software&#xff0c;并解壓到/opt/module目錄下&#xff0c;并修改其名稱為flume Flume消費者 Kafka集成Spark 生產者 object SparkKafkaProducer{def main(args:Array[S…

debian12.9或ubuntu,vagrant離線安裝插件vagrant-libvirt,20250601

系統盤: https://mirror.lzu.edu.cn/debian-cd/12.9.0/amd64/iso-dvd/debian-12.9.0-amd64-DVD-1.iso 需要的依賴包,無需安裝ruby( sudo apt install -y ruby-full ruby-dev rubygems,后來發現不安裝會有編譯警告,還是安裝吧 ) ,無需安裝 zlib1g-dev liblzma-dev libxml2-de…

2025年軟件測試面試八股文(含答案+文檔)

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Part1 1、你的測試職業發展是什么&#xff1f; 測試經驗越多&#xff0c;測試能力越高。所以我的職業發展是需要時間積累的&#xff0c;一步步向著高級測試工程師…

[CSS3]響應式布局

導讀 響應式就是一套代碼, 兼容大中小不同的屏幕, 即網頁內容不變, 網頁布局隨屏幕切換而改變 媒體查詢 響應式布局的核心技術是媒體查詢 媒體查詢可以檢測屏幕尺寸, 設置差異化的css 開發中的常用寫法 使用范圍屬性, 劃定屏幕范圍 max-width 最大寬度min-width 最小寬度 …

在 Windows安裝 make 的幾種方式

在 Windows 上使用 make&#xff08;通常用于自動化構建 C/C 項目等&#xff09;有幾種方法。以下是最常見的幾種安裝和使用方法&#xff1a; 文章目錄 ? 方法一&#xff1a;使用 Chocolatey 安裝 GNU Make&#xff08;推薦&#xff09;? 方法二&#xff1a;使用 WSL&#xf…

深度學習筆記25-RNN心臟病預測(Pytorch)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、前期準備 1.數據處理 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn dfpd.read_csv(r&…

Pytorch知識點2

Pytorch知識點 1、官方教程2、張量&#x1f9f1; 0、數組概念&#x1f9f1; 1. 創建張量&#x1f4d0; 2. 張量形狀與維度&#x1f522; 3. 張量數據類型? 4. 張量的數學與邏輯操作&#x1f504; 5. 張量的就地操作&#x1f4e6; 6. 復制張量&#x1f680; 7. 將張量移動到加速…

池中錦鯉的自我修養,聊聊蓄水池算法

面試如泡池&#xff0c;蓄水似人生 起初你滿懷期待跳進大廠池子&#xff0c;以為自己是天選之子&#xff0c;結果發現池子里早擠滿了和你一樣的“錦鯉候選人”。HR的漁網一撒&#xff0c;撈誰全看概率——這不就是蓄水池算法的精髓嗎&#xff1f; 初入池&#xff08;i≤k&…

Linux應用開發之網絡套接字編程

套接字&#xff08;Socket&#xff09;是計算機網絡數據通信的基本概念和編程接口&#xff0c;允許不同主機上的進程&#xff08;運行中的程序&#xff09;通過網絡進行數據交換。它為應用層軟件提供了發送和接收數據的能力&#xff0c;使得開發者可以在不用深入了解底層網絡細…

小白的進階之路系列之六----人工智能從初步到精通pytorch數據集與數據加載器

本文將介紹以下內容: 數據集與數據加載器 數據遷移 如何建立神經網絡 數據集與數據加載器 處理數據樣本的代碼可能會變得混亂且難以維護;理想情況下,我們希望我們的數據集代碼與模型訓練代碼解耦,以獲得更好的可讀性和模塊化。PyTorch提供了兩個數據原語:torch.utils…

深入理解設計模式之中介者模式

深入理解設計模式之&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09; 一、什么是中介者模式&#xff1f; 中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式。它通過引入一個中介對象&#xff0c;來封裝一組對象之間的交互&#xff0…

基于通義千問的兒童陪伴學習和成長的智能應用架構。

1.整體架構概覽 我們的兒童聊天助手將采用典型的語音交互系統架構,結合大模型能力和外部知識庫: 2. 技術方案分解 2.1. 前端應用/設備 選擇: 移動App(iOS/Android)、Web應用,或者集成到智能音箱/平板等硬件設備中。技術棧: 移動App: React Native / Flutter (跨平臺…