用PyLibtiff读取平铺图像

时间:2012-04-02 08:08:57

标签: python tiff tile corrupt libtiff

我最近从here下载并安装了PyLibTIFF,并且一直在尝试阅读平铺的tiff图像。

我可以完美地阅读扫描线图像,但似乎无法找到正确的功能来读取图块。我在我的python site-packages文件夹中搜索了整个libtif目录,但没有找到任何类型的“read_tile”命令。

我基本上是尝试从this example转码:

TIFF* tif = TIFFOpen("myfile.tif", "r");
if (tif) {
uint32 imageWidth, imageLength;
uint32 tileWidth, tileLength;
uint32 x, y;
tdata_t buf;

TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageLength);
TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tileWidth);
TIFFGetField(tif, TIFFTAG_TILELENGTH, &tileLength);
buf = _TIFFmalloc(TIFFTileSize(tif));
for (y = 0; y < imageLength; y += tileLength)
    for (x = 0; x < imageWidth; x += tileWidth)
    TIFFReadTile(tif, buf, x, y, 0);
_TIFFfree(buf);
TIFFClose(tif);

到python。

到目前为止,我已经得到了:

tif = TIFF.open(tif_path, 'r')

image_width     = tif.GetField("ImageWidth")
image_length    = tif.GetField("ImageLength")
tile_width      = tif.GetField("TileWidth")
tile_length     = tif.GetField("TileLength")

y = 0
while y < image_length:

    x = 0
    while x < image_width:

        print tif.read_tile(x, y, 0)

        x += tile_width

    y += tile_length

tif.close()

我实际上只需要测试tiff是否已损坏。 tif.info()没有帮助,因为它只是读取即使在损坏的tif中也完好无损的文件头。

任何帮助,想法或想法将不胜感激! 谢谢!

2 个答案:

答案 0 :(得分:0)

来自libtiff's project page的文档:

“”“警告:pylibtiff目前支持读取和写入使用 TIFF条存储的图像。欢迎使用补丁来支持平铺的TIFF图像。”“”

但是,由于它是一个使用ctypes的纯python包,并且你已经识别出一个缺少的单个调用,很有可能你可以从那里复制和粘贴其他函数包装来写你对TIFFReadTile的调用

答案 1 :(得分:0)

也许我对tiff命名法感到困惑,因为我习惯将tiff电影称为tiff 堆栈,而不是平铺 tiff图像。我可以使用iter_images迭代我的tiff堆栈:

tif = TIFF.open('tiffimage.tif')

for image in tif.iter_images():
    *do stuff with image*

或者使用以下选项从电影中选择一张图片:

l = list(tif.iter_images())
plt.matshow(l[100))
plt.show()

也许Christoph Gohlke的tiffile.py模块对你来说也很有趣,正如pylibtiff网站所提到的那样。但是你可能正在使用它,因为您链接的页面也由Gohlke维护?