C#不改变图像长宽比例调整图像大小方式

 更新时间:2025年01月20日 14:51:04   作者:hyq106  
文章介绍了在UI显示图片时,当容器大小固定而图片尺寸大于容器时,可以通过编码计算长宽来重绘图像,以确保图像的长宽比例不变,C#代码示例展示了如何在Winform前端实现这一功能

C#不改变图像长宽比例调整图像大小

在UI显示图片时,如果容器大小固定,而图片尺寸大于容器,那显示图片时会显示不全。

有些容器(例如PictureBox)本身可以通过设置属性来改变图像大小,让图像大小自动适应容器,但这不能保证图像的长宽比例不变。

这时,我们可以通过编码计算长宽来重绘图像。

C#代码

如下:

/// <summary>
/// 根据容器(如PictureBox)长宽的限制,在不改变图像比例的情况下,调整图像大小
/// author:huangyq1984@qq.com
/// </summary>
/// <param name="maxWidth">容器宽</param>
/// <param name="maxHeight">容器高</param>
/// <param name="srcImg">原图</param>
/// <param name="backColor">空白处的背景色</param>
/// <returns></returns>
public static Image GetImageToFitContainer(int maxWidth,int maxHeight, Image srcImg, Color backColor)
{
    if (srcImg == null) return null;
    float Scale;
    int iw, ih;
    //计算原图的长宽比例
    Scale = (float)srcImg.Height / (float)srcImg.Width;
    iw = srcImg.Width;
    ih = srcImg.Height;
    //如果原图长宽都不大于容器长和宽,则不需要调整大小
    if (srcImg.Width <= maxWidth && srcImg.Height <= maxHeight)
    {
        iw = srcImg.Width;
        ih = srcImg.Height;
    }
    //如果原图宽大于容器宽,且原图高不大于容器高,则调整后的图像宽就是容器宽,图像高需要根据长宽比例来计算
    else if (srcImg.Width > maxWidth && srcImg.Height <= maxHeight)
    {
        iw = maxWidth;
        ih = (int)(Scale * iw);
    }
    //如果原图高大于容器高,且原图宽不大于容器宽,则调整后的图像高就是容器高,图像宽需要根据长宽比例来计算
    else if (srcImg.Width <= maxWidth && srcImg.Height > maxHeight)
    {
        ih = maxHeight;
        iw = (int)(ih / Scale);
    }
    //如果原图高和宽都大于容器高和宽,则调整后的图像高和图像宽都需要重新计算
    else if (srcImg.Width > maxWidth && srcImg.Height > maxHeight)
    {
        iw = maxWidth;
        ih = (int)(Scale * iw);
        if (ih > maxHeight)
        {
            ih = maxHeight;
            iw = (int)(ih / Scale);
        }
    }
    //构建新的位图
    Bitmap bmp = new Bitmap(iw, ih);
    Graphics g = Graphics.FromImage(bmp);
    //用背景色填充
    g.Clear(backColor);
    //在位图上根据调整后的高和宽绘制原图
    g.DrawImage(srcImg, 0, 0, iw, ih);
    //保存
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    g.Dispose();

    srcImg = (Image)bmp;
    return srcImg;
}

C#Winform前端调用

如下:

Image srcImage = Image.FromFile(fileName);
pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
pictureBox1.Image = GetImageToFitContainer(pictureBox1.Width,pictureBox1.Height,srcImage,Color.Transparent);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#使用Process类调用外部程序分解

    C#使用Process类调用外部程序分解

    这篇文章主要介绍了C#使用Process类调用外部程序分解,分别介绍了启动外部程序、关掉外部程序、关掉后调用一些方法的方法,需要的朋友可以参考下
    2014-07-07
  • C#操作数据库中存取图片文件的方法

    C#操作数据库中存取图片文件的方法

    这篇文章主要介绍了C#操作数据库中存取图片文件的方法,以实例形式分析了C#将图片存入数据库及从数据库读取图片文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • winform实现关闭按钮失效的两种方法

    winform实现关闭按钮失效的两种方法

    这篇文章主要介绍了winform实现关闭按钮失效的两种方法,实例分析了WinForm实现关闭按钮失效的原理与所涉及的相关技巧,需要的朋友可以参考下
    2015-09-09
  • 使用C# 调用deepseek api接口实现正常访问的过程

    使用C# 调用deepseek api接口实现正常访问的过程

    本文介绍了使用C#调用deepseek API接口实现正常访问的方法,包括解决SSL/TLS安全通道问题和切换模型等常见问题,并提供了默认使用的reasoner模型和账户余额信息,感兴趣的朋友一起看看吧
    2025-02-02
  • 详解ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)

    详解ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+Object

    这篇文章主要介绍了ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008),本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C#操作xml文件之Linq To Xml详解

    C#操作xml文件之Linq To Xml详解

    Linq To Xml,不看其他,单纯的看名字都能感觉到,其可以使用灵活且强大的Linq语法,同时也可以使用lambda以及Xpath定位。本文将利用C#实现操作Linq To Xml,感兴趣的可以了解一下
    2022-11-11
  • unity实现贴图矩阵运算(旋转平移缩放)

    unity实现贴图矩阵运算(旋转平移缩放)

    这篇文章主要为大家详细介绍了unity实现贴图矩阵运算,旋转平移缩放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • openfiledialog读取txt写入数据库示例

    openfiledialog读取txt写入数据库示例

    这篇文章主要介绍了openfiledialog读取txt写入数据库示例,需要的朋友可以参考下
    2014-03-03
  • C#中的线程Threads与任务Tasks详解(最新整理)

    C#中的线程Threads与任务Tasks详解(最新整理)

    C#开发中推荐使用Task而非Thread,由于Task更高效,提供更简单的接口,并且由.NET运行时管理线程,减少开发者负担,Task适合异步操作和返回值处理,而Thread则适用于需要低级控制和实时系统,这篇文章介绍C#中的线程Threads与任务Tasks,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • C#实现chart控件动态曲线绘制

    C#实现chart控件动态曲线绘制

    这篇文章主要为大家详细介绍了C#实现chart控件动态曲线绘制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论