首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab - Blockproc/tifflib在编写大型tiff文件时失败

Matlab - Blockproc/tifflib在编写大型tiff文件时失败
EN

Stack Overflow用户
提问于 2017-05-11 12:10:58
回答 1查看 399关注 0票数 1

在Matlab中,我使用块处理一个大的(geo) tiff文件(按10 In的顺序),该文件只包含一个32位浮点数据的频带。

我现在的问题是,块(或者更具体的tifflib )突然无法编写一个平铺。这与输入文件、硬盘/文件位置或其他参数(如处理、Matlab版本,甚至OS )无关。

通常情况下,它总是在相同的二甲苯附近( linux为3372,Windows 10为#3176 )。

但是,当使用更小版本的大型文件(大约为4Gb而不是10 4Gb)时,阻塞会贯穿整个过程。

这是我得到的错误消息(Debian 64位,Matlab2014 b):

代码语言:javascript
复制
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3684.
> In TileCache>TileCache.setTile at 71
  In TiffAdapter>TiffAdapter.getTileHandle at 560
  In TiffAdapter>TiffAdapter.writeRegion at 354
  In blockproc>putBlock at 879
  In blockproc>serialLoop at 459
  In blockproc at 340
  In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3685.
> In TileCache>TileCache.setTile at 71
  In TiffAdapter>TiffAdapter.getTileHandle at 560
  In TiffAdapter>TiffAdapter.writeRegion at 354
  In blockproc>putBlock at 879
  In blockproc>serialLoop at 459
  In blockproc at 340
  In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3686.
> In TileCache>TileCache.setTile at 71
  In TiffAdapter>TiffAdapter.getTileHandle at 560
  In TiffAdapter>TiffAdapter.writeRegion at 354
  In blockproc>putBlock at 879
  In blockproc>serialLoop at 459
  In blockproc at 340
  In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3687.
> In TileCache>TileCache.setTile at 71
  In TiffAdapter>TiffAdapter.getTileHandle at 560
  In TiffAdapter>TiffAdapter.writeRegion at 354
  In blockproc>putBlock at 879
  In blockproc>serialLoop at 459
  In blockproc at 340
  In removeEGM at 13
Error using tifflib
Unable to write tile #3372.

Error in Tiff/writeEncodedTile (line 1602)
tifflib('writeEncodedTile',obj.FileID,tileNumber-1,varargin{:});

Error in images.internal.TiffAdapter/writeBlock (line 420)
                obj.TiffObj.writeEncodedTile(blockId, block);

Error in images.internal.TiffAdapter/writeRegion (line 377)
                        obj.writeBlock(blockId, data(ry - start(1) + 1, ...

Error in blockproc>putBlock (line 879)
dest.writeRegion(start_loc,...

Error in blockproc/serialLoop (line 459)
putBlock(options.Destination,row,col,output_block,output_size);

Error in blockproc (line 340)
    serialLoop();

Error in removeEGM (line 13)
blockproc(in_dem, [3000, 3000], my_fun, 'Destination', out_dem);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 15:13:56

感谢@haraldK的评论,我找到了解决方案:

Matlab可以无问题地读取BigTiffs (imread()),并编写它们,但是块只能读取BigTiffs,而不能写它们。

作为一种解决办法,我编写了自己的imageAdapter,基于这个:https://blogs.mathworks.com/steve/2013/08/07/tiff-bigtiff-and-blockproc/

基本上,我只更改了与tiff标签相关的行,以适应我的数据(32位浮点数,只有一个通道,没有压缩等等)。然后简单地用gdal复制原始文件中的地理引用。

代码语言:javascript
复制
obj.TiffObject.setTag('ImageLength', obj.ImageSize(1));
obj.TiffObject.setTag('ImageWidth', obj.ImageSize(2));
obj.TiffObject.setTag('TileLength', obj.TileLength);
obj.TiffObject.setTag('TileWidth',     obj.TileWidth);
obj.TiffObject.setTag('Photometric', Tiff.Photometric.MinIsBlack);
obj.TiffObject.setTag('BitsPerSample', 32);
obj.TiffObject.setTag('SampleFormat', Tiff.SampleFormat.IEEEFP);
obj.TiffObject.setTag('SamplesPerPixel', 1);
obj.TiffObject.setTag('ResolutionUnit', Tiff.ResolutionUnit.Inch);
obj.TiffObject.setTag('Orientation', 1);
obj.TiffObject.setTag('Compression', Tiff.ResolutionUnit.None);
obj.TiffObject.setTag('PlanarConfiguration', Tiff.PlanarConfiguration.Chunky); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43915035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档