All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.digitalcollections.openjpeg.imageio.OpenJp2ImageReaderSpi Maven / Gradle / Ivy

package de.digitalcollections.openjpeg.imageio;

import de.digitalcollections.openjpeg.OpenJpeg;
import java.io.IOException;
import java.util.Arrays;
import java.util.Locale;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OpenJp2ImageReaderSpi extends ImageReaderSpi {
  private static Logger LOGGER = LoggerFactory.getLogger(OpenJp2ImageReaderSpi.class);
  private static byte[] HEADER_MAGIC = new byte[]{0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50,
                                                  0x20, 0x20, 0x0d, 0x0a, (byte) 0x87, 0x0a};
  private static final String vendorName = "Münchener Digitalisierungszentrum/Digitale Bibliothek, Bayerische Staatsbibliothek";
  private static final String version = "0.1.0";
  private static final String readerClassName = "de.digitalcollections.openjpeg.imageio.OpenJp2ImageReader";
  private static final String[] names = { "jpeg2000" };
  private static final String[] suffixes = { "jp2" };
  private static final String[] MIMETypes = { "image/jp2" };
  private static final String[] writerSpiNames = { "de.digitalcollections.openjpeg.imageio.OpenJp2ImageWriterSpi" };
  private static final Class[] inputTypes = { ImageInputStream.class };

  private OpenJpeg lib;

  public OpenJp2ImageReaderSpi() {
    super(vendorName, version, names, suffixes, MIMETypes, readerClassName, inputTypes, writerSpiNames,
        false, null, null,
        null, null, false,
        null, null, null,
        null);
  }

  private void loadLibrary() throws IOException {
    if (this.lib == null) {
      try {
        this.lib = new OpenJpeg();
      } catch (UnsatisfiedLinkError e) {
        LOGGER.error("Could not load libopenjp2", e);
        throw new IOException(e);
      }
    }
  }

  @Override
  public boolean canDecodeInput(Object input) throws IOException {
    if (!(input instanceof ImageInputStream)) {
      input = ImageIO.createImageInputStream(input);
    }
    if (input == null) {
      return false;
    }
    ImageInputStream stream = (ImageInputStream)input;
    byte[] b = new byte[12];
    try {
      stream.mark();
      stream.readFully(b);
    } catch (IOException e) {
      return false;
    }
    return Arrays.equals(b, HEADER_MAGIC);
  }

  @Override
  public ImageReader createReaderInstance(Object extension) throws IOException {
    loadLibrary();
    return new OpenJp2ImageReader(this, this.lib);
  }

  @Override
  public String getDescription(Locale locale) {
    return "JPEG2000 reader plugin based on the OpenJp2 library from the OpenJPEG project.";
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy