C#生成缩略图

该代码段定义了一个名为PicUtil的类,其中包含一个MakeThumbnail方法,用于根据指定的宽度、高度和模式(宽度优先、高度优先、剪裁或不缩放)创建图像的缩略图。方法首先加载原始图像,然后根据模式计算缩放比例或裁剪坐标,最后使用高质量的图像处理设置创建新的缩略图并保存为JPEG或原始格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

using System.Text;

namespace learun.util

{

public enum ThumbnailMode

{

/// <summary>

/// 指定宽度,高度按照比例缩放

/// </summary>

Width = 0,

/// <summary>

/// 指定高度,宽度按照比例缩放

/// </summary>

Height = 1,

/// <summary>

/// 按照指定的高度和宽度剪裁

/// </summary>

Cut = 2,

/// <summary>

/// 指定宽度,高度按照比例缩放

/// </summary>

None = 3

}

public class PicUtil

{

public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode)

{

System.Drawing.Image img_OriginalImage = null;

ImageFormat tFormat = null;

try

{

img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath);

tFormat = img_OriginalImage.RawFormat;

}

catch (Exception ex)

{

if (img_OriginalImage != null)

{

img_OriginalImage.Dispose();

}

throw new Exception("压缩图片:" + originalImagePath + "失败!\r\n" + ex.Message);

}

int i_ToWidth = width;

int i_ToHeight = height;

int x = 0;

int y = 0;

int i_OriginalWidth = img_OriginalImage.Width;

int i_OriginalHeight = img_OriginalImage.Height;

switch (mode)

{

case ThumbnailMode.Width:

i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width;

break;

case ThumbnailMode.Height:

i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height;

break;

case ThumbnailMode.Cut:

if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight)

{

i_OriginalHeight = img_OriginalImage.Height;

i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight;

y = 0;

x = (img_OriginalImage.Width - i_OriginalWidth) / 2;

}

else

{

i_OriginalWidth = img_OriginalImage.Width;

i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth;

x = 0;

y = (img_OriginalImage.Height - i_OriginalHeight) / 2;

}

break;

default:

break;

}

//新建一个BMP图片

System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);

//新建一个画板

System.Drawing.Graphics gp = System.Drawing.Graphics.FromImage(img_BitMap);

//设置高质量插值法

gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

//设置高质量、低速度呈现平滑程度

gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

gp.CompositingQuality = CompositingQuality.HighQuality;

//清空画布并以透明背景色填充

gp.Clear(Color.Transparent);

//指定位置并按大小绘制原图片的指定部分

gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel);

try

{

EncoderParameters ep = new EncoderParameters();

long[] qy = new long[1];

qy[0] = 100;//设置压缩的比例1-100

EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);

ep.Param[0] = eParam;

ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();

ImageCodecInfo jpegICIinfo = null;

for (int i = 0; i < arrayICI.Length; i++)

{

if (arrayICI[i].FormatDescription.Equals("JPEG"))

{

jpegICIinfo = arrayICI[i];

break;

}

}

if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg))

{

//以JPG格式保存图片

img_BitMap.Save(thumbnailPath, jpegICIinfo, ep);

//Const.iSuccessCount++;

}

else

{

img_BitMap.Save(thumbnailPath, tFormat);

//Const.iSuccessCount++;

}

}

catch (Exception ex)

{

Console.WriteLine("复制图片:" + originalImagePath + "失败!\r\n" + ex.Message + ex.StackTrace);

}

finally

{

if (img_OriginalImage != null)

{

img_OriginalImage.Dispose();

}

if (img_BitMap != null)

{

img_BitMap.Dispose();

}

if (gp != null)

{

gp.Dispose();

}

//GC.Collect();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值