Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#一般错误GDI+;保存时添加_C#_.net_Gdi+_Tiff - Fatal编程技术网

C#一般错误GDI+;保存时添加

C#一般错误GDI+;保存时添加,c#,.net,gdi+,tiff,C#,.net,Gdi+,Tiff,我正在尝试创建一个小程序,从文件夹中获取一组多页TIFF文件,删除首页,并使用相同的名称将其余页面保存到单独的输出文件夹中 文件可以毫无问题地保存到输出文件夹中,但当文件到达第二个文档上的SaveAdd函数时,我得到了“GDI+中发生的一般错误”。第一个文档(输出7页)正确添加所有页面。尝试在初始页面之后添加其他页面/框架时,第二个文档失败。我尝试了不同的文档,如第一个和第二个,页数不同。有人能解释一下这个问题吗 using System; using System.Collections.Ge

我正在尝试创建一个小程序,从文件夹中获取一组多页TIFF文件,删除首页,并使用相同的名称将其余页面保存到单独的输出文件夹中

文件可以毫无问题地保存到输出文件夹中,但当文件到达第二个文档上的SaveAdd函数时,我得到了“GDI+中发生的一般错误”。第一个文档(输出7页)正确添加所有页面。尝试在初始页面之后添加其他页面/框架时,第二个文档失败。我尝试了不同的文档,如第一个和第二个,页数不同。有人能解释一下这个问题吗

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace FrontPageRemover
{
    class Program
    {
        static void Main(string[] args)
        {
            Image frame;
            int pages;
            string fileName;

            string folderPath = @"TIFF\Tiff Files";
            string[] files = Directory.GetFiles(folderPath);
            Image image;

            Encoder encoder = Encoder.SaveFlag;
            ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);

            foreach (string file in files)
            {
                image = Image.FromFile(file);
                pages = image.GetFrameCount(FrameDimension.Page);
                image.SelectActiveFrame(FrameDimension.Page, 1);

                fileName = Path.GetFileName(file);
                image.Save(@"TIFF\Files Out\" + fileName, encoderInfo, encoderParams);

                for (int index = 2; index < pages; index++)
                {
                    image.SelectActiveFrame(FrameDimension.Page, index);
                    encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);
                    image.SaveAdd(encoderParams);                     
                }

                encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
                image.SaveAdd(encoderParams);
                image.Dispose();
            }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用系统图;
使用系统、绘图、成像;
使用System.IO;
名称空间FrontPageRemover
{
班级计划
{
静态void Main(字符串[]参数)
{
镜框;
整版;
字符串文件名;
字符串folderPath=@“TIFF\TIFF文件”;
string[]files=Directory.GetFiles(folderPath);
图像;
编码器=编码器.SaveFlag;
ImageCodecInfo encoderInfo=ImageCodecInfo.GetImageEncoders().First(i=>i.MimeType==“image/tiff”);
EncoderParameters encoderParams=新的EncoderParameters(1);
encoderParams.Param[0]=新的EncoderParameter(编码器,(长)EncoderValue.MultiFrame);
foreach(文件中的字符串文件)
{
image=image.FromFile(文件);
pages=image.GetFrameCount(FrameDimension.Page);
image.SelectActiveFrame(FrameDimension.Page,1);
fileName=Path.GetFileName(文件);
image.Save(@“TIFF\Files Out\”+文件名,encoderInfo,encoderParams);
对于(int index=2;索引<页面;索引++)
{
image.SelectActiveFrame(FrameDimension.Page,index);
encoderParams.Param[0]=新的EncoderParameter(编码器,(长)EncoderValue.FrameDimensionPage);
image.SaveAdd(encoderParams);
}
encoderParams.Param[0]=新的EncoderParameter(编码器,(长)EncoderValue.Flush);
image.SaveAdd(encoderParams);
image.Dispose();
}
}
}
}

关于编码器参数未正确更新/处理,评论为我指出了正确的方向

问题在于

encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);

处于循环之外。因此,第一个文档工作正常,但第二个文档失败

EncoderParameter
类实现了
IDisposable
,因此应该进行处理。你的代码泄露了它。考虑使用<代码>使用块来保存您自己,不必向整个代码发送调用< >处理< /代码>。可能还有其他需要处理的对象。仔细检查代码是否存在泄漏。值得一提的是,当GDI+中出现错误时,您总是会收到此错误消息,
系统。Drawing
命名空间是GDI+的一个大包装器。我们设法解决了它。取消勾选“首选32位”复选框并没有解决问题,因此它重新迭代了我之前假设的循环中没有清除或触发的内容。我开始在IDispose上阅读(我自学成才,所以每次编写代码时,我至少需要查看一件事情!),并意识到我在循环之外设置了Param。把它放进去解决了这个问题。谢谢你的指点:)