Скопируйте изображение 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. Пробовал отлаживать, вроде все нормально, не могу понять, почему выдает ошибку.


person harsha217    schedule 14.07.2014    source источник


Ответы (2)


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

TiffTag.JPEGQUALITY — это пример псевдотега.

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

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

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

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

person TaW    schedule 14.07.2014
comment
хорошо, спасибо за информацию .... так что копирование изображения в формате tiff путем копирования тегов не так просто, как я думал - person harsha217; 14.07.2014
comment
Что ж, для начала вы можете попробовать просто обернуть SetField в блок try-catch и зарегистрировать/записать неудачные теги, чтобы проверить, действительно ли они являются псевдотегами. - person TaW; 14.07.2014
comment
Ваша идея помогла мне отфильтровать их. Итак, у меня есть еще один вопрос. Как установить псевдотеги (сжатие, фотометрия, ResUnit и т. д. в моем изображении)? Мы должны установить их все вручную? - person harsha217; 14.07.2014
comment
Я не изучил документы полностью; из того немногого, что я читал, я считаю, что эти псевдотеги доступны только для чтения. Я считаю, что подпрограммы библиотеки создают их для вашего удобства или для внутреннего использования, и на самом деле они не являются частью tiff-файла. Так что вы не можете и вам не нужно их устанавливать. Их значения, вероятно, получены из других тегов или данных изображения. - person TaW; 15.07.2014

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

newiimage.SetField(tag, value.Select(v => v.Value).ToArray());
person OpenMinded    schedule 14.07.2014
comment
Спасибо за ответ. Итак, каков тип данных значения в вашем решении. Поскольку я пытался извлечь и скопировать все теги, значение может быть любым, верно? Простите меня, если мой подход кажется наивным - person harsha217; 14.07.2014