代码之家  ›  专栏  ›  技术社区  ›  Guffa

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

  •  7
  • Guffa  · 技术社区  · 14 年前

    我有一个运行在WindowsServer2008上的应用程序,它正在处理上载的图像。目前,它每天成功处理大约8000个图像,每个图像创建11个不同的大小。

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

    上传只接受扩展名为jpeg(JPG/jpeg/jpe)或类型为jpeg mime的文件,从我可以看出,这些图像实际上是jpeg图像。如果我在服务器上的Windows资源管理器中查看图像文件,它可以成功地从文件中提取缩略图,但是如果我尝试打开它,我会从画图中收到错误消息“这不是有效的位图文件,或者当前不支持其格式”。

    如果我将图像复制到自己的计算机上,运行Windows7,打开图像没有问题。它适用于绘画、Windows照片查看器、Adobe Bridge和Photoshop。如果我尝试使用image.fromstream加载图像,就像在服务器上运行的应用程序中一样,它加载得很好。(我已将文件复制回服务器,但它仍然不起作用,因此复制过程中没有任何更改文件的内容。)

    当我查看Bridge中的图像信息时,我发现这些图像是使用Picasa3.0创建的,但除此之外,我看不到它们的任何特殊之处。我还没有发现任何人有同样的问题,或任何已知的问题,像这样与Picasa应用程序。

    有没有人有过类似的问题,或者知道使用Picasa创建的图像是否有特殊之处?服务器上是否需要安装任何图像编解码器来处理所有类型的JPEG图像?

    下面是一个不在服务器上加载的映像示例: gdi-example.jpg (192 kb)。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Guffa    14 年前

    从专家交流中,我得到了一个使用BitmapImage对象加载图像并将其重新保存到MemoryStream的示例。由于某种原因,位图图像可以加载位图对象无法加载的图像。

    我还必须从文件中加载数据,并将其作为内存流提供给位图图像,这样它就不会锁定文件。

    所以,这是我现在使用的最后一个代码(sans-some-logging):

    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);
      }
    }
    
        2
  •  0
  •   Community Tales Farias    7 年前

    我认为它一定是Picasa生成的exif头信息中的某个内容。我也有同样的问题-处理成千上万的图像,但偶尔有一些不想处理。我在这里使用了克隆修复: How can I get .Net to save this image?