public int getWidth(int imageIndex) throws IOException { readFile(); checkIndex(imageIndex); return decoder.getPageAsJBIG2Bitmap(imageIndex).getWidth(); }
private void readFile() { // Do not allow this header to be read more than once. if (readFile) return; // Make sure that the application has set the input source. if (stream == null) throw new IllegalStateException("No input stream!"); // Read the header. decoder = new JBIG2Decoder(); try { byte[] data; int size = (int) stream.length(); if (size == -1) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] temp = new byte[8192]; for (int len = 0; (len = stream.read(temp)) > 0; ) { bos.write(temp, 0, len); } bos.close(); data = bos.toByteArray(); } else { data = new byte[size]; stream.readFully(data); } decoder.decodeJBIG2(data); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JBIG2Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } readFile = true; }
public BufferedImage read(int imageIndex, ImageReadParam param) throws IOException { BufferedImage dst = null; try { // Calculate and return a Rectangle that identifies the region of // the // source image that should be read: // // 1. If param is null, the upper-left corner of the region is (0, // 0), // and the width and height are specified by the width and height // arguments. In other words, the entire image is read. // // 2. If param is not null // // 2.1 If param.getSourceRegion() returns a non-null Rectangle, the // region is calculated as the intersection of param's Rectangle // and the earlier (0, 0, width, height Rectangle). // // 2.2 param.getSubsamplingXOffset() is added to the region's x // coordinate and subtracted from its width. // // 2.3 param.getSubsamplingYOffset() is added to the region's y // coordinate and subtracted from its height. int width = getWidth(imageIndex); int height = getHeight(imageIndex); Rectangle sourceRegion = getSourceRegion(param, width, height); // Source subsampling is used to return a scaled-down source image. // Default 1 values for X and Y subsampling indicate that a // non-scaled // source image will be returned. int sourceXSubsampling = 1; int sourceYSubsampling = 1; // The destination offset determines the starting location in the // destination where decoded pixels are placed. Default (0, 0) // values indicate the upper-left corner. Point destinationOffset = new Point(0, 0); // If param is not null, override the source subsampling, and // destination offset defaults. if (param != null) { sourceXSubsampling = param.getSourceXSubsampling(); sourceYSubsampling = param.getSourceYSubsampling(); destinationOffset = param.getDestinationOffset(); } // Obtain a BufferedImage into which decoded pixels will be placed. // This destination will be returned to the application. // // 1. If param is not null // // 1.1 If param.getDestination() returns a BufferedImage // // 1.1.1 Return this BufferedImage // // Else // // 1.1.2 Invoke param.getDestinationType (). // // 1.1.3 If the returned ImageTypeSpecifier equals // getImageTypes (0) (see below), return its BufferedImage. // // 2. If param is null or a BufferedImage has not been obtained // // 2.1 Return getImageTypes (0)'s BufferedImage. dst = getDestination(param, getImageTypes(0), width, height); // Create a WritableRaster for the destination. WritableRaster wrDst = dst.getRaster(); JBIG2Bitmap bitmap = decoder .getPageAsJBIG2Bitmap(imageIndex) .getSlice(sourceRegion.x, sourceRegion.y, sourceRegion.width, sourceRegion.height); BufferedImage image = bitmap.getBufferedImage(); int newWidth = (int) (image.getWidth() * (1 / (double) sourceXSubsampling)); int newHeight = (int) (image.getHeight() * (1 / (double) sourceYSubsampling)); BufferedImage scaledImage = scaleImage(image.getRaster(), newWidth, newHeight, 1, 1); Raster raster = null; if (scaledImage != null) { raster = scaledImage.getRaster(); } else raster = image.getRaster(); wrDst.setRect(destinationOffset.x, destinationOffset.y, raster); } catch (RuntimeException e) { e.printStackTrace(); } return dst; }
private void checkIndex(int imageIndex) { int noOfPages = decoder.getNumberOfPages(); if (imageIndex < 0 || imageIndex > noOfPages) throw new IndexOutOfBoundsException("Bad index!"); }
public int getNumImages(boolean allowSearch) throws IOException { readFile(); return decoder.getNumberOfPages(); }