comparison servlet/src/digilib/image/JAIImageLoaderDocuImage.java @ 588:aee436f0549d stream

more work on stream input
author robcast
date Thu, 06 Jan 2011 14:37:50 +0100
parents fd2ef7e46119
children 73e041c710d3
comparison
equal deleted inserted replaced
587:720d061a1b30 588:aee436f0549d
36 import javax.imageio.stream.ImageInputStream; 36 import javax.imageio.stream.ImageInputStream;
37 import javax.media.jai.JAI; 37 import javax.media.jai.JAI;
38 import javax.servlet.ServletException; 38 import javax.servlet.ServletException;
39 39
40 import digilib.io.FileOpException; 40 import digilib.io.FileOpException;
41 import digilib.io.ImageFile; 41 import digilib.io.ImageInput;
42 42
43 /** DocuImage implementation using the Java Advanced Imaging API and the ImageLoader 43 /** DocuImage implementation using the Java Advanced Imaging API and the ImageLoader
44 * API of Java 1.4. 44 * API of Java 1.4.
45 */ 45 */
46 public class JAIImageLoaderDocuImage extends JAIDocuImage { 46 public class JAIImageLoaderDocuImage extends JAIDocuImage {
78 return is; 78 return is;
79 } 79 }
80 80
81 81
82 /* Load an image file into the Object. */ 82 /* Load an image file into the Object. */
83 public void loadImage(ImageFile f) throws FileOpException { 83 public void loadImage(ImageInput ii) throws FileOpException {
84 logger.debug("loadImage: "+f.getFile()); 84 logger.debug("loadImage: "+ii.getFile());
85 //System.gc(); 85 //System.gc();
86 img = JAI.create("ImageRead", f.getFile().getAbsolutePath()); 86 img = JAI.create("ImageRead", ii.getFile().getAbsolutePath());
87 if (img == null) { 87 if (img == null) {
88 throw new FileOpException("Unable to load File!"); 88 throw new FileOpException("Unable to load File!");
89 } 89 }
90 mimeType = f.getMimetype();
91 } 90 }
92 91
93 /* Get an ImageReader for the image file. */ 92 /* Get an ImageReader for the image file. */
94 public ImageReader getReader(ImageFile f) throws IOException { 93 public ImageReader getReader(ImageInput input) throws IOException {
95 logger.debug("preloadImage: "+f.getFile()); 94 logger.debug("get ImageReader for " + input);
96 //System.gc(); 95 if (this.reader != null) {
97 RandomAccessFile rf = new RandomAccessFile(f.getFile(), "r"); 96 if (this.input == input) {
98 ImageInputStream istream = new FileImageInputStream(rf); 97 // it was the same input
99 //Iterator readers = ImageIO.getImageReaders(istream); 98 logger.debug("reusing Reader");
100 Iterator<ImageReader> readers = ImageIO.getImageReadersByMIMEType(f.getMimetype()); 99 return reader;
101 if (! readers.hasNext()) { 100 }
102 throw new FileOpException("Unable to load File!"); 101 // clean up old reader
103 } 102 logger.debug("cleaning Reader!");
104 reader = readers.next(); 103 dispose();
105 logger.debug("JAIImageIO: this reader: " + reader.getClass()); 104 }
106 while (readers.hasNext()) { 105 this.input = input;
107 logger.debug(" next reader: " + readers.next().getClass()); 106 ImageInputStream istream = null;
108 } 107 if (input.hasImageInputStream()) {
109 reader.setInput(istream); 108 // stream input
110 return reader; 109 istream = input.getImageInputStream();
110 } else if (input.hasFile()) {
111 // file only input
112 RandomAccessFile rf = new RandomAccessFile(input.getFile(), "r");
113 istream = new FileImageInputStream(rf);
114 } else {
115 throw new FileOpException("Unable to get data from ImageInput");
116 }
117 Iterator<ImageReader> readers;
118 String mt = input.getMimetype();
119 if (mt == null) {
120 logger.debug("No mime-type. Trying automagic.");
121 readers = ImageIO.getImageReaders(istream);
122 } else {
123 logger.debug("File type:" + mt);
124 readers = ImageIO.getImageReadersByMIMEType(mt);
125 }
126 if (!readers.hasNext()) {
127 throw new FileOpException("Can't find Reader to load File!");
128 }
129 reader = readers.next();
130 /* are there more readers? */
131 logger.debug("ImageIO: this reader: " + reader.getClass());
132 /* while (readers.hasNext()) {
133 logger.debug("ImageIO: next reader: " + readers.next().getClass());
134 } */
135 reader.setInput(istream);
136 return reader;
111 } 137 }
112 138
113 /* Load an image file into the Object. */ 139 /* Load an image file into the Object. */
114 public void loadSubimage(ImageFile f, Rectangle region, int prescale) 140 public void loadSubimage(ImageInput ii, Rectangle region, int prescale)
115 throws FileOpException { 141 throws FileOpException {
116 logger.debug("loadSubimage: "+f.getFile()); 142 logger.debug("loadSubimage: "+ii.getFile());
117 //System.gc(); 143 //System.gc();
118 try { 144 try {
119 if ((reader == null) || (imgFile != f.getFile())) { 145 if ((reader == null) || (imgFile != ii.getFile())) {
120 getReader(f); 146 getReader(ii);
121 } 147 }
122 ImageReadParam readParam = reader.getDefaultReadParam(); 148 ImageReadParam readParam = reader.getDefaultReadParam();
123 readParam.setSourceRegion(region); 149 readParam.setSourceRegion(region);
124 readParam.setSourceSubsampling(prescale, prescale, 0, 0); 150 readParam.setSourceSubsampling(prescale, prescale, 0, 0);
125 img = reader.read(0, readParam); 151 img = reader.read(0, readParam);
135 throw new FileOpException("Unable to load File!"); 161 throw new FileOpException("Unable to load File!");
136 } 162 }
137 if (img == null) { 163 if (img == null) {
138 throw new FileOpException("Unable to load File!"); 164 throw new FileOpException("Unable to load File!");
139 } 165 }
140 imgFile = f.getFile(); 166 imgFile = ii.getFile();
141 mimeType = f.getMimetype();
142 } 167 }
143 168
144 169
145 /* Write the current image to an OutputStream. */ 170 /* Write the current image to an OutputStream. */
146 public void writeImage(String mt, OutputStream ostream) 171 public void writeImage(String mt, OutputStream ostream)