2010-04-15 36 views
6

我有一个在Windows Server 2008上运行的应用程序,它正在处理上传的图像。目前,它每天成功处理大约8000张图像,为每张图像创建11种不同的尺寸。某些图像在Windows Server 2008上无法加载

我的问题是,有时应用程序无法加载一些图像,我得到的错误“System.Runtime.InteropServices.ExternalException:在GDI +发生了一般性错误。”。

上传只接受带有JPEG扩展名(jpg/jpeg/jpe)或JPEG MIME类型的文件,并且我可以告诉那些图像实际上是JPEG图像。如果我在服务器上的Windows资源管理器中查看映像文件,它可以成功从文件中提取缩略图,但如果我尝试打开它,则会收到错误消息“这不是有效的位图文件,或者它的格式是目前不支持。“从油漆。

如果我将图像复制到我自己的计算机上,运行Windows 7,打开图像没有问题。它适用于Paint,Windows照片查看器,Adobe Bridge和Photoshop。如果我尝试使用Image.FromStream以与在服务器上运行的应用程序相同的方式加载图像,则它加载得很好。 (我已将文件复制回服务器,但它仍不起作用,所以在复制过程中没有任何更改。)

当我查看Bridge中的图像信息时,发现图像是使用Picasa 3.0创建的,但除此之外,我无法看到它们的任何特别之处。我还没有发现任何人有同样的问题,或任何已知的与Picasa应用程序类似的问题。

有没有人有类似的问题,或知道是否有什么特别的关于使用Picasa创建的图像?是否有任何图像编解码器需要在服务器上安装以处理各种JPEG图像?

以下是未在服务器上加载的图像示例:gdi-example.jpg(192 kB)。

+0

有趣。我可以在Windows Server 2008和2003上使用您的示例图像来确认这一点(尽管图片查看器在2003年为我提供了1x1像素的图像)。无法看到图像有任何问题。在Windows 7上,它打开罚款。这可能是一些安全相关的GDI补丁或其他东西,但我不知道该怎么做。 – 2010-04-15 09:25:42

+0

@Pekka:谢谢你的确认,至少我知道问题可能与操作系统版本有关,而不仅仅是这个服务器。 – Guffa 2010-04-15 10:04:21

回答

2

来自专家交流我有一个使用BitmapImage对象加载图像并将其重新保存到MemoryStream的示例。 BitmapImage可以由于某种原因加载Bitmap对象不能的图像。

我还必须从文件中加载数据并将其作为MemoryStream传送到BitmapImage,以便它不会锁定文件。

所以,这是最后的代码,我现在用的(没有一些记录):

using WpfImaging = System.Windows.Media.Imaging; 
... 

byte[] data = File.ReadAllBytes(FileName); 

Image master; 
using (MemoryStream source = new MemoryStream(data)) { 
    var img = new WpfImaging.BitmapImage(); 
    img.BeginInit(); 
    img.StreamSource = source; 
    img.EndInit(); 
    WpfImaging.BmpBitmapEncoder encoder = new WpfImaging.BmpBitmapEncoder(); 
    using (MemoryStream m = new MemoryStream()) { 
    encoder.Frames.Add(WpfImaging.BitmapFrame.Create(img)); 
    encoder.Save(m); 
    master = new Bitmap(m); 
    } 
} 
0

我觉得一定有什么东西在Picasa中通过产生的EXIF头信息。我遇到了同样的问题 - 处理数以千计的图像,但偶尔有几个不想处理。我在这里使用了克隆修复程序:How can I get .Net to save this image?

相关问题