/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.openjpeg; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; import java.awt.image.SampleModel; import java.io.IOException; import java.util.List; import java.util.Locale; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriter; import javax.imageio.spi.ImageWriterSpi; import javax.imageio.spi.ServiceRegistry; import javax.imageio.stream.ImageOutputStream; import com.sun.media.imageioimpl.common.ImageUtil; /** */ public class NativeJ2kImageWriterSpi extends ImageWriterSpi { private boolean registered = false; public NativeJ2kImageWriterSpi() { super("Weasis Team", "1.0", NativeJ2kImageReaderSpi.NAMES, NativeJ2kImageReaderSpi.SUFFIXES, NativeJ2kImageReaderSpi.MIMES, NativeJ2kImageWriter.class.getName(), new Class[] { ImageOutputStream.class }, new String[] { NativeJ2kImageReaderSpi.class.getName() }, false, null, null, null, null, false, null, null, null, null); } @Override public void onRegistration(ServiceRegistry registry, Class category) { if (registered) { return; } registered = true; List list = ImageUtil.getJDKImageReaderWriterSPI(registry, "JPEG 2000", false); for (int i = 0; i < list.size(); i++) { // Set this codec to higher priority registry.setOrdering(category, this, list.get(i)); } } @Override public boolean canEncodeImage(ImageTypeSpecifier type) { ColorModel colorModel = type.getColorModel(); if (colorModel instanceof IndexColorModel) { // No need to check further: writer converts to 8-8-8 RGB. return true; } SampleModel sampleModel = type.getSampleModel(); // Ensure all channels have the same bit depth int bitDepth; if (colorModel != null) { int[] componentSize = colorModel.getComponentSize(); bitDepth = componentSize[0]; for (int i = 1; i < componentSize.length; i++) { if (componentSize[i] != bitDepth) { return false; } } } else { int[] sampleSize = sampleModel.getSampleSize(); bitDepth = sampleSize[0]; for (int i = 1; i < sampleSize.length; i++) { if (sampleSize[i] != bitDepth) { return false; } } } // Ensure bitDepth is no more than 16 if (bitDepth > 16) { return false; } // Check number of bands. int numBands = sampleModel.getNumBands(); if (numBands < 1 || numBands > 4) { return false; } return true; } @Override public String getDescription(Locale locale) { return "Natively-accelerated JPEG2000 Image Writer (OpenJPEG based)"; } @Override public ImageWriter createWriterInstance(Object extension) throws IOException { return new NativeJ2kImageWriter(this); } }