我需要使用LibTIFF将GPS元数据添加到TIFF / DNG图像。我对LibTIFF知之甚少。更烦人的是,我必须将其破解成现有的LuaJIT模块,占用空间最小(编辑:要清楚,我不需要LuaJIT的答案!)。
从this question开始,我似乎需要首先设置TIFFTAG_SUBIFD字段,然后写入主IFD,然后写入GPS IFD。我对两点感到困惑:
TIFFTAG_GPSIFD有一个特殊的LibTIFF名称,我不确定它的位置,或者是否应该代替设置TIFFTAG_SUBIFD。
我不知道如何首先组装GPS IFD。如果确实我应该设置TIFFTAG_SUBIFD并使用TIFFWriteDirectory()关闭主IFD,我假设以下任何对TIFFSetField()的调用都会写入GPS IFD,但GPS IFD中的字段没有LibTIFF名称。这让我觉得我错过了一些东西。
我想很清楚,我真的不知道我在用LibTIFF做什么,所以任何帮助都会受到赞赏。请随意忽略我在LuaJIT中的事实,并告诉我在C中的情况。
作为参考,this question似乎在Java中完成了相同的任务,但我不太清楚它的翻译。
最后,这是我现在所拥有的一般概念,但这显然是不完整的。 “v_int”样式函数只是帮助从ffi.new()返回适当的C变量。
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 (?)
非常感谢任何帮助!