【问题标题】:System.OverflowException: 'Arithmetic operation resulted in an overflow.'System.OverflowException: '算术运算导致溢出。'
【发布时间】:2018-11-01 07:32:39
【问题描述】:

我创建了 .NET Core 控制台应用程序并添加了对 System.Drawing.Common nuget 的引用。 我正在尝试从ms docs 运行以下代码,但它在bitmap1.GetEncoderParameterListSystem.OverflowException 上失败:

'算术运算导致溢出。'

这段代码有什么问题?我做的东西违法吗?

class Program
{

   public static void Main(string[] args)
   {
      new Program().GetSupportedParameters();
   }
   private void GetSupportedParameters()
   {
       Bitmap bitmap1 = new Bitmap(1, 1);
       ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
       //this one also does not work:
       //Bitmap bitmap1 = new Bitmap(Image.FromFile(@"C:\temp\0\2.png"));
       //ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Png);
       EncoderParameters paramList = bitmap1.GetEncoderParameterList(jpgEncoder.Clsid);
       EncoderParameter[] encParams = paramList.Param;
       StringBuilder paramInfo = new StringBuilder();

       for (int i = 0; i < encParams.Length; i++)
       {
           paramInfo.Append("Param " + i + " holds " + encParams[i].NumberOfValues +
                    " items of type " +
                encParams[i].ValueType + "\r\n" + "Guid category: " + encParams[i].Encoder.Guid + "\r\n");

       }            
   }

   private ImageCodecInfo GetEncoder(ImageFormat format)
   {
       ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

       foreach (ImageCodecInfo codec in codecs)
       {
          if (codec.FormatID == format.Guid)
          {
               return codec;
          }
       }
       return null;
    }
 }

堆栈跟踪:

at System.Drawing.Imaging.EncoderParameters.ConvertFromMemory(IntPtr memory)
at System.Drawing.Image.GetEncoderParameterList(Guid encoder)
at ConsoleApp16.Program.GetSupportedParameters() in Program.cs:line 19
at ConsoleApp16.Program.Main(String[] args)
in Program.cs:line 13

更新 这个也崩溃了:

Bitmap bitmap1 = new Bitmap(Image.FromFile(@"C:\temp\0\2.png"));
ImageCodecInfo pngEncoder = GetEncoder(ImageFormat.Png);

【问题讨论】:

  • 我的猜测是您尝试加载的图像已损坏,或者不是图像,或者格式不受支持。根据经验,.NET 中的图像加载代码在这种错误处理方面相当短,所以它可能只是试图为 TB 大小的图像构建内存,因为它从文件中获得了非常高的宽度和高度值,并且在计算要分配多少内存来分配溢出的总量。
  • @LasseVågsætherKarlsen 我尝试了另一个位图,同样的故事 Bitmap bitmap1 = new Bitmap(Image.FromFile(@"C:\temp\0\2.png")); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Png);
  • @LasseVågsætherKarlsen 不,对于 png,我使用 pngdecoder。

标签: c# .net-core system.drawing.common


【解决方案1】:

编辑:似乎它在 .NET Framework 上运行良好,并且在 .NET Core 2.1 中作为 OP 抛出异常。

EDIT2:似乎这是一个已知问题,在此处列出:https://github.com/dotnet/docs/issues/5607

【讨论】:

  • 我看不出它与 Windows 窗体有什么关系,除了一个问题上的标签,但如果你在 Windows 窗体或其他任何地方调用该方法都没关系。从我的角度来看,似乎只是缺少 microsoft 为 .net core 提供的最新文档。
  • 感谢您的确认,我在 corefx 存储库中创建了错误。您引用的错误与文档有关。但我的示例与代码相关,而不是文档。这不应该发生。
  • 我仍然不明白你的这部分答案:你调用你的方法 GetSupporterParameters 错误。这并没有错。您可以将所有方法设为静态,也可以像我一样。我的方法不需要将所有方法都设为静态。
  • 我在 Windows 10(新型 WPF 项目)上的 .NET Framework 4.8 中遇到了同样的错误。
【解决方案2】:

这是 .NET Core 中的一个错误,正在为 .NET Core 5.0 解决:请参阅 https://github.com/dotnet/corefx/pull/40181

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 2017-06-06
    • 2011-05-15
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多