View Javadoc
1   /*
2    * To change this template, choose Tools | Templates
3    * and open the template in the editor.
4    */
5   package nom.tam.image;
6   
7   /*
8    * #%L
9    * nom.tam FITS library
10   * %%
11   * Copyright (C) 2004 - 2024 nom-tam-fits
12   * %%
13   * This is free and unencumbered software released into the public domain.
14   *
15   * Anyone is free to copy, modify, publish, use, compile, sell, or
16   * distribute this software, either in source code form or as a compiled
17   * binary, for any purpose, commercial or non-commercial, and by any
18   * means.
19   *
20   * In jurisdictions that recognize copyright laws, the author or authors
21   * of this software dedicate any and all copyright interest in the
22   * software to the public domain. We make this dedication for the benefit
23   * of the public at large and to the detriment of our heirs and
24   * successors. We intend this dedication to be an overt act of
25   * relinquishment in perpetuity of all present and future rights to this
26   * software under copyright law.
27   *
28   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
31   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
32   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
33   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
34   * OTHER DEALINGS IN THE SOFTWARE.
35   * #L%
36   */
37  
38  import java.io.IOException;
39  
40  /**
41   * Image tiling interface. This interface supports general multi-dimensional tiling. However, FITS tiles are always
42   * 2-dimentional, but really images of any dimensions may be covered with 2D tiles.
43   * 
44   * @author tmcglynn
45   */
46  public interface ImageTiler {
47  
48      /**
49       * Returns the entire image reconstructed from the available tiles.
50       * 
51       * @return             the complete reconstructed image from the available tiles, as a Java array. This may be an
52       *                         array of promitives (such as <code>float[][]</code>) for images, or an
53       *                         <code>Object[]</code> for binary tables.
54       * 
55       * @throws IOException if there was an error accessing the tile data from the input.
56       * 
57       * @see                #getTile(int[], int[])
58       */
59      Object getCompleteImage() throws IOException;
60  
61      /**
62       * Returns a tile from the image of the specified size at the specified location. An image tile is returned as a
63       * one-dimensional array although the image will normally be multidimensional.
64       * 
65       * @param  start       the pixels indices where the tile starts in the full image. The array =hould contain a value
66       *                         for each image dimension.
67       * @param  lengths     the tile size in pixels. The array should contain a value for each image dimension. For the
68       *                         supported 2D tiles, the values beyond the first two entries should be set to 1.
69       * 
70       * @return             a Java array containing data for the requested tile. This will always be a flattened 1D
71       *                         array, even if the image is multidimensional
72       * 
73       * @throws IOException if there was an error accessing the tile data from the input.
74       * 
75       * @see                #getTile(Object, int[], int[])
76       * @see                #getTile(int[], int[], int[])
77       * @see                #getCompleteImage()
78       */
79      Object getTile(int[] start, int[] lengths) throws IOException;
80  
81      /**
82       * Returns a sparsely sampled tile from the image of the specified size at the specified location.
83       * 
84       * @param  start       the pixels indices where the tile starts in the full image. The array =hould contain a value
85       *                         for each image dimension.
86       * @param  lengths     the tile size in pixels. The array should contain a value for each image dimension. For the
87       *                         supported 2D tiles, the values beyond the first two entries should be set to 1.
88       * @param  steps       the sampling frequency of the original image, in pixels. The array =hould contain a value for
89       *                         each image dimension.
90       * 
91       * @return             a Java array containing data for the requested tile. This will always be a flattened 1D
92       *                         array, even if the image is multidimensional
93       * 
94       * @throws IOException if there was an error accessing the tile data from the input.
95       * 
96       * @see                #getTile(Object, int[], int[], int[])
97       * @see                #getTile(int[], int[])
98       * @see                #getCompleteImage()
99       */
100     default Object getTile(int[] start, int[] lengths, int[] steps) throws IOException {
101         throw new UnsupportedOperationException("Striding feature not yet implemented.");
102     }
103 
104     /**
105      * Fills the supplied array or output stream with the data from an image tile of the specified size at the specified
106      * location.
107      * 
108      * @param  output      A one-dimensional output array or stream. Data not within the valid limits of the image will
109      *                         be left unchanged. For an array, the length should be the product of lengths. Optionally
110      *                         provide an {@link nom.tam.util.ArrayDataOutput} to stream out data and not fill memory;
111      *                         useful for web applications.
112      * @param  start       the pixels indices where the tile starts in the full image. The array =hould contain a value
113      *                         for each image dimension.
114      * @param  lengths     the tile size in pixels. The array =hould contain a value for each image dimension. For the
115      *                         supported 2D tiles, the values beyond the first two entries should be set to 1.
116      * 
117      * @throws IOException if there was an error writing the tile to the output.
118      * 
119      * @see                #getTile(Object, int[], int[])
120      * @see                #getTile(int[], int[], int[])
121      * @see                #getCompleteImage()
122      */
123     void getTile(Object output, int[] start, int[] lengths) throws IOException;
124 
125     /**
126      * Fills the supplied array our output stream with the sparsely sampled data from an image tile of the specified
127      * size at the specified location.
128      * 
129      * @param  output      A one-dimensional output array or stream. Data not within the valid limits of the image will
130      *                         be left unchanged. For an array, the length should be the product of lengths. Optionally
131      *                         provide an {@link nom.tam.util.ArrayDataOutput} to stream out data and not fill memory;
132      *                         useful for web applications.
133      * @param  start       the pixels indices where the tile starts in the full image. The array =hould contain a value
134      *                         for each image dimension.
135      * @param  lengths     the tile size in pixels. The array =hould contain a value for each image dimension. For the
136      *                         supported 2D tiles, the values beyond the first two entries should be set to 1.
137      * @param  steps       the sampling frequency of the original image, in pixels. The array =hould contain a value for
138      *                         each image dimension.
139      * 
140      * @throws IOException if there was an error writing the tile to the output.
141      * 
142      * @see                #getTile(Object, int[], int[])
143      * @see                #getTile(int[], int[], int[])
144      * @see                #getCompleteImage()
145      */
146     default void getTile(Object output, int[] start, int[] lengths, int[] steps) throws IOException {
147         throw new UnsupportedOperationException("Striding feature not yet implemented.");
148     }
149 }