C#不改變圖像長寬比例調(diào)整圖像大小方式
C#不改變圖像長寬比例調(diào)整圖像大小
在UI顯示圖片時(shí),如果容器大小固定,而圖片尺寸大于容器,那顯示圖片時(shí)會(huì)顯示不全。
有些容器(例如PictureBox)本身可以通過設(shè)置屬性來改變圖像大小,讓圖像大小自動(dòng)適應(yīng)容器,但這不能保證圖像的長寬比例不變。
這時(shí),我們可以通過編碼計(jì)算長寬來重繪圖像。
C#代碼
如下:
/// <summary> /// 根據(jù)容器(如PictureBox)長寬的限制,在不改變圖像比例的情況下,調(diào)整圖像大小 /// 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; //計(jì)算原圖的長寬比例 Scale = (float)srcImg.Height / (float)srcImg.Width; iw = srcImg.Width; ih = srcImg.Height; //如果原圖長寬都不大于容器長和寬,則不需要調(diào)整大小 if (srcImg.Width <= maxWidth && srcImg.Height <= maxHeight) { iw = srcImg.Width; ih = srcImg.Height; } //如果原圖寬大于容器寬,且原圖高不大于容器高,則調(diào)整后的圖像寬就是容器寬,圖像高需要根據(jù)長寬比例來計(jì)算 else if (srcImg.Width > maxWidth && srcImg.Height <= maxHeight) { iw = maxWidth; ih = (int)(Scale * iw); } //如果原圖高大于容器高,且原圖寬不大于容器寬,則調(diào)整后的圖像高就是容器高,圖像寬需要根據(jù)長寬比例來計(jì)算 else if (srcImg.Width <= maxWidth && srcImg.Height > maxHeight) { ih = maxHeight; iw = (int)(ih / Scale); } //如果原圖高和寬都大于容器高和寬,則調(diào)整后的圖像高和圖像寬都需要重新計(jì)算 else if (srcImg.Width > maxWidth && srcImg.Height > maxHeight) { iw = maxWidth; ih = (int)(Scale * iw); if (ih > maxHeight) { ih = maxHeight; iw = (int)(ih / Scale); } } //構(gòu)建新的位圖 Bitmap bmp = new Bitmap(iw, ih); Graphics g = Graphics.FromImage(bmp); //用背景色填充 g.Clear(backColor); //在位圖上根據(jù)調(diào)整后的高和寬繪制原圖 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前端調(diào)用
如下:
Image srcImage = Image.FromFile(fileName); pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage; pictureBox1.Image = GetImageToFitContainer(pictureBox1.Width,pictureBox1.Height,srcImage,Color.Transparent);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C# 通過同步和異步實(shí)現(xiàn)優(yōu)化做早餐的時(shí)間
本文以一個(gè)簡單的小例子—如何做一頓早餐及如何優(yōu)化做早餐的時(shí)間來讓大家具體了解一下同步和異步方法的區(qū)別,需要的朋友可以參考一下2021-12-12C#中IList<T>與List<T>的區(qū)別深入解析
本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C#實(shí)現(xiàn)倒計(jì)時(shí)關(guān)閉提示框功能
最近小編接到一個(gè)功能需要實(shí)現(xiàn)一個(gè)提示框并且能自動(dòng)關(guān)閉的,看到這個(gè)需求真是懵了,四處搜集資料才搞定,接下來通過本文給大家分享C#實(shí)現(xiàn)倒計(jì)時(shí)關(guān)閉提示框功能,感興趣的朋友跟隨小編一起看看吧2019-07-07在Form_Load里面調(diào)用Focus無效的解決方法
在調(diào)用Form_Load的時(shí)候,F(xiàn)orm其實(shí)還沒有進(jìn)入展示階段,自然Focus()調(diào)用也就沒效果了。2013-02-02C#使?XmlReader和XmlWriter操作XML?件
這篇文章介紹了C#使?XmlReader和XmlWriter操作XML?件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率詳解
這篇文章主要給大家介紹了關(guān)于C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率,Winform?ComboBox數(shù)據(jù)綁定是指將數(shù)據(jù)源中的數(shù)據(jù)與ComboBox控件進(jìn)行關(guān)聯(lián),需要的朋友可以參考下2023-08-08macOS系統(tǒng)下Vscode的python配置教程
這篇文章主要介紹了macOS系統(tǒng)下Vscode的python配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C#基于TimeSpan實(shí)現(xiàn)倒計(jì)時(shí)效果的方法
這篇文章主要介紹了C#基于TimeSpan實(shí)現(xiàn)倒計(jì)時(shí)效果的方法,比較實(shí)用的功能,需要的朋友可以參考下2014-08-08