Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 使用Libtiff复制TIFF图像 使用(Tiff iimage=Tiff.Open(“new.tif”、“r”)) { Tiff newiimage=Tiff.Open(“newnew.tif”,“w”); if(image==null) { MessageBox.Show(“无法打开传入图像”); 返回; } 使用(StreamWriter=newstreamwriter(“EnumerateTiffTags.txt”)) { short numberOfDirectories=iimage.numberOfDirectories(); 对于(短d=0;d_C#_.net_Compression_Tiff_Libtiff - Fatal编程技术网

C# 使用Libtiff复制TIFF图像 使用(Tiff iimage=Tiff.Open(“new.tif”、“r”)) { Tiff newiimage=Tiff.Open(“newnew.tif”,“w”); if(image==null) { MessageBox.Show(“无法打开传入图像”); 返回; } 使用(StreamWriter=newstreamwriter(“EnumerateTiffTags.txt”)) { short numberOfDirectories=iimage.numberOfDirectories(); 对于(短d=0;d

C# 使用Libtiff复制TIFF图像 使用(Tiff iimage=Tiff.Open(“new.tif”、“r”)) { Tiff newiimage=Tiff.Open(“newnew.tif”,“w”); if(image==null) { MessageBox.Show(“无法打开传入图像”); 返回; } 使用(StreamWriter=newstreamwriter(“EnumerateTiffTags.txt”)) { short numberOfDirectories=iimage.numberOfDirectories(); 对于(短d=0;d,c#,.net,compression,tiff,libtiff,C#,.net,Compression,Tiff,Libtiff,我正在打开一个文件,读取标记值并将其写入另一个TIFF文件。该问题发生在SetField函数中。 我试着调试它,一切似乎都很好,不太明白它为什么会抛出错误。在LibTiff中,我使用的SetField方法期望的是实际值,而不是FieldValue对象。因此,您可以尝试以下方法: using (Tiff iimage = Tiff.Open("new.tif", "r")) { Tiff newiimage = Tiff.Open("newnew.tif

我正在打开一个文件,读取标记值并将其写入另一个TIFF文件。该问题发生在SetField函数中。
我试着调试它,一切似乎都很好,不太明白它为什么会抛出错误。

在LibTiff中,我使用的
SetField
方法期望的是实际值,而不是
FieldValue
对象。因此,您可以尝试以下方法:

      using (Tiff iimage = Tiff.Open("new.tif", "r"))
      {
          Tiff newiimage = Tiff.Open("newnew.tif", "w");
          if (image == null)
          {
              MessageBox.Show("Could not open incoming image");
              return;
          }

          using (StreamWriter writer = new StreamWriter("EnumerateTiffTags.txt"))
          {
              short numberOfDirectories = iimage.NumberOfDirectories();
              for (short d = 0; d < numberOfDirectories; ++d)
              {
                iimage.SetDirectory((short)d);

                for (ushort t = ushort.MinValue; t < ushort.MaxValue; ++t)
                {
                  TiffTag tag = (TiffTag)t;
                  var value = iimage.GetField(tag);
                  if (value != null)
                  {
                     for (int j = 0; j < value.Length; j++)
                     {
                         writer.WriteLine("{0}", tag.ToString());
                         writer.WriteLine("{0} : {1}", 
                            value[j].Value.GetType().ToString(), value[j].ToString());
                     }
                     newiimage.SetField(tag, value);// this line is giving me..
  // an error "Unable to cast object of type 'BitMiracle.LibTiff.Classic.FieldValue[]' 
  // to type 'System.IConvertible'"
                  }
               }
           }
        }
    }

根据该方法的Doc,其返回集中既有实标记,也有伪标记

TiffTag.JPEGQUALITY是伪标记的一个示例

您不能设置伪标记,因此必须将它们从写循环中排除

列表可能会帮助您编写筛选器

为了使过滤器更加完整,可能还需要写出无法写入的标记


我不知道伪标记的确切性质,但考虑到tiff格式的开放性,建议您将错误处理包括在未被超越的迟到者中。

谢谢您的回复。那么,您的解决方案中“值”的数据类型是什么。因为我试图提取和复制所有标签,“值”可以是任何东西,对吗?如果我的方法看起来很幼稚,请原谅。谢谢你提供的信息……因此,通过复制标签复制tiff图像并不像我想的那么简单。首先,你可以尝试将设置字段包装在一个try-catch块中,然后记录/写出失败的标签以进行检查,如果它们确实是伪标签。你的想法帮助我过滤了它们。所以,我还有一个问题。如何在我的图像中设置伪标记(压缩、光度控制、重新显示等)?我们应该全部手动设置吗?我还没有完全研究文档;从我读到的一点来看,我相信这些伪标记是只读的。我相信库例程创建它们是为了您的方便或内部使用,它们实际上不是tiff文件的一部分。所以你不能也不需要设置它们。它们的值可能来自其他标记或图像数据。
newiimage.SetField(tag, value.Select(v => v.Value).ToArray());