code: private void readTiles() {
      ImageTiles imageTiles = new ImageTiles();
      List<Tile> tiles = new ArrayList<Tile>();
      if (ifd.containsTagId(TiffTags.getTagId("TileOffsets"))
          && ifd.containsTagId(TiffTags.getTagId("TileBYTECounts"))
          && ifd.containsTagId(TiffTags.getTagId("TileLength"))
          && ifd.containsTagId(TiffTags.getTagId("TileWidth"))) {
        long totalWidth = ifd.getTag("ImageWidth").getFirstNumericValue();
        long totalLength = ifd.getTag("ImageLength").getFirstNumericValue();
        long tilesWidth = ifd.getTag("TileWidth").getFirstNumericValue();
        long tilesHeight = ifd.getTag("TileLength").getFirstNumericValue();
        int actualWidth = 0;
        long actualHeight = tilesHeight;
        for (int i = 0; i < ifd.getTag("TileOffsets").getValue().size(); i++) {
          try {
            int to = ifd.getTag("TileOffsets").getValue().get(i).toInt();
            Tile tile = new Tile();
            tile.setOffset(to);
            tile.setWidth((int) tilesWidth);
            tile.setHeight((int) tilesHeight);
            long padX = 0;
            long padY = 0;
            boolean newLine = false;
            actualWidth += tilesWidth;
            if (actualWidth > totalWidth) {
              padX = tilesWidth - actualWidth % totalWidth;
              newLine = true;
            }
            if (actualHeight > totalLength) {
              padY = tilesHeight - actualHeight % totalLength;
            }
            tile.setPadding((int) padX, (int) padY);
            if (newLine) {
              actualHeight += tilesHeight;
              actualWidth = 0;
            }
            tiles.add(tile);
          } catch (Exception ex) {
  
          }
        }
        imageTiles.setTiles(tiles);
  
        imageTiles.setTileHeight((int) tilesHeight);
        imageTiles.setTileWidth((int) tilesWidth);
      }
      ifd.setImageTiles(imageTiles);
    }
docs: Read the tiles and store them (its offsets) in the imagetiles object.