• Views
  • Iteration Report
  • My Iteration Report
  •  
OMERO.server
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • ← Previous Changeset
  • Next Changeset →

Changeset 1748

Show
Ignore:
Timestamp:
08/15/07 15:08:46 (16 months ago)
Author:
callan
Message:

Furthering Aleksandra's changes to re-organize compression library implementation (#6)
* Cleaned up the service definition
* Added a configurable compression level
* Extended the RenderingEngine to support compression

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  
    2323 
    2424    /** 
    25      * Compresses a buffered image thumbnail to an output stream. 
     25     * Compresses a buffered image to an output stream. 
    2626     *  
    2727     * @param image 
    … …  
    3232     *             if there is a problem when writing to <i>stream<i>. 
    3333     */ 
    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); 
    3546         
     47        /** 
     48         * Returns the current compression level for the service. 
     49         *  
     50         * @returns See above. 
     51         */ 
     52        float getCompressionLevel(); 
    3653} 
  • trunk/components/common/src/ome/system/ServiceFactory.java

    r1744 r1748  
    1616import ome.api.IAdmin; 
    1717import ome.api.IAnalysis; 
    18 import ome.api.ICompress; 
    1918import ome.api.IConfig; 
    2019import ome.api.ILdap; 
    … …  
    179178        return getServiceByClass(IAnalysis.class); 
    180179    } 
    181  
    182     public ICompress getCompresService() { 
    183         return getServiceByClass(ICompress.class); 
    184     } 
    185180     
    186181    public IConfig getConfigService() { 
  • trunk/components/common/src/omeis/providers/re/RenderingEngine.java

    r1187 r1748  
    9696     */ 
    9797    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; 
    98113 
    99114    /** 
    … …  
    399414     */ 
    400415    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(); 
    401435 
    402436} 
  • trunk/components/server/resources/ome/services/service-ome.api.ICompress.xml

    r1745 r1748  
    1919 
    2020<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"/> 
    3722</beans> 
    3823 
  • trunk/components/server/resources/ome/services/service-ome.api.IThumb.xml

    r1744 r1748  
    2828        ref="internal:omeis.providers.re.RenderingEngine"/> 
    2929    <property name="scaleService" ref="internal:ome.api.IScale"/> 
     30    <property name="compressionService" ref="internal:ome.api.ICompress"/> 
    3031    <property name="IRepositoryInfo" ref="internal:ome.api.IRepositoryInfo"/> 
    31     <property name="ICompress" ref="internal:ome.api.ICompress"/> 
    3232  </bean> 
    3333   
  • trunk/components/server/resources/ome/services/service-omeis.providers.re.RenderingEngine.xml

    r1670 r1748  
    2626    <property name="pixelsMetadata" ref="internal:ome.api.IPixels"/> 
    2727    <property name="pixelsData"     ref="/OMERO/Pixels"/> 
     28    <property name="compressionService" ref="internal:ome.api.ICompress"/> 
    2829  </bean> 
    2930 
  • trunk/components/server/src/ome/logic/CompressImpl.java

    r1745 r1748  
    1 package ome.services; 
     1package ome.logic; 
    22 
    33import java.awt.image.BufferedImage; 
    4 import java.io.FileOutputStream; 
    54import java.io.IOException; 
    65import java.io.OutputStream; 
    7 import java.io.Serializable; 
    86 
    97import javax.imageio.IIOImage; 
    … …  
    1311import javax.imageio.stream.ImageOutputStream; 
    1412 
    15 import ome.api.IRepositoryInfo; 
    16 import ome.api.ServiceInterface; 
    1713import ome.api.ICompress; 
    18 import ome.io.nio.ThumbnailService; 
    19 import ome.logic.AbstractLevel2Service; 
    20 import ome.model.display.Thumbnail; 
    2114 
    22 public class CompressBean extends AbstractLevel2Service implements ICompress { 
     15public class CompressImpl implements ICompress { 
    2316 
    2417        /** 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) 
    4122     */ 
    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    { 
    7926        // Get a JPEG image writer 
    8027        ImageWriter jpegWriter = 
    … …  
    8431        ImageWriteParam iwp = jpegWriter.getDefaultWriteParam(); 
    8532        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    86         iwp.setCompressionQuality(DEFAULT_COMPRESSION_QUALITY); 
     33        iwp.setCompressionQuality(quality); 
    8734 
    8835        // Write the JPEG to our ByteArray stream 
    … …  
    9845    } 
    9946 
    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        } 
    10162} 
  • trunk/components/server/src/ome/services/RenderingBean.java

    r1640 r1748  
    99 
    1010// Java imports 
     11import java.awt.image.BufferedImage; 
     12import java.io.ByteArrayOutputStream; 
    1113import java.io.IOException; 
    1214import java.io.PrintWriter; 
    … …  
    4446import ome.annotations.RevisionDate; 
    4547import ome.annotations.RevisionNumber; 
     48import ome.api.ICompress; 
    4649import ome.api.IPixels; 
    4750import ome.api.ServiceInterface; 
    … …  
    6568import ome.system.EventContext; 
    6669import ome.system.SimpleEventContext; 
     70import ome.util.ImageUtil; 
    6771import ome.util.ShallowCopy; 
    6872 
    … …  
    152156    /** Reference to the service used to retrieve the pixels metadata. */ 
    153157    private transient IPixels pixMetaSrv; 
     158     
     159    /** Reference to the service used to compress pixel data. */ 
     160    private transient ICompress compressionSrv; 
    154161 
    155162    /** 
    … …  
    158165     */ 
    159166    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    } 
    160178 
    161179    /** set injector. For use during configuration. Can only be called once. */ 
    … …  
    395413        } finally { 
    396414            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                } 
    397453        } 
    398454    } 
    … …  
    453509        iUpdate.flush(); 
    454510    } 
     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        } 
    455531 
    456532    /** 
  • trunk/components/server/src/ome/services/ThumbnailBean.java

    r1744 r1748  
    5151import ome.system.EventContext; 
    5252import ome.system.SimpleEventContext; 
     53import ome.util.ImageUtil; 
    5354import omeis.providers.re.RenderingEngine; 
    5455import omeis.providers.re.data.PlaneDef; 
    … …  
    102103    private transient ThumbnailService ioService; 
    103104 
    104     /** the disk space checking service */ 
     105    /** The disk space checking service. */ 
    105106    private transient IRepositoryInfo iRepositoryInfo; 
    106107     
    107     /** the disk space checking service */ 
    108     private transient ICompress iCompress; 
     108    /** The JPEG compression service. */ 
     109    private transient ICompress compressionService; 
    109110 
    110111    /** is file service checking for disk overflow */ 
    … …  
    274275     
    275276    /** 
    276      * Scale service Bean injector. 
    277      *  
    278      * @param iCompress 
     277     * Compression service Bean injector. 
     278     *  
     279     * @param compressionService 
    279280     *            an <code>ICompress</code>. 
    280281     */ 
    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     
    330288    /** 
    331289     * Compresses a buffered image thumbnail to disk. 
    … …  
    346304 
    347305        FileOutputStream stream = ioService.getThumbnailOutputStream(thumb); 
    348         iCompress.compressThumbnailToStream(image, stream); 
     306        compressionService.compressToStream(image, stream); 
    349307        stream.close(); 
    350308    } 
    … …  
    446404        pd.setZ(re.getDefaultZ()); 
    447405        int[] buf = re.renderAsPackedInt(pd); 
    448         BufferedImage image = createBufferedImage(buf, origSizeX, origSizeY); 
     406        BufferedImage image =  
     407                ImageUtil.createBufferedImage(buf, origSizeX, origSizeY); 
    449408 
    450409        // Finally, scale our image using scaling factors (percentage). 
    … …  
    608567        ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
    609568        try { 
    610             iCompress.compressThumbnailToStream(image, byteStream); 
     569            compressionService.compressToStream(image, byteStream); 
    611570            byte[] thumbnail = byteStream.toByteArray(); 
    612571            return thumbnail; 

Download in other formats:

  • Unified Diff
  • Zip Archive

Trac Powered

Powered by Trac 0.11
By Edgewall Software.

Visit the Trac open source project at
http://trac.edgewall.org/