使用MaxHeight和MaxWidth約束按比例調(diào)整圖像大小用System.Drawing.Image。如果圖像寬度或高度超過(guò)最大值,則需要按比例調(diào)整大小。調(diào)整大小后,需要確保寬度或高度都不超過(guò)限制。寬度和高度將調(diào)整大小,直到它不會(huì)自動(dòng)超過(guò)最大值和最小值(可能的最大尺寸)并保持比率。
3 回答

慕的地6264312
TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
像這樣?
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;}

叮當(dāng)貓咪
TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
更長(zhǎng)的解決方案,但考慮到以下情況:
圖像是否小于邊界框?
圖像和邊界框是正方形嗎?
圖像方塊和邊界框是不是
圖像是否比邊界框更寬更高
圖像是否比邊界框?qū)?/p>
圖像是否高于邊界框
private Image ResizePhoto(FileInfo sourceImage, int desiredWidth, int desiredHeight){ //throw error if bouning box is to small if (desiredWidth < 4 || desiredHeight < 4) throw new InvalidOperationException("Bounding Box of Resize Photo must be larger than 4X4 pixels."); var original = Bitmap.FromFile(sourceImage.FullName); //store image widths in variable for easier use var oW = (decimal)original.Width; var oH = (decimal)original.Height; var dW = (decimal)desiredWidth; var dH = (decimal)desiredHeight; //check if image already fits if (oW < dW && oH < dH) return original; //image fits in bounding box, keep size (center with css) If we made it bigger it would stretch the image resulting in loss of quality. //check for double squares if (oW == oH && dW == dH) { //image and bounding box are square, no need to calculate aspects, just downsize it with the bounding box Bitmap square = new Bitmap(original, (int)dW, (int)dH); original.Dispose(); return square; } //check original image is square if (oW == oH) { //image is square, bounding box isn't. Get smallest side of bounding box and resize to a square of that center the image vertically and horizontally with Css there will be space on one side. int smallSide = (int)Math.Min(dW, dH); Bitmap square = new Bitmap(original, smallSide, smallSide); original.Dispose(); return square; } //not dealing with squares, figure out resizing within aspect ratios if (oW > dW && oH > dH) //image is wider and taller than bounding box { var r = Math.Min(dW, dH) / Math.Min(oW, oH); //two dimensions so figure out which bounding box dimension is the smallest and which original image dimension is the smallest, already know original image is larger than bounding box var nH = oH * r; //will downscale the original image by an aspect ratio to fit in the bounding box at the maximum size within aspect ratio. var nW = oW * r; var resized = new Bitmap(original, (int)nW, (int)nH); original.Dispose(); return resized; } else { if (oW > dW) //image is wider than bounding box { var r = dW / oW; //one dimension (width) so calculate the aspect ratio between the bounding box width and original image width var nW = oW * r; //downscale image by r to fit in the bounding box... var nH = oH * r; var resized = new Bitmap(original, (int)nW, (int)nH); original.Dispose(); return resized; } else { //original image is taller than bounding box var r = dH / oH; var nH = oH * r; var nW = oW * r; var resized = new Bitmap(original, (int)nW, (int)nH); original.Dispose(); return resized; } }}
- 3 回答
- 0 關(guān)注
- 920 瀏覽
添加回答
舉報(bào)
0/150
提交
取消