我正在尝试使用以下函数调整大小并进行图像处理并收到此错误:
异常详细信息:System.Runtime.InteropServices.ExternalException:GDI +中发生一般错误。
在这一行:
imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters);
为什么会发生这种情况的任何想法?
private byte[] GetCachedImage(string cachedFileName, string pathToImage, int width, int height)
{
if (!System.IO.File.Exists(cachedFileName) || (System.IO.File.GetLastWriteTime(pathToImage) > System.IO.File.GetLastWriteTime(cachedFileName)))
{
Image imageToResize = Image.FromFile(pathToImage);
Image imageConvertedToBitmap = new Bitmap(width, height);
Graphics graphicsController = Graphics.FromImage(imageConvertedToBitmap);
graphicsController.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphicsController.SmoothingMode = SmoothingMode.HighQuality;
graphicsController.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphicsController.CompositingQuality = CompositingQuality.HighQuality;
graphicsController.DrawImage(imageToResize, 0, 0, width, height);
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);
MemoryStream memoryStream = new MemoryStream();
imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters);
imageConvertedToBitmap.Save(memoryStream, info[1], encoderParameters);
imageToResize.Dispose();
imageConvertedToBitmap.Dispose();
graphicsController.Dispose();
parameters.Dispose();
encoderParameters.Dispose();
return memoryStream.GetBuffer();
}
byte[] buffer = null;
try
{
FileStream fileStream = new FileStream(cachedFileName, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream);
long totalBytes = new FileInfo(cachedFileName).Length;
buffer = binaryReader.ReadBytes((Int32)totalBytes);
fileStream.Close();
fileStream.Dispose();
binaryReader.Close();
}
catch { }
return buffer;
}
答案 0 :(得分:4)
这是权限错误。必须为我保存的目录提供适当的写入权限。有时这是简单的事情。 :)
根据我的阅读,当得到这个GDI +错误时,首先要检查的是权限,因为它几乎总是一个安全问题的指示器。
答案 1 :(得分:0)
尝试Save
的重载不会将EncoderParameters
作为参数。它应该可以正常工作并生成您正在寻找的已调整大小的图像。
答案 2 :(得分:0)
我有一次这个错误,那是因为我试图通过Bitmap对象在一个锁定的文件下保存。 我们只看到你的方法,但不知道你如何使用它。
我认为您的代码中存在一些语法问题:您必须对代码中的所有禁用对象使用“using(){}”。
using(Image imageToResize = Image.FromFile(pathToImage))
using(Image imageConvertedToBitmap = new Bitmap(width, height))
etc.
{
}
答案 3 :(得分:0)
您在另一个实例上遇到此错误。
首先了解此错误的含义:
出现错误时,请转到任务管理器并导航至“详细信息”选项卡。
右键单击表标题,然后单击选择列。
每当否时就会弹出错误。程序的GDI对象数量超过 10000,因为10000是限制。
检查System.Drawing ....在您的代码中运行了多少次。 防止反复创建诸如“字体”或“图像”之类的对象。 而是设置参考点。