为什么GDI +不会保存这张图片?

时间:2013-06-18 21:33:02

标签: c# image gdi+

我正在尝试使用GDI +保存文件,但我只是得到了“GDI +中发生了一般错误”异常。这段代码适用于几乎所有照片,但是这一张(我们每天处理数千张照片,这是我听过的第一张照片)。我认为它可能与exif数据有关,或者可能与摄影师相机或编辑器中的其他东西有关。

Here's the photo in question

以下是使用此照片重现错误的代码:

class Program
{
    static void Main(string[] args)
    {
        using (var img = Image.FromFile("Err.jpg"))
        using (var ms = new MemoryStream())
        {
            img.Save(ms, ImageFormat.Jpeg);
        }
    }
}

我应该如何在GDI +中处理这个问题?有没有办法去除导致问题的额外内容?

2 个答案:

答案 0 :(得分:0)

似乎首先将图像转换为bmp可以解决问题。很高兴找到一种更有效的方法(不需要创建多个图像并加载到内存中),但这是我迄今为止发现的最好的。

static void Main(string[] args)
{
    var path = @"gdi_err.jpg";
    using (var img1 = Image.FromFile(path))
    using (var ms1 = new MemoryStream())
    {
        img1.Save(ms1, ImageFormat.Bmp);
        ms1.Position = 0;
        using (var img2 = Image.FromStream(ms1))
        using (var ms2 = new MemoryStream())
        {
            img2.Save(ms2, ImageFormat.Jpeg);
        }
    }
}

答案 1 :(得分:0)

您图像的exif配置文件似乎是个问题。当我删除它时,我可以将图像保存到内存流。我使用Magick.NET删除了exif配置文件。

using (MagickImage magickImage = new MagickImage())
{
  using (var magickStream = new MemoryStream())
  {
    magickImage.Read(@"gdi_err.jpg");
    magickImage.Strip();
    magickImage.Write(magickStream);
    magickStream.Position = 0;

    // This part is just here to demonstrate that saving the image works.
    // You don't need it because magickStream already contains the data you want.
    using (Image image = Image.FromStream(magickStream))
    {
      using (var ms = new MemoryStream())
      {
        image.Save(ms, ImageFormat.Jpeg);
      }
    }
  }
}