code: public static BufferedImage readGridcoverageImageForTile( AbstractGridCoverage2DReader reader, int x, int y, int zoom,
              CoordinateReferenceSystem resampleCrs ) throws IOException {
          double north = tile2lat(y, zoom);
          double south = tile2lat(y + 1, zoom);
          double west = tile2lon(x, zoom);
          double east = tile2lon(x + 1, zoom);
  
          Coordinate ll = new Coordinate(west, south);
          Coordinate ur = new Coordinate(east, north);
  
          try {
              CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
  
              MathTransform transform = CRS.findMathTransform(sourceCRS, resampleCrs);
              ll = JTS.transform(ll, null, transform);
              ur = JTS.transform(ur, null, transform);
          } catch (Exception e) {
              e.printStackTrace();
          }
  
          BufferedImage image = ImageUtilities.imageFromReader(reader, TILESIZE, TILESIZE, ll.x, ur.x, ll.y, ur.y, resampleCrs);
          return image;
      }
docs: Read the image of a tile from a generic geotools coverage reader.
  
  @param reader the reader, expected to be in CRS 3857.
  @param x the tile x.
  @param y the tile y.
  @param zoom the zoomlevel.
  @return the image.
  @throws IOException