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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyq106

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值