Changeset 1748
- Timestamp:
- 08/15/07 15:08:46 (16 months ago)
- Location:
- trunk/components
- Files:
-
- 1 added
- 8 modified
- 1 moved
-
common/src/ome/api/ICompress.java (modified) (2 diffs)
-
common/src/ome/system/ServiceFactory.java (modified) (2 diffs)
-
common/src/ome/util/ImageUtil.java (added)
-
common/src/omeis/providers/re/RenderingEngine.java (modified) (2 diffs)
-
server/resources/ome/services/service-ome.api.ICompress.xml (modified) (1 diff)
-
server/resources/ome/services/service-ome.api.IThumb.xml (modified) (1 diff)
-
server/resources/ome/services/service-omeis.providers.re.RenderingEngine.xml (modified) (1 diff)
-
server/src/ome/logic/CompressImpl.java (moved) (moved from trunk/components/server/src/ome/services/CompressBean.java) (4 diffs)
-
server/src/ome/services/RenderingBean.java (modified) (7 diffs)
-
server/src/ome/services/ThumbnailBean.java (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/components/common/src/ome/api/ICompress.java
r1745 r1748 23 23 24 24 /** 25 * Compresses a buffered image t humbnail to an output stream.25 * Compresses a buffered image to an output stream. 26 26 * 27 27 * @param image … … 32 32 * if there is a problem when writing to <i>stream<i>. 33 33 */ 34 void compressThumbnailToStream(BufferedImage image, OutputStream outputStream) throws IOException ; 34 void compressToStream(BufferedImage image, OutputStream outputStream) 35 throws IOException; 36 37 /** 38 * Sets the current compression level for the service. (The default is 85%) 39 * 40 * @param percentage A percentage compression level from 1.00 (100%) to 41 * 0.01 (1%). 42 * @throws ValidationException if the <code>percentage</code> is out of 43 * range. 44 */ 45 void setCompressionLevel(float percentage); 35 46 47 /** 48 * Returns the current compression level for the service. 49 * 50 * @returns See above. 51 */ 52 float getCompressionLevel(); 36 53 } -
trunk/components/common/src/ome/system/ServiceFactory.java
r1744 r1748 16 16 import ome.api.IAdmin; 17 17 import ome.api.IAnalysis; 18 import ome.api.ICompress;19 18 import ome.api.IConfig; 20 19 import ome.api.ILdap; … … 179 178 return getServiceByClass(IAnalysis.class); 180 179 } 181 182 public ICompress getCompresService() {183 return getServiceByClass(ICompress.class);184 }185 180 186 181 public IConfig getConfigService() { -
trunk/components/common/src/omeis/providers/re/RenderingEngine.java
r1187 r1748 96 96 */ 97 97 public int[] renderAsPackedInt(PlaneDef pd) throws ValidationException; 98 99 /** 100 * Renders the data selected by <code>pd</code> according to the current 101 * rendering settings and compresses the resulting RGBA composite image. 102 * 103 * @param pd 104 * Selects a plane orthogonal to one of the <i>X</i>, <i>Y</i>, 105 * or <i>Z</i> axes. 106 * @return A compressed RGBA JPEG for display. 107 * @throws ValidationException 108 * If <code>pd</code> is <code>null</code>. 109 * @see render() 110 * @see renderAsPackedInt() 111 */ 112 public byte[] renderCompressed(PlaneDef pd) throws ValidationException; 98 113 99 114 /** … … 399 414 */ 400 415 public void resetDefaults(); 416 417 /** 418 * Sets the current compression level for the service. (The default is 85%) 419 * 420 * @param percentage A percentage compression level from 1.00 (100%) to 421 * 0.01 (1%). 422 * @throws ValidationException if the <code>percentage</code> is out of 423 * range. 424 * @see ICompress#setCompressionLevel() 425 */ 426 public void setCompressionLevel(float percentage); 427 428 /** 429 * Returns the current compression level for the service. 430 * 431 * @returns See above. 432 * @see ICompress#getCompressionLevel() 433 */ 434 public float getCompressionLevel(); 401 435 402 436 } -
trunk/components/server/resources/ome/services/service-ome.api.ICompress.xml
r1745 r1748 19 19 20 20 <beans> 21 22 <bean singleton="false" parent="level2" 23 id="internal:ome.api.ICompress" class="ome.services.CompressBean"> 24 <constructor-arg> 25 <value>true</value> 26 </constructor-arg> 27 <property name="ioService" ref="/OMERO/Thumbs" /> 28 <property name="IRepositoryInfo" 29 ref="internal:ome.api.IRepositoryInfo" /> 30 </bean> 31 32 <bean id="managed:ome.api.ICompress" parent="managedService"> 33 <property name="proxyInterfaces" value="ome.api.ICompress" /> 34 <property name="target" ref="internal:ome.api.ICompress" /> 35 </bean> 36 21 <bean id="internal:ome.api.ICompress" class="ome.logic.CompressImpl"/> 37 22 </beans> 38 23 -
trunk/components/server/resources/ome/services/service-ome.api.IThumb.xml
r1744 r1748 28 28 ref="internal:omeis.providers.re.RenderingEngine"/> 29 29 <property name="scaleService" ref="internal:ome.api.IScale"/> 30 <property name="compressionService" ref="internal:ome.api.ICompress"/> 30 31 <property name="IRepositoryInfo" ref="internal:ome.api.IRepositoryInfo"/> 31 <property name="ICompress" ref="internal:ome.api.ICompress"/>32 32 </bean> 33 33 -
trunk/components/server/resources/ome/services/service-omeis.providers.re.RenderingEngine.xml
r1670 r1748 26 26 <property name="pixelsMetadata" ref="internal:ome.api.IPixels"/> 27 27 <property name="pixelsData" ref="/OMERO/Pixels"/> 28 <property name="compressionService" ref="internal:ome.api.ICompress"/> 28 29 </bean> 29 30 -
trunk/components/server/src/ome/logic/CompressImpl.java
r1745 r1748 1 package ome. services;1 package ome.logic; 2 2 3 3 import java.awt.image.BufferedImage; 4 import java.io.FileOutputStream;5 4 import java.io.IOException; 6 5 import java.io.OutputStream; 7 import java.io.Serializable;8 6 9 7 import javax.imageio.IIOImage; … … 13 11 import javax.imageio.stream.ImageOutputStream; 14 12 15 import ome.api.IRepositoryInfo;16 import ome.api.ServiceInterface;17 13 import ome.api.ICompress; 18 import ome.io.nio.ThumbnailService;19 import ome.logic.AbstractLevel2Service;20 import ome.model.display.Thumbnail;21 14 22 public class Compress Bean extends AbstractLevel2Serviceimplements ICompress {15 public class CompressImpl implements ICompress { 23 16 24 17 /** The default compression quality in fractional percent. */ 25 public static final float DEFAULT_COMPRESSION_QUALITY = 0.85F; 26 27 /** The ROMIO thumbnail service. */ 28 private transient ThumbnailService ioService; 29 30 /** the disk space checking service */ 31 private transient IRepositoryInfo iRepositoryInfo; 32 33 /** is file service checking for disk overflow */ 34 private transient boolean diskSpaceChecking; 35 36 /** 37 * I/O service (ThumbnailService) Bean injector. 38 * 39 * @param ioService 40 * a <code>ThumbnailService</code>. 18 private float quality = 0.85F; 19 20 /* (non-Javadoc) 21 * @see ome.api.ICompress#compressToStream(java.awt.image.BufferedImage, java.io.OutputStream) 41 22 */ 42 public void setIoService(ThumbnailService ioService) { 43 getBeanHelper().throwIfAlreadySet(this.ioService, ioService); 44 this.ioService = ioService; 45 } 46 47 /** 48 * Disk Space Usage service Bean injector 49 * @param iRepositoryInfo 50 * an <code>IRepositoryInfo</code> 51 */ 52 public final void setIRepositoryInfo(IRepositoryInfo iRepositoryInfo) { 53 getBeanHelper().throwIfAlreadySet(this.iRepositoryInfo, iRepositoryInfo); 54 this.iRepositoryInfo = iRepositoryInfo; 55 } 56 57 public Class<? extends ServiceInterface> getServiceInterface() { 58 return ICompress.class; 59 } 60 61 /** 62 * overriden to allow Spring to set boolean 63 * @param checking 64 */ 65 public CompressBean(boolean checking) { 66 this.diskSpaceChecking = checking; 67 } 68 69 public boolean isDiskSpaceChecking() { 70 return diskSpaceChecking; 71 } 72 73 public void setDiskSpaceChecking(boolean diskSpaceChecking) { 74 this.diskSpaceChecking = diskSpaceChecking; 75 } 76 77 public void compressThumbnailToStream(BufferedImage image, 78 OutputStream outputStream) throws IOException { 23 public void compressToStream(BufferedImage image, OutputStream outputStream) 24 throws IOException 25 { 79 26 // Get a JPEG image writer 80 27 ImageWriter jpegWriter = … … 84 31 ImageWriteParam iwp = jpegWriter.getDefaultWriteParam(); 85 32 iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 86 iwp.setCompressionQuality( DEFAULT_COMPRESSION_QUALITY);33 iwp.setCompressionQuality(quality); 87 34 88 35 // Write the JPEG to our ByteArray stream … … 98 45 } 99 46 100 47 /* (non-Javadoc) 48 * @see ome.api.ICompress#setCompressionLevel(float) 49 */ 50 public void setCompressionLevel(float percentage) 51 { 52 quality = percentage; 53 } 54 55 /* (non-Javadoc) 56 * @see ome.api.ICompress#getCompressionLevel() 57 */ 58 public float getCompressionLevel() 59 { 60 return quality; 61 } 101 62 } -
trunk/components/server/src/ome/services/RenderingBean.java
r1640 r1748 9 9 10 10 // Java imports 11 import java.awt.image.BufferedImage; 12 import java.io.ByteArrayOutputStream; 11 13 import java.io.IOException; 12 14 import java.io.PrintWriter; … … 44 46 import ome.annotations.RevisionDate; 45 47 import ome.annotations.RevisionNumber; 48 import ome.api.ICompress; 46 49 import ome.api.IPixels; 47 50 import ome.api.ServiceInterface; … … 65 68 import ome.system.EventContext; 66 69 import ome.system.SimpleEventContext; 70 import ome.util.ImageUtil; 67 71 import ome.util.ShallowCopy; 68 72 … … 152 156 /** Reference to the service used to retrieve the pixels metadata. */ 153 157 private transient IPixels pixMetaSrv; 158 159 /** Reference to the service used to compress pixel data. */ 160 private transient ICompress compressionSrv; 154 161 155 162 /** … … 158 165 */ 159 166 private transient ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); 167 168 /** 169 * Compression service Bean injector. 170 * 171 * @param compressionService 172 * an <code>ICompress</code>. 173 */ 174 public void setCompressionService(ICompress compressionSrv) { 175 getBeanHelper().throwIfAlreadySet(this.compressionSrv, compressionSrv); 176 this.compressionSrv = compressionSrv; 177 } 160 178 161 179 /** set injector. For use during configuration. Can only be called once. */ … … 395 413 } finally { 396 414 rwl.readLock().unlock(); 415 } 416 } 417 418 /** 419 * Implemented as specified by the {@link RenderingEngine} interface. 420 * 421 * @see RenderingEngine#renderCompressed() 422 */ 423 @RolesAllowed("user") 424 public byte[] renderCompressed(PlaneDef pd) 425 throws ResourceError, ValidationException 426 { 427 int[] buf = renderAsPackedInt(pd); 428 int sizeX = pixelsObj.getSizeX(); 429 int sizeY = pixelsObj.getSizeY(); 430 BufferedImage image = ImageUtil.createBufferedImage(buf, sizeX, sizeY); 431 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 432 try 433 { 434 compressionSrv.compressToStream(image, byteStream); 435 return byteStream.toByteArray(); 436 } 437 catch (IOException e) 438 { 439 log.error("Could not compress rendered image.", e); 440 throw new ResourceError(e.getMessage()); 441 } 442 finally 443 { 444 try 445 { 446 byteStream.close(); 447 } 448 catch (IOException e) 449 { 450 log.error("Could not close byte stream.", e); 451 throw new ResourceError(e.getMessage()); 452 } 397 453 } 398 454 } … … 453 509 iUpdate.flush(); 454 510 } 511 512 /** 513 * Implemented as specified by the {@link RenderingEngine} interface. 514 * 515 * @see RenderingEngine#setCompressionLevel() 516 */ 517 public void setCompressionLevel(float percentage) 518 { 519 compressionSrv.setCompressionLevel(percentage); 520 } 521 522 /** 523 * Implemented as specified by the {@link RenderingEngine} interface. 524 * 525 * @see RenderingEngine#getCompressionLevel() 526 */ 527 public float getCompressionLevel() 528 { 529 return compressionSrv.getCompressionLevel(); 530 } 455 531 456 532 /** -
trunk/components/server/src/ome/services/ThumbnailBean.java
r1744 r1748 51 51 import ome.system.EventContext; 52 52 import ome.system.SimpleEventContext; 53 import ome.util.ImageUtil; 53 54 import omeis.providers.re.RenderingEngine; 54 55 import omeis.providers.re.data.PlaneDef; … … 102 103 private transient ThumbnailService ioService; 103 104 104 /** the disk space checking service*/105 /** The disk space checking service. */ 105 106 private transient IRepositoryInfo iRepositoryInfo; 106 107 107 /** the disk space checking service*/108 private transient ICompress iCompress;108 /** The JPEG compression service. */ 109 private transient ICompress compressionService; 109 110 110 111 /** is file service checking for disk overflow */ … … 274 275 275 276 /** 276 * Scaleservice Bean injector.277 * 278 * @param iCompress277 * Compression service Bean injector. 278 * 279 * @param compressionService 279 280 * an <code>ICompress</code>. 280 281 */ 281 public void setICompress(ICompress iCompress) { 282 getBeanHelper().throwIfAlreadySet(this.iCompress, iCompress); 283 this.iCompress = iCompress; 284 } 285 286 /** 287 * Creates a buffered image from a rendering engine RGB buffer without data 288 * copying. 289 * 290 * @param buf 291 * the rendering engine packed integer buffer. 292 * @param sizeX 293 * the X-width of the image rendered. 294 * @param sizeY 295 * the Y-width of the image rendered. 296 * @return a buffered image wrapping <i>buf</i> with the X-Y dimensions 297 * provided. 298 */ 299 private BufferedImage createBufferedImage(int[] buf, int sizeX, int sizeY) { 300 // First wrap the packed integer array with a Java2D buffer 301 DataBuffer j2DBuf = new DataBufferInt(buf, sizeX * sizeY, 0); 302 303 // Create a sample model which supplies the bit masks for each colour 304 // component. 305 SinglePixelPackedSampleModel sampleModel = new SinglePixelPackedSampleModel( 306 DataBuffer.TYPE_INT, sizeX, sizeY, sizeX, new int[] { 307 0x00ff0000, // Red 308 0x0000ff00, // Green 309 0x000000ff, // Blue 310 // 0xff000000 // Alpha 311 }); 312 313 // Now create a compatible raster which wraps the Java2D buffer and is 314 // told how to get to the pixel data by the sample model. 315 WritableRaster raster = new IntegerInterleavedRaster(sampleModel, 316 j2DBuf, new Point(0, 0)); 317 318 // Finally create a screen accessible colour model and wrap the raster 319 // in a buffered image. 320 ColorModel colorModel = new DirectColorModel(24, 0x00ff0000, // Red 321 0x0000ff00, // Green 322 0x000000ff // Blue 323 // 0xff000000 // Alpha 324 ); 325 BufferedImage image = new BufferedImage(colorModel, raster, false, null); 326 327 return image; 328 } 329 282 public void setCompressionService(ICompress compressionService) { 283 getBeanHelper().throwIfAlreadySet(this.compressionService, 284 compressionService); 285 this.compressionService = compressionService; 286 } 287 330 288 /** 331 289 * Compresses a buffered image thumbnail to disk. … … 346 304 347 305 FileOutputStream stream = ioService.getThumbnailOutputStream(thumb); 348 iCompress.compressThumbnailToStream(image, stream);306 compressionService.compressToStream(image, stream); 349 307 stream.close(); 350 308 } … … 446 404 pd.setZ(re.getDefaultZ()); 447 405 int[] buf = re.renderAsPackedInt(pd); 448 BufferedImage image = createBufferedImage(buf, origSizeX, origSizeY); 406 BufferedImage image = 407 ImageUtil.createBufferedImage(buf, origSizeX, origSizeY); 449 408 450 409 // Finally, scale our image using scaling factors (percentage). … … 608 567 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 609 568 try { 610 iCompress.compressThumbnailToStream(image, byteStream);569 compressionService.compressToStream(image, byteStream); 611 570 byte[] thumbnail = byteStream.toByteArray(); 612 571 return thumbnail;
