【发布时间】:2018-11-01 07:32:39
【问题描述】:
我创建了 .NET Core 控制台应用程序并添加了对 System.Drawing.Common nuget 的引用。
我正在尝试从ms docs 运行以下代码,但它在bitmap1.GetEncoderParameterList 和System.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