Скопируйте изображение TIFF с помощью Libtiff

      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'"
                  }
               }
           }
        }
    }

Я открываю файл, читая значения тегов и записывая их в другой файл TIFF. Проблема возникает в функции SetField. Я попытался отладить его, все кажется хорошо, не могу понять, почему он выдает ошибку.

2 ответа

Решение

Согласно Doc метода GetField в его возвращаемом наборе присутствуют как действительные, так и псевдо-теги.

TiffTag.JPEGQUALITY является примером псевдо-тега.

Вы не можете установить псевдо-теги, поэтому вы должны исключить их из цикла записи.

Список известных тегов может помочь вам написать фильтр.

Может также потребоваться выписать теги, которые нельзя записать, чтобы сделать фильтр более полным.

Я не знаю точной природы псевдотэга, но, учитывая открытость формата tiff, вам, вероятно, рекомендуется включить обработку ошибок для непредвиденных опоздавших..

В LibTiff, который я использую SetField Метод ожидает фактические значения, а не FieldValue объекты. Так что вы можете попробовать что-то вроде этого:

newiimage.SetField(tag, value.Select(v => v.Value).ToArray());
Другие вопросы по тегам