某些映像无法在Windows Server 2008上加载

时间:2010-04-15 08:41:20

标签: .net image windows-server-2008 gdi+

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

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

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

如果我将图像复制到我自己的计算机上,运行Windows 7,打开图像没有问题。它适用于Paint,Windows Photo Viewer,Adobe Bridge和Photoshop。如果我尝试使用Image.FromStream加载图像的方式与在服务器上运行的应用程序相同,则加载就好了。 (我已将文件复制回服务器,但它仍无效,因此复制过程中没有任何内容可以更改它。)

当我查看Bridge中的图像信息时,我发现图像是使用Picasa 3.0创建的,但除此之外,我看不出有什么特别之处。我还没有发现任何人遇到同样的问题,或者使用Picasa应用程序遇到任何已知问题。

有没有人遇到类似问题,或者知道使用Picasa创建的图片是否有特别之处?是否有任何图像编解码器需要在服务器上安装才能处理各种JPEG图像?

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

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:0)

我认为它必须是Picasa生成的EXIF标题信息中的内容。我遇到了同样的问题 - 处理成千上万的图像,但偶尔会有一些不想处理。我在这里使用了克隆修补程序:How can I get .Net to save this image?