Skip to content

Commit b19aead

Browse files
authored
Merge pull request #53 from dotnet-campus/t/lindexi/MediaConverter
修复图片计算尺寸越界
2 parents 43590b6 + 6c53ad0 commit b19aead

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,20 @@ public static void LimitImageSize(Image<Rgba32> image, int maxPixelCount)
156156
return;
157157
}
158158

159-
var pixelWidth = (int) Math.Sqrt(maxPixelCount * image.Width / (double) image.Height);
160-
var pixelHeight = (int) Math.Sqrt(maxPixelCount * image.Height / (double) image.Width);
159+
// 提前计算 wh 和 hw 的值。而不是使用 maxPixelCount * Width / Height 的写法
160+
// 避免大图的 maxPixelCount * Width 出现越界。如传入尺寸为
161+
// maxImageWidth 507
162+
// maxImageHeight 1095
163+
// maxPixelCount = maxImageWidth x maxImageHeight = 555165
164+
// 图片的尺寸为 4000x4000
165+
// 于是就有 maxPixelCount x Width = 555165 x 4000 = 2220660000 > int.MaxValue = 2147483647
166+
// 出现越界错误
167+
168+
double wh = image.Width / (double) image.Height;
169+
double hw = image.Height / (double) image.Width;
170+
171+
var pixelWidth = (int) Math.Sqrt(maxPixelCount * wh);
172+
var pixelHeight = (int) Math.Sqrt(maxPixelCount * hw);
161173
image.Mutate(context => context.Resize(new Size(pixelWidth, pixelHeight), compand: true));
162174
}
163175

src/MediaConverters/MediaConverters.Tests/Tool/MediaConverterTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,4 +361,35 @@ private Options ToOptions(string fileName, ImageConvertContext imageConvertConte
361361
ConvertConfigurationFile = configFile,
362362
};
363363
}
364+
365+
/// <summary>
366+
/// 这是一些自定义的测试,来源于用户反馈问题
367+
/// 图片太大就不传了
368+
/// </summary>
369+
/// <returns></returns>
370+
#if DEBUG
371+
[TestMethod]
372+
#endif
373+
public async Task CustomTest()
374+
{
375+
var imageFile = @"C:\lindexi\Work\ImageTest\Test1\file.png";
376+
var configFile = @"C:\lindexi\Work\ImageTest\Test1\file.json";
377+
378+
var testFolder = Path.Join(TestHelper.WorkingDirectory.FullName, Path.GetRandomFileName());
379+
Directory.CreateDirectory(testFolder);
380+
var workingFolder = Path.Join(testFolder, "Working");
381+
var outputFile = Path.Join(testFolder, "Output.png");
382+
383+
var options = new Options()
384+
{
385+
WorkingFolder = workingFolder,
386+
InputFile = imageFile,
387+
OutputFile = outputFile,
388+
ConvertConfigurationFile = configFile,
389+
};
390+
391+
var result = await Program.RunAsync(options);
392+
Assert.AreEqual(MediaConverterErrorCode.Success, result);
393+
TestHelper.OpenFileInExplorer(new FileInfo(options.OutputFile));
394+
}
364395
}

0 commit comments

Comments
 (0)