在C#中处理损坏的JPEG

时间:2010-03-19 19:04:58

标签: c# image-processing windows-server-2008 jpeg

我们有一个从远程服务器提取图像的过程。大多数时候,我们很高兴,图像有效,我们不会超时等等。但是,每隔一段时间我们就会看到类似这样的错误:

Unhandled Exception: System.Runtime.InteropServices.ExternalException: A generic
 error occurred in GDI+.
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderPa
rameters encoderParams)
   at ConsoleApplication1.Program.Main(String[] args) in C:\images\ConsoleApplic
ation1\ConsoleApplication1\Program.cs:line 24

在无法在本地重现之后,我们仔细观察了图像,发现有文物,让我们怀疑是腐败。

仅使用相关图像创建了一个丑陋的小单元测试,并且无法像预期的那样在Windows 7上重现错误。但是在Windows Server 2008上运行我们的单元测试后,我们每次都会看到此错误。

有没有办法在编写jpegs时指定非严格性?我们可以使用某种检查/修复方法吗?

单元测试代码段:

 var r = ReadFile("C:\\images\\ConsoleApplication1\\test.jpg");

        using (var imgStream = new MemoryStream(r))
        {
            using (var ms = new MemoryStream())
            {
                var guid = Guid.NewGuid();
                var fileName = "C:\\images\\ConsoleApplication1\\t" + guid + ".jpg";
                Image.FromStream(imgStream).Save(ms, ImageFormat.Jpeg);
                using (FileStream fs = File.Create(fileName))
                {
                    fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
                }
            }

        }

2 个答案:

答案 0 :(得分:1)

AFAIK,不,在解码JPG文件时,没有办法要求GDI +更宽松。在任何有消费者上传任意JPG文件的应用程序中,您会看到GDI +异常中的一些常规错误一直被抛出。您可以尝试使用WPF来读取您的图像,但我怀疑它也会反对损坏图像。

答案 1 :(得分:0)

也许这不是你的直接问题的答案,但是你为什么不拉图像和它的md5(或任何其他哈希)来验证这个图像的正确性?