我有这个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)
它似乎在 Windows XP 和 Vista 上运行良好,但在 Windows 7 上则不然。
我在 Microsoft Connect 上找到了这个问题。它与您的问题并不相同,但看起来非常相似 -ExternalException尝试重新保存 JPEG 文件时发生的情况。目前有 16 个重现,其中一些评论表明该问题在最终版本中仍然存在。
因此,它看起来不是 .NET Framework 中的错误,而是 Windows 7 中的错误 - 具体来说,是 API 中的错误GdipSaveImageToStream。
正如其他人提到的,解决方法是强制转换为另一种格式。这就是马克和达林的答案所做的。显然,JPEG 文件中存在一些“额外”信息,从而触发了 Win7 中的错误。当您转换为不同的格式或制作位图副本时,该信息(也许是 EXIF?)将被消除。
| 归档时间: |
|
| 查看次数: |
6901 次 |
| 最近记录: |