Добавить GPS-теги в libtiff - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно добавить метаданные GPS к изображениям TIFF / DNG, используя LibTIFF.Я очень мало знаю о LibTIFF.Чтобы быть более раздражающим, я должен взломать это в существующий модуль LuaJIT с минимальной занимаемой площадью (Правка: чтобы быть понятным, мне не нужен ответ в LuaJIT!).

С этот вопрос , похоже, мне нужно сначала установить поле TIFFTAG_SUBIFD, затем написать основной IFD, а затем записать GPS IFD.Я запутался в двух моментах:

  1. Существует специальное имя LibTIFF для TIFFTAG_GPSIFD, и я не уверен, где это происходит, или это должно произойти вместо установки TIFFTAG_SUBIFD.

  2. Я не знаю, как собрать GPS IFD.Если на самом деле я должен установить TIFFTAG_SUBIFD и использовать TIFFWriteDirectory () для закрытия основного IFD, я предполагаю, что любые последующие вызовы TIFFSetField () будут записывать в GPS IFD, но в полях внутри IFD GPS нет имен LibTIFF для полей,Это заставляет меня думать, что я что-то упускаю.

Я предполагаю, что ясно, что я действительно не знаю, что я делаю с LibTIFF, поэтому любая помощь приветствуется.Не стесняйтесь игнорировать тот факт, что я нахожусь в LuaJIT, и просто скажите мне, как это может выглядеть в C.

Для справки: этот вопрос , кажется, выполняет ту же задачу в Java,но я не понимаю это достаточно хорошо, чтобы перевести.

Наконец, вот общее представление о том, что я имею сейчас, но это, очевидно, неполно.функции стиля "v_int" - всего лишь помощники для возврата соответствующей переменной C из ffi.new ().

local fdt = tiff.TIFFOpen(ofname, 'w')

-- Set all the fields in the main IFD here
-- ...

if self.scfg.gps then
    -- Prepare libtiff for a subIFD
    -- https://stackoverflow.com/questions/11959617/in-a-tiff-create-a-sub-ifd-with-thumbnail-libtiff#11998400
    subifd_n = v_int(1)
    subifd_offsets = ffi.new(string.format('toff_t[%i]', subifd_n), {v_uint32(0)})
    tiff.TIFFSetField(fdt, C.TIFFTAG_SUBIFD, v_int(subifd_n), subifd_offsets)
end

local bytes_per_pixel = self.sample_depth / 8
tiff.TIFFWriteRawStrip(fdt, 0, data_raw, self.frame_height * self.frame_width * bytes_per_pixel)

if self.scfg.gps then
    tiff.TIFFWriteDirectory(fdt)    -- Finish main IFD
    b2 = v_unit8(2)
    b0 = v_uint8(0)
    tiff.TIFFSetField(fdt, 0, b2, b2, b0, b0)   -- GPSVersionID
end

tiff.TIFFClose(fdt)   -- Closes currently-open IFD (?)

Любая помощь очень ценится!

...