C#不改變圖像長寬比例調(diào)整圖像大小方式
C#不改變圖像長寬比例調(diào)整圖像大小
在UI顯示圖片時,如果容器大小固定,而圖片尺寸大于容器,那顯示圖片時會顯示不全。
有些容器(例如PictureBox)本身可以通過設(shè)置屬性來改變圖像大小,讓圖像大小自動適應(yīng)容器,但這不能保證圖像的長寬比例不變。
這時,我們可以通過編碼計算長寬來重繪圖像。
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; //計算原圖的長寬比例 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ù)長寬比例來計算 else if (srcImg.Width > maxWidth && srcImg.Height <= maxHeight) { iw = maxWidth; ih = (int)(Scale * iw); } //如果原圖高大于容器高,且原圖寬不大于容器寬,則調(diào)整后的圖像高就是容器高,圖像寬需要根據(jù)長寬比例來計算 else if (srcImg.Width <= maxWidth && srcImg.Height > maxHeight) { ih = maxHeight; iw = (int)(ih / Scale); } //如果原圖高和寬都大于容器高和寬,則調(diào)整后的圖像高和圖像寬都需要重新計算 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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C# 通過同步和異步實現(xiàn)優(yōu)化做早餐的時間
本文以一個簡單的小例子—如何做一頓早餐及如何優(yōu)化做早餐的時間來讓大家具體了解一下同步和異步方法的區(qū)別,需要的朋友可以參考一下2021-12-12C#中IList<T>與List<T>的區(qū)別深入解析
本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01在Form_Load里面調(diào)用Focus無效的解決方法
在調(diào)用Form_Load的時候,F(xiàn)orm其實還沒有進入展示階段,自然Focus()調(diào)用也就沒效果了。2013-02-02C#使?XmlReader和XmlWriter操作XML?件
這篇文章介紹了C#使?XmlReader和XmlWriter操作XML?件的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率詳解
這篇文章主要給大家介紹了關(guān)于C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率,Winform?ComboBox數(shù)據(jù)綁定是指將數(shù)據(jù)源中的數(shù)據(jù)與ComboBox控件進行關(guān)聯(lián),需要的朋友可以參考下2023-08-08macOS系統(tǒng)下Vscode的python配置教程
這篇文章主要介紹了macOS系統(tǒng)下Vscode的python配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04