在libtiff

时间:2018-05-23 23:26:19

标签: c gps tiff luajit libtiff

我需要使用LibTIFF将GPS元数据添加到TIFF / DNG图像。我对LibTIFF知之甚少。更烦人的是,我必须将其破解成现有的LuaJIT模块,占用空间最小(编辑:要清楚,我不需要LuaJIT的答案!)。

this question开始,我似乎需要首先设置TIFFTAG_SUBIFD字段,然后写入主IFD,然后写入GPS IFD。我对两点感到困惑:

  1. TIFFTAG_GPSIFD有一个特殊的LibTIFF名称,我不确定它的位置,或者是否应该代替设置TIFFTAG_SUBIFD。

  2. 我不知道如何首先组装GPS IFD。如果确实我应该设置TIFFTAG_SUBIFD并使用TIFFWriteDirectory()关闭主IFD,我假设以下任何对TIFFSetField()的调用都会写入GPS IFD,但GPS IFD中的字段没有LibTIFF名称。这让我觉得我错过了一些东西。

  3. 我想很清楚,我真的不知道我在用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 (?)
    

    非常感谢任何帮助!

0 个答案:

没有答案