如何让.NET保存此图像?

Sam*_*ron 9 .net c# image

我有这个JPEG图像,在Picasa,Photoshop,网络浏览器等中打开很好,但在.NET中它只是拒绝工作.

 Image image = Image.FromFile(@"myimage.jpg");
 image.Save(@"myimage2.jpg");
 // ExternalException - A generic error occurred in GDI+.
Run Code Online (Sandbox Code Playgroud)

有没有办法在.NET中恢复它,所以我可以使用它(我需要调整它),而不是在源头修复问题?

完整的异常细节:

source: System.Drawing
type: System.Runtime.InteropServices.ExternalException
message: A generic error occurred in GDI+.
stack trace:
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
   at System.Drawing.Image.Save(String filename, ImageFormat format)
   at System.Drawing.Image.Save(String filename)
   at ConsoleApplication20.Program.Main(String[] args) in C:\Users\sam\Desktop\S
ource\ConsoleApplication20\ConsoleApplication20\Program.cs:line 16

此问题可在Windows 7上重现.

Mar*_*ell 12

这似乎有效:

    using (Image image = Image.FromFile(@"c:\dump\myimage.jpg"))
    using (Image clone = new Bitmap(image))
    {
        clone.Save(@"c:\dump\myimage2.jpg", ImageFormat.Jpeg);
    }
Run Code Online (Sandbox Code Playgroud)

image实际上是一个Bitmap反正,所以它应该是相似的.奇怪的myimage2是小了5k - jpeg的乐趣;-p

关于这一点的一个好处是你可以同时调整大小(你的实际意图):

    using (Image image = Image.FromFile(@"c:\dump\myimage.jpg"))
    using (Image clone = new Bitmap(image,
        new Size(image.Size.Width / 2, image.Size.Height / 2)))
    {

        clone.Save(@"c:\dump\myimage2.jpg", ImageFormat.Jpeg);
    }
Run Code Online (Sandbox Code Playgroud)


Aar*_*ght 3

它似乎在 Windows XP 和 Vista 上运行良好,但在 Windows 7 上则不然。

我在 Microsoft Connect 上找到了这个问题。它与您的问题并不相同,但看起来非常相似 -ExternalException尝试重新保存 JPEG 文件时发生的情况。目前有 16 个重现,其中一些评论表明该问题在最终版本中仍然存在。

因此,它看起来不是 .NET Framework 中的错误,而是 Windows 7 中的错误 - 具体来说,是 API 中的错误GdipSaveImageToStream

正如其他人提到的,解决方法是强制转换为另一种格式。这就是马克和达林的答案所做的。显然,JPEG 文件中存在一些“额外”信息,从而触发了 Win7 中的错误。当您转换为不同的格式或制作位图副本时,该信息(也许是 EXIF?)将被消除。