2011-06-12 46 views
0

我有一個平鋪的圖像。我能夠讀取元數據,所以我知道瓷磚尺寸;但我不知道如何閱讀特定的瓷磚。我有以下問題:Tiff平鋪:如何閱讀特定的瓷磚?

  • 假設我的口角由128×128瓦的,我怎麼能讀瓦定位在0,0(X,Y)?

  • 我的tiff文件中有多少個圖塊?

我嘗試開發一個代碼來管理單個瓷磚,但我不知道如何識別特定的瓷磚位置。

IImageMetadata metadata = Sanselan.getMetadata(imageFile); 
TiffDirectory tiffDirectory = ((TiffImageMetadata) metadata).findDirectory(TiffDirectoryConstants.DIRECTORY_TYPE_ROOT); 

ByteSourceFile byteSource = new ByteSourceFile(imageFile); 
ArrayList<?> elements = tiffDirectory.getTiffRawImageDataElements(); 
TiffImageData.Data data[] = new TiffImageData.Data[elements.size()]; 
for (int i = 0; i < elements.size(); i++) { 
    TiffDirectory.ImageDataElement element = (TiffDirectory.ImageDataElement) elements.get(i); 
    byte bytes[] = byteSource.getBlock(element.offset, element.length); 
    data[i] = new TiffImageData.Data(element.offset, element.length, bytes); 
} 


TiffField tileWidthField = tiffDirectory.findField(TiffTagConstants.TIFF_TAG_TILE_WIDTH); 
if (null == tileWidthField) 
    throw new ImageReadException("Can't find tile width field."); 
int tileWidth = tileWidthField.getIntValue(); 
TiffField tileLengthField = tiffDirectory.findField(TiffTagConstants.TIFF_TAG_TILE_LENGTH); 
if (null == tileLengthField) 
    throw new ImageReadException("Can't find tile length field."); 
int tileLength = tileLengthField.getIntValue(); 

TiffImageData.Tiles tile = new TiffImageData.Tiles(data, tileWidth, tileLength); 

我使用Apache孵化器的Sanselan進行這些操作。

+0

您是否檢查了[示例代碼和示例用法](http://incubator.apache.org/sanselan/site/sampleusage.html)? – trashgod 2011-06-12 19:51:34

+0

是的,但它不報告瓷磚提取的例子,我不知道如何製作它。 – 2011-06-16 10:36:40

回答

1

TIFF瓷磚按行排列順序排列,因此找出需要讀取的瓷磚相對簡單。對於你的具體問題,(0,0)處的瓦片是瓦片#0。瓦片的數量計算自:

Horizontal_Tiles = (Image_Width + Tile_Width-1)/Tile_Width; 
Vertical_Tiles = (Image_Height + Tile_Height-1)/Tile_Height; 
Total_Tiles  = Horizontal_Tiles * Vertical_Tiles; 
相關問題