GDI +中发生了一般错误

时间:2011-01-26 17:48:23

标签: c# resize drawing gdi+

我正在尝试使用以下函数调整大小并进行图像处理并收到此错误:

异常详细信息: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;
        }

4 个答案:

答案 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)

您在另一个实例上遇到此错误。

首先了解此错误的含义:

  1. 出现错误时,请转到任务管理器并导航至“详细信息”选项卡。

  2. 右键单击表标题,然后单击选择列。

  3. 勾选GDI对象复选框。
  4. 现在在表中找到程序的名称,并检查编号。 GDI对象。
  5. 它将超过10000或必须为10000。

每当否时就会弹出错误。程序的GDI对象数量超过 10000,因为10000是限制。

检查System.Drawing ....在您的代码中运行了多少次。 防止反复创建诸如“字体”或“图像”之类的对象。 而是设置参考点。