在C#开发中,图片按比例缩放是图像处理的基础需求,常见于头像裁剪、缩略图生成、图片适配展示等场景。实现核心是先根据目标尺寸和原图尺寸计算合适的缩放比例,避免图片拉伸变形,下面分享具体的实现方法和示例代码。

核心实现思路
按比例缩放的关键是保持原图的宽高比,计算逻辑如下:
- 获取原图的宽度和高度
- 根据目标宽度或高度,结合原图宽高比计算对应的另一个维度尺寸
- 如果同时指定了最大宽度和最大高度,取两个比例中较小的那个作为最终缩放比例
- 使用System.Drawing命名空间下的类完成图片的重绘和尺寸调整
基础缩放方法实现
首先需要引入System.Drawing命名空间,如果项目未引用相关依赖,需要先安装System.Drawing.Common包。下面是通用的按比例缩放方法:
using System.Drawing;
public class ImageScaleHelper
{
/// <summary>
/// 按比例缩放图片
/// </summary>
/// <param name="originalImage">原图对象</param>
/// <param name="targetWidth">目标宽度,为0则按高度比例计算</param>
/// <param name="targetHeight">目标高度,为0则按宽度比例计算</param>
/// <returns>缩放后的图片对象</returns>
public static Image ScaleImage(Image originalImage, int targetWidth, int targetHeight)
{
// 原图尺寸
int originalWidth = originalImage.Width;
int originalHeight = originalImage.Height;
// 计算缩放比例
double widthRatio = 0;
double heightRatio = 0;
double finalRatio = 1.0;
if (targetWidth > 0)
{
widthRatio = (double)targetWidth / originalWidth;
}
if (targetHeight > 0)
{
heightRatio = (double)targetHeight / originalHeight;
}
// 根据传入的目标尺寸判断使用哪个比例
if (targetWidth > 0 && targetHeight > 0)
{
// 同时指定宽高,取较小的比例保证不超出目标尺寸
finalRatio = Math.Min(widthRatio, heightRatio);
}
else if (targetWidth > 0)
{
// 仅指定宽度,按宽度比例缩放
finalRatio = widthRatio;
}
else if (targetHeight > 0)
{
// 仅指定高度,按高度比例缩放
finalRatio = heightRatio;
}
// 计算最终尺寸
int newWidth = (int)(originalWidth * finalRatio);
int newHeight = (int)(originalHeight * finalRatio);
// 创建新的画布并绘制缩放后的图片
Bitmap scaledImage = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(scaledImage))
{
// 设置高质量插值模式
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
// 绘制缩放后的图片
g.DrawImage(originalImage, 0, 0, newWidth, newHeight);
}
return scaledImage;
}
}常见场景调用示例
场景1:固定宽度缩放
比如需要生成宽度为200px的缩略图,高度自动按比例计算:
// 加载原图
Image originalImg = Image.FromFile("test.jpg");
// 固定宽度200,高度传0表示按宽度比例计算
Image scaledImg = ImageScaleHelper.ScaleImage(originalImg, 200, 0);
// 保存缩放后的图片
scaledImg.Save("scaled_test.jpg");
// 释放资源
originalImg.Dispose();
scaledImg.Dispose();场景2:限制最大尺寸缩放
比如要求图片最大宽度不超过800px,最大高度不超过600px,保持比例不超出范围:
Image originalImg = Image.FromFile("large_image.jpg");
// 指定最大宽度800,最大高度600
Image scaledImg = ImageScaleHelper.ScaleImage(originalImg, 800, 600);
scaledImg.Save("max_size_image.jpg");
originalImg.Dispose();
scaledImg.Dispose();注意事项
使用过程中需要注意以下几点:
- Image、Bitmap对象使用完毕后要及时调用Dispose方法释放资源,避免内存泄漏
- 如果处理的图片尺寸较大,建议先判断原图尺寸,避免不必要的缩放操作
- 插值模式可以根据需求调整,高清晰度的插值会增加一定的计算开销
- 如果项目是.NET Core及以上版本,确保安装的System.Drawing.Common包版本和目标框架兼容
C#图片缩放比例计算System_Drawing图像尺寸调整修改时间:2026-05-29 15:23:35