to speed up loading.
*/
private void load( boolean loadImage, boolean loadMetadata,
int minWidth, int minHeight, boolean isLowQualityAllowed ) {
if ( f != null && f.canRead() ) {
ImageReader reader = getImageReader( f );
if ( reader != null ) {
log.debug( "Creating stream" );
ImageInputStream iis = null;
try {
iis = ImageIO.createImageInputStream( f );
reader.setInput( iis, false, false );
width = reader.getWidth( 0 );
height = reader.getHeight( 0 );
if ( loadImage ) {
RenderedImage ri = null;
if ( isLowQualityAllowed ) {
ri = readExifThumbnail( f );
if ( ri == null || !isOkForThumbCreation( ri.getWidth(),
ri.getHeight(), minWidth, minHeight,
reader.getAspectRatio( 0 ), 0.01 ) ) {
/*
EXIF thumbnail either did not exist or was unusable,
try to read subsampled version of original
*/
ri = readSubsampled( reader, minWidth, minHeight );
}
} else {
/*
High quality image is requested.
If the image is very large, use subsampling anyway
to decrease memory consumption & speed up interactive
operations. Anyway, most often user just views image
at screen resolution
*/
ImageReadParam param = reader.getDefaultReadParam();
if ( minWidth * 2 < width && minHeight * 2 < height ) {
param.setSourceSubsampling( 2, 2, 0, 0 );
}
ri = reader.read( 0, param );
}
if ( ri != null ) {
/*
TODO: JAI seems to have problems in doing convolutions
for large image tiles. Split image to reasonably sized
tiles as a workaround for this.
*/
ri = new TiledImage( ri, 256, 256 );
image = new RenderedImageAdapter( ri );
originalSampleModel = image.getSampleModel();
originalColorModel = image.getColorModel();
final float[] DEFAULT_KERNEL_1D = {0.25f,0.5f,0.25f};
ParameterBlock pb = new ParameterBlock();
KernelJAI kernel = new KernelJAI(DEFAULT_KERNEL_1D.length,
DEFAULT_KERNEL_1D.length,
DEFAULT_KERNEL_1D.length/2,
DEFAULT_KERNEL_1D.length/2,
DEFAULT_KERNEL_1D,
DEFAULT_KERNEL_1D);
pb.add(kernel);
BorderExtender extender =
BorderExtender.createInstance(BorderExtender.BORDER_COPY);
RenderingHints hints =
JAI.getDefaultInstance().getRenderingHints();
if(hints == null) {
hints = new RenderingHints(JAI.KEY_BORDER_EXTENDER, extender);
} else {
hints.put(JAI.KEY_BORDER_EXTENDER, extender);
}
RenderedOp filter = new RenderedOp("convolve", pb, hints);
// javax.media.jai.operator.BoxFilterDescriptor.create( null, new Integer(2), new Integer(2), new Integer(0), new Integer(0), null );
// Add the subsampling operation.
pb = new ParameterBlock();
pb.addSource(filter);
pb.add(new Float(0.5F)).add(new Float(0.5F));
pb.add(new Float(0.0F)).add(new Float(0.0F));
pb.add(Interpolation.getInstance(Interpolation.INTERP_NEAREST));
RenderedOp downSampler = new RenderedOp("scale", pb, null);
renderableImage =
RenderableDescriptor.createRenderable(
image, downSampler, null, null, null, null, null );
} else {
image = null;
renderableImage = null;
}
imageIsLowQuality = isLowQualityAllowed;
}
if (loadMetadata ) {
Set<String> nodes = new HashSet<String>();
nodes.add( "unknown" );
IIOMetadata metadata = reader.getImageMetadata( 0,
"javax_imageio_jpeg_image_1.0", nodes );
if ( metadata != null ) {
Node tree = metadata.getAsTree( "javax_imageio_jpeg_image_1.0" );
log.debug( "read metadata: " + metadata.toString() );
this.parseJPEGMetadata( (IIOMetadataNode) tree);