【问题标题】:Why am I receiving an exception on my server when creating a TIFF?为什么我在创建 TIFF 时在我的服务器上收到异常?
【发布时间】:2013-07-03 09:29:43
【问题描述】:

我只在我的 Windows Server Datacenter 2007 SP 2 服务器上收到异常,而不是在我的本地 Windows 7 PC 上。

我已将有问题的调用封装在 try-catch-finally 中,以便程序的其余部分可以正常执行。

如何解决异常并在服务器上正确生成 TIFF?

例外:

System.Runtime.InteropServices.ExternalException:
A generic error occurred in GDI+. at System.Drawing.Image.Save(String
filename, ImageCodecInfo encoder, EncoderParameters encoderParams) at
TSEmails.TaskScheduleSlippage.CreateTIFFImageReport(DataTable
dataOfManyProjects, String fileName) in
D:\TSEmail\TSEmails\TaskScheduleSlippage.cs:line 236 at
TSEmails.TaskScheduleSlippage.GenerateOrganizationalEmail(DataTable
dataOfManyProjects, DataTable emailSettings) in
D:\TSEmail\TSEmails\TaskScheduleSlippage.cs:line 92

抛出异常的代码行:

tiffImage.Save(fileName, info, encoderparams);

相关代码:

private static void CreateTIFFImageReport(DataTable dataOfManyProjects, string fileName)
{//Line:210
    ///The following code was originally taken from http://www.yoursearchbuddy.com/create-tiff-image-multiple-images
    ///on Thursday May 9, 2013

    //Selecting the image encoder
    System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;
    ImageCodecInfo info = null;
    info = (from ie in ImageCodecInfo.GetImageEncoders()
            where ie.MimeType == "image/tiff"
            select ie).FirstOrDefault();
    EncoderParameters encoderparams = new EncoderParameters(2);
    encoderparams.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
    encoderparams.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 4L);

    //Adding graphs of each project to TIFF image
    Bitmap tiffImage = null;
    Image img = null;
    foreach (DataRow row in dataOfManyProjects.DefaultView.ToTable(true, "Project Code").Rows)
    {
        string projectCode = row["Project Code"].ToString();
        img = Image.FromFile("C:\\LMS\\Logs\\" + masterTitleWS + "ReportOf" + projectCode.Replace(" ", string.Empty) + ".jpg", false);
        if (row.Table.Rows.IndexOf(row) == 0)
        {
            //Saving the bitmap
            tiffImage = new Bitmap(250, 250, PixelFormat.Format8bppIndexed);//This line was put which SEEMED to have solved the problem, according to a developer,but there is no prove that it ran correctly, and is still giving an exception
            tiffImage = (Bitmap)img;
            tiffImage.Save(fileName, info, encoderparams);
            encoderparams.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
        }
        else
        {
            //Adding another image
            tiffImage.SaveAdd(img, encoderparams);
        }
        //img.Dispose();
    }
    //close file
    encoderparams.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
    tiffImage.SaveAdd(encoderparams);
    tiffImage.Dispose();
}//Line:250

【问题讨论】:

  • 您保存的位置是否存在?应用程序是否具有保存文件所需的权限?
  • 您的服务或服务器应用程序以哪个 Windows 用户身份运行?您需要确保它具有权限。它可能是本地主机。
  • 我也有类似的问题。参数无效。在 System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) 同时压缩最初上传的 tiff 文件,然后将其保存回服务器上。该代码在本地机器上运行良好。
  • 是的,该位置存在。
  • 应用程序正在以管理员身份运行。我们的网络管理员也提出了权限问题,但这不是问题。

标签: c# windows-server-2008 tiff encoder pixelformat


【解决方案1】:

经过一番折腾,第222行最后一个参数由4L改成了24L,果然奏效了!感谢我的 PM!

encoderparams.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 24L);

似乎旧版本的 Windows 不支持某些 TIFF 编解码器。旧代码也在 Windows Server 2012 上进行了测试,并且可以正常工作。

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多