Мне нужно добавить метаданные GPS к изображениям TIFF / DNG, используя LibTIFF.Я очень мало знаю о LibTIFF.Чтобы быть более раздражающим, я должен взломать это в существующий модуль LuaJIT с минимальной занимаемой площадью (Правка: чтобы быть понятным, мне не нужен ответ в LuaJIT!).
С этот вопрос , похоже, мне нужно сначала установить поле TIFFTAG_SUBIFD, затем написать основной IFD, а затем записать GPS IFD.Я запутался в двух моментах:
Существует специальное имя LibTIFF для TIFFTAG_GPSIFD, и я не уверен, где это происходит, или это должно произойти вместо установки TIFFTAG_SUBIFD.
Я не знаю, как собрать 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 (?)
Любая помощь очень ценится!