Как установить и получить значение fipTag - PullRequest
0 голосов
/ 02 апреля 2019

Моя попытка:

fipTag t;
t.setType(FIDT_LONG);
t.setKey("FrameTime");
long l = 128;
t.setValue(&l);

предположительно это устанавливает значение тега на 128 long

Однако ..

const long * lo = static_cast<const long*> ( t.getValue() );
cout << "t.getValue() " << *lo << " ?? doesn't look right" << endl; // 847909360
cout << "l == *lo " << (l == *lo) << endl;                          // false

Что случилось?Как правильно установить и получить значение fipTag в FreeImagePlus?

Бесполезная документация: http://freeimage.sourceforge.net/fip/classfipTag.html#a34b0b079bc222aaf4b4d1ad4ce423f82

Весь код:

#include <FreeImagePlus.h>
#include <iostream>

using namespace std;
int main(void)
{
    fipTag t;
    t.setType(FIDT_LONG);
    t.setKey("FrameTime");
    long l = 128;
    t.setValue(&l);
    const long * lo = static_cast<const long*> ( t.getValue() );
    cout << "t.getValue() " << *lo << " ?? doesn't look right" << endl;
    cout << "l == *lo " << (l == *lo) << endl;

    return 0;
}

1 Ответ

1 голос
/ 02 апреля 2019

С типом, установленным на FIDT_LONG, setTag (который является просто оболочкой для FreeImage_SetTagValue) ожидает массив из 4 байтов (32-разрядных) целых чисел без знака.long обычно составляет 8 байтов в 64-битных системах.

Кроме того, общий размер байта значения и количество элементов, которые он содержит, должны быть явно установлены.

#include <iostream>
#include <iterator> // std::size (C++17 or newer)

#include <FreeImagePlus.h>

int main()
{
  const uint32_t writeValue[] {123, 456};

  fipTag t;
  t.setKey("FrameTime");
  t.setType(FIDT_LONG);
  t.setCount(std::size(writeValue)); // number of elements in the array
  t.setLength(sizeof(writeValue));   // size of the entire array
  // length must be count * expected size for FIDT_LONG (4)

  if(t.setValue(writeValue)) {
    auto readValue = static_cast<const uint32_t *>(t.getValue());
    std::cout << "t.getValue() " << readValue[0] << std::endl;
  }

  return 0;
}
...