使用MaxHeight和MaxWidth约束按比例调整图像大小

使用MaxHeight和MaxWidth约束按比例调整图像大小

System.Drawing.Image

如果图像宽度或高度超过最大值,则需要按比例调整大小。调整大小后,需要确保宽度或高度都不超过限制。

宽度和高度将调整大小,直到它不会自动超过最大值和最小值(可能的最大尺寸)并保持比率。


杨魅力
浏览 885回答 3
3回答

慕的地6264312

像这样?public static void Test(){     using (var image = Image.FromFile(@"c:\logo.png"))     using (var newImage = ScaleImage(image, 300, 400))     {         newImage.Save(@"c:\test.png", ImageFormat.Png);     }}public static Image ScaleImage(Image image, int maxWidth, int maxHeight){     var ratioX = (double)maxWidth / image.Width;     var ratioY = (double)maxHeight / image.Height;     var ratio = Math.Min(ratioX, ratioY);     var newWidth = (int)(image.Width * ratio);     var newHeight = (int)(image.Height * ratio);     var newImage = new Bitmap(newWidth, newHeight);     using (var graphics = Graphics.FromImage(newImage))         graphics.DrawImage(image, 0, 0, newWidth, newHeight);     return newImage;}

叮当猫咪

更长的解决方案,但考虑到以下情况:图像是否小于边界框?图像和边界框是正方形吗?图像方块和边界框是不是图像是否比边界框更宽更高图像是否比边界框宽图像是否高于边界框private&nbsp;Image&nbsp;ResizePhoto(FileInfo&nbsp;sourceImage,&nbsp;int&nbsp;desiredWidth,&nbsp;int&nbsp;desiredHeight){ &nbsp;&nbsp;&nbsp;&nbsp;//throw&nbsp;error&nbsp;if&nbsp;bouning&nbsp;box&nbsp;is&nbsp;to&nbsp;small &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(desiredWidth&nbsp;<&nbsp;4&nbsp;||&nbsp;desiredHeight&nbsp;<&nbsp;4) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InvalidOperationException("Bounding&nbsp;Box&nbsp;of&nbsp;Resize&nbsp;Photo&nbsp;must&nbsp;be&nbsp;larger&nbsp;than&nbsp;4X4&nbsp;pixels.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;original&nbsp;=&nbsp;Bitmap.FromFile(sourceImage.FullName); &nbsp;&nbsp;&nbsp;&nbsp;//store&nbsp;image&nbsp;widths&nbsp;in&nbsp;variable&nbsp;for&nbsp;easier&nbsp;use &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;oW&nbsp;=&nbsp;(decimal)original.Width; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;oH&nbsp;=&nbsp;(decimal)original.Height; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;dW&nbsp;=&nbsp;(decimal)desiredWidth; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;dH&nbsp;=&nbsp;(decimal)desiredHeight; &nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;if&nbsp;image&nbsp;already&nbsp;fits &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oW&nbsp;<&nbsp;dW&nbsp;&&&nbsp;oH&nbsp;<&nbsp;dH) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;original;&nbsp;//image&nbsp;fits&nbsp;in&nbsp;bounding&nbsp;box,&nbsp;keep&nbsp;size&nbsp;(center&nbsp;with&nbsp;css)&nbsp;If&nbsp;we&nbsp;made&nbsp;it&nbsp;bigger&nbsp;it&nbsp;would&nbsp;stretch&nbsp;the&nbsp;image&nbsp;resulting&nbsp;in&nbsp;loss&nbsp;of&nbsp;quality. &nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;for&nbsp;double&nbsp;squares &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oW&nbsp;==&nbsp;oH&nbsp;&&&nbsp;dW&nbsp;==&nbsp;dH) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//image&nbsp;and&nbsp;bounding&nbsp;box&nbsp;are&nbsp;square,&nbsp;no&nbsp;need&nbsp;to&nbsp;calculate&nbsp;aspects,&nbsp;just&nbsp;downsize&nbsp;it&nbsp;with&nbsp;the&nbsp;bounding&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;square&nbsp;=&nbsp;new&nbsp;Bitmap(original,&nbsp;(int)dW,&nbsp;(int)dH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original.Dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;square; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;original&nbsp;image&nbsp;is&nbsp;square &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oW&nbsp;==&nbsp;oH) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//image&nbsp;is&nbsp;square,&nbsp;bounding&nbsp;box&nbsp;isn't.&nbsp;&nbsp;Get&nbsp;smallest&nbsp;side&nbsp;of&nbsp;bounding&nbsp;box&nbsp;and&nbsp;resize&nbsp;to&nbsp;a&nbsp;square&nbsp;of&nbsp;that&nbsp;center&nbsp;the&nbsp;image&nbsp;vertically&nbsp;and&nbsp;horizontally&nbsp;with&nbsp;Css&nbsp;there&nbsp;will&nbsp;be&nbsp;space&nbsp;on&nbsp;one&nbsp;side. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;smallSide&nbsp;=&nbsp;(int)Math.Min(dW,&nbsp;dH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;square&nbsp;=&nbsp;new&nbsp;Bitmap(original,&nbsp;smallSide,&nbsp;smallSide); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original.Dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;square; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//not&nbsp;dealing&nbsp;with&nbsp;squares,&nbsp;figure&nbsp;out&nbsp;resizing&nbsp;within&nbsp;aspect&nbsp;ratios&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oW&nbsp;>&nbsp;dW&nbsp;&&&nbsp;oH&nbsp;>&nbsp;dH)&nbsp;//image&nbsp;is&nbsp;wider&nbsp;and&nbsp;taller&nbsp;than&nbsp;bounding&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;r&nbsp;=&nbsp;Math.Min(dW,&nbsp;dH)&nbsp;/&nbsp;Math.Min(oW,&nbsp;oH);&nbsp;//two&nbsp;dimensions&nbsp;so&nbsp;figure&nbsp;out&nbsp;which&nbsp;bounding&nbsp;box&nbsp;dimension&nbsp;is&nbsp;the&nbsp;smallest&nbsp;and&nbsp;which&nbsp;original&nbsp;image&nbsp;dimension&nbsp;is&nbsp;the&nbsp;smallest,&nbsp;already&nbsp;know&nbsp;original&nbsp;image&nbsp;is&nbsp;larger&nbsp;than&nbsp;bounding&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nH&nbsp;=&nbsp;oH&nbsp;*&nbsp;r;&nbsp;//will&nbsp;downscale&nbsp;the&nbsp;original&nbsp;image&nbsp;by&nbsp;an&nbsp;aspect&nbsp;ratio&nbsp;to&nbsp;fit&nbsp;in&nbsp;the&nbsp;bounding&nbsp;box&nbsp;at&nbsp;the&nbsp;maximum&nbsp;size&nbsp;within&nbsp;aspect&nbsp;ratio. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nW&nbsp;=&nbsp;oW&nbsp;*&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;resized&nbsp;=&nbsp;new&nbsp;Bitmap(original,&nbsp;(int)nW,&nbsp;(int)nH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original.Dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resized; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oW&nbsp;>&nbsp;dW)&nbsp;//image&nbsp;is&nbsp;wider&nbsp;than&nbsp;bounding&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;r&nbsp;=&nbsp;dW&nbsp;/&nbsp;oW;&nbsp;//one&nbsp;dimension&nbsp;(width)&nbsp;so&nbsp;calculate&nbsp;the&nbsp;aspect&nbsp;ratio&nbsp;between&nbsp;the&nbsp;bounding&nbsp;box&nbsp;width&nbsp;and&nbsp;original&nbsp;image&nbsp;width &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nW&nbsp;=&nbsp;oW&nbsp;*&nbsp;r;&nbsp;//downscale&nbsp;image&nbsp;by&nbsp;r&nbsp;to&nbsp;fit&nbsp;in&nbsp;the&nbsp;bounding&nbsp;box... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nH&nbsp;=&nbsp;oH&nbsp;*&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;resized&nbsp;=&nbsp;new&nbsp;Bitmap(original,&nbsp;(int)nW,&nbsp;(int)nH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original.Dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resized; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//original&nbsp;image&nbsp;is&nbsp;taller&nbsp;than&nbsp;bounding&nbsp;box &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;r&nbsp;=&nbsp;dH&nbsp;/&nbsp;oH; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nH&nbsp;=&nbsp;oH&nbsp;*&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nW&nbsp;=&nbsp;oW&nbsp;*&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;resized&nbsp;=&nbsp;new&nbsp;Bitmap(original,&nbsp;(int)nW,&nbsp;(int)nH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;original.Dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resized; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP