在程序中写了一段合成两幅照片为新的一幅照片的代码,在Windows 2008 Server 以上的操作系统中可以正常运行,但是在 Windows 2003 Server 中会抛出未处理的异常:
ExternalException (0x80004005): GDI+ 中发生一般性错误 ...
报错的位置是Image1.Save 部分,代码如下:
Image drawSignImage = new Bitmap(acceptSignImage, signImgWidth, signImgHeight);
Graphics g = Graphics.FromImage(Image1);
g.DrawImage(drawSignImage, signRectange.Left, signRectange.Top);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
Image1.Save(ms, ImageFormat.Jpeg);
ms.Position = 0;
byte[] resultBytes = new byte[ms.Length];
ms.Read(resultBytes, 0, resultBytes.Length);
return resultBytes;
}
因为在 2008 Server 上运行正常,开始以为是图片格式在 Window 2003 版本上不被支持。同时也上网搜索了一下,大部分都说是文件权限的问题,但是我这个代码是直接写入 Stream 对象,并不是磁盘文件。
通过下面这个文章(链接:https://www.cnblogs.com/moy-1313133/p/6734393.html),思考了一下,也有可能是同一个 Image 对象不能同时被两个流处理,所以改换了一下思路,新创建一个 Image 返回,问题在 Windows 2003 上未再出现。
Image drawSignImage = new Bitmap(acceptSignImage, signImgWidth, signImgHeight);
Image Image2 = new Bitmap(Image1);
Graphics g = Graphics.FromImage(Image2);
g.DrawImage(drawSignImage, signRectange.Left, signRectange.Top);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
Image2.Save(ms, ImageFormat.Jpeg);
ms.Position = 0;
byte[] resultBytes = new byte[ms.Length];
ms.Read(resultBytes, 0, resultBytes.Length);
return resultBytes;
}
上面的一些宽度高度和位置的变量,请自行调整。