@Override public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex) throws IOException { readIFD(imageIndex); ImageTypeSpecifier rawType = getRawImageType(imageIndex); Set<ImageTypeSpecifier> specs = new LinkedHashSet<>(5); // TODO: Based on raw type, we can probably convert to most RGB types at least, maybe gray etc if (rawType.getColorModel().getColorSpace().getType() == ColorSpace.TYPE_RGB) { if (rawType.getNumBands() == 3 && rawType.getBitsPerBand(0) == 8) { specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR)); // specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_BGR)); // specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB)); } else if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 8) { specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR)); // specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB)); specs.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR_PRE)); } } specs.add(rawType); return specs.iterator(); }
private ImageTypeSpecifier getRawImageTypeForLayer(final int layerIndex) throws IOException { ImageTypeSpecifier compositeType = getRawImageTypeForCompositeLayer(); PSDLayerInfo layerInfo = metadata.layerInfo.get(layerIndex); // If layer has more channels than composite data, it's normally extra alpha... if (layerInfo.channelInfo.length > compositeType.getNumBands()) { // ...but, it could also be just one of the user masks... int newBandNum = 0; for (PSDChannelInfo channelInfo : layerInfo.channelInfo) { // -2 = user supplied layer mask, -3 real user supplied layer mask (when both a user mask and a vector mask are present) if (channelInfo.channelId >= -1) { newBandNum++; } } // If there really is more channels, then create new imageTypeSpec if (newBandNum > compositeType.getNumBands()) { int[] indices = new int[newBandNum]; for (int i = 0, indicesLength = indices.length; i < indicesLength; i++) { indices[i] = i; } int[] offs = new int[newBandNum]; for (int i = 0, offsLength = offs.length; i < offsLength; i++) { offs[i] = 0; } return ImageTypeSpecifiers.createBanded(compositeType.getColorModel().getColorSpace(), indices, offs, compositeType.getSampleModel().getDataType(), true, false); } } return compositeType; }
if (rawType.getNumBands() == 1 && rawType.getBitsPerBand(0) == 8) { types.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY)); else if (rawType.getNumBands() >= 2 && rawType.getBitsPerBand(0) == 8) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {1, 0}, DataBuffer.TYPE_BYTE, true, false)); else if (rawType.getNumBands() == 1 && rawType.getBitsPerBand(0) == 16) { types.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_GRAY)); else if (rawType.getNumBands() >= 2 && rawType.getBitsPerBand(0) == 16) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {1, 0}, DataBuffer.TYPE_USHORT, true, false)); if (rawType.getNumBands() == 3 && rawType.getBitsPerBand(0) == 8) { else if (rawType.getNumBands() >= 4 && rawType.getBitsPerBand(0) == 8) { else if (rawType.getNumBands() == 3 && rawType.getBitsPerBand(0) == 16) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_USHORT, false, false)); else if (rawType.getNumBands() >= 4 && rawType.getBitsPerBand(0) == 16) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false)); if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 8) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false)); else if (rawType.getNumBands() == 5 && rawType.getBitsPerBand(0) == 8) { types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false)); else if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 16) {
specifier.getNumBands() <= dest.getSampleModel().getNumBands()) { found = true; break;
case 1: byte[] row1 = ((DataBufferByte) rowRaster.getDataBuffer()).getData(); read1bitChannel(c, imageType.getNumBands(), raster.getDataBuffer(), interleavedBands, bandOffset, sourceCM, row1, area, area, xsub, ysub, width, height, byteCounts, compression == PSD.COMPRESSION_RLE); break; case 8: byte[] row8 = ((DataBufferByte) rowRaster.getDataBuffer()).getData(); read8bitChannel(c, imageType.getNumBands(), raster.getDataBuffer(), interleavedBands, bandOffset, sourceCM, row8, area, area, xsub, ysub, width, height, byteCounts, 0, compression == PSD.COMPRESSION_RLE); break; case 16: short[] row16 = ((DataBufferUShort) rowRaster.getDataBuffer()).getData(); read16bitChannel(c, imageType.getNumBands(), raster.getDataBuffer(), interleavedBands, bandOffset, sourceCM, row16, area, area, xsub, ysub, width, height, byteCounts, 0, compression == PSD.COMPRESSION_RLE); break; case 32: int[] row32 = ((DataBufferInt) rowRaster.getDataBuffer()).getData(); read32bitChannel(c, imageType.getNumBands(), raster.getDataBuffer(), interleavedBands, bandOffset, sourceCM, row32, area, area, xsub, ysub, width, height, byteCounts, 0, compression == PSD.COMPRESSION_RLE); break;
? param.getDestinationBands() : null); checkReadParamBandSettings(param, rawType.getNumBands(), destRaster.getNumBands());
checkReadParamBandSettings(param, rawType.getNumBands(), destRaster.getNumBands());
checkReadParamBandSettings(param, rawType.getNumBands(), destRaster.getNumBands());
checkReadParamBandSettings(param, rawType.getNumBands(), image.getSampleModel().getNumBands());
checkReadParamBandSettings(param, rawType.getNumBands(), image.getSampleModel().getNumBands());
checkReadParamBandSettings(param, rawType.getNumBands(), destRaster.getNumBands());
assertEquals(type.getNumBands(), image.getSampleModel().getNumBands()); for (int j = 0; j < type.getNumBands(); j++) { assertEquals(type.getBitsPerBand(j), image.getSampleModel().getSampleSize(j));
checkReadParamBandSettings(param, rawType.getNumBands(), destRaster.getNumBands()); case 8: case 24: rowRaster = Raster.createInterleavedRaster(new DataBufferByte(rowSizeBytes), width, 1, rowSizeBytes, header.getBitCount() / 8, createOffsets(rawType.getNumBands()), null); break; case 16:
@Test public void testGray() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(GRAY, new int [] {0}, false, false); assertEquals(1, spec.getNumBands()); assertEquals(1, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertFalse(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(1, spec.getColorModel().getNumComponents()); assertEquals(1, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(1, spec.getSampleModel().getNumBands()); assertEquals(1, spec.getSampleModel().getNumDataElements()); }
@Test public void testGrayAlpha() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(GRAY, new int [] {0, 1}, true, false); assertEquals(2, spec.getNumBands()); assertEquals(2, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertTrue(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(2, spec.getColorModel().getNumComponents()); assertEquals(1, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(2, spec.getSampleModel().getNumBands()); assertEquals(2, spec.getSampleModel().getNumDataElements()); }
@Test public void testRGB() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(sRGB, new int [] {0, 1, 2}, false, false); assertEquals(3, spec.getNumBands()); assertEquals(3, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertEquals(32, spec.getBitsPerBand(2)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertFalse(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(3, spec.getColorModel().getNumComponents()); assertEquals(3, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(3, spec.getSampleModel().getNumBands()); assertEquals(3, spec.getSampleModel().getNumDataElements()); }
@Test public void testRGBAlpha() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(sRGB, new int [] {0, 1, 2, 3}, true, false); assertEquals(4, spec.getNumBands()); assertEquals(4, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertEquals(32, spec.getBitsPerBand(2)); assertEquals(32, spec.getBitsPerBand(3)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertTrue(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(4, spec.getColorModel().getNumComponents()); assertEquals(3, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(4, spec.getSampleModel().getNumBands()); assertEquals(4, spec.getSampleModel().getNumDataElements()); }
@Test public void testCMYK() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(CMYK, new int [] {0, 1, 2, 3}, false, false); assertEquals(4, spec.getNumBands()); assertEquals(4, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertEquals(32, spec.getBitsPerBand(2)); assertEquals(32, spec.getBitsPerBand(3)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertFalse(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(4, spec.getColorModel().getNumComponents()); assertEquals(4, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(4, spec.getSampleModel().getNumBands()); assertEquals(4, spec.getSampleModel().getNumDataElements()); }
@Test public void testRGBAlphaPre() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(sRGB, new int [] {0, 1, 2, 3}, true, true); assertEquals(4, spec.getNumBands()); assertEquals(4, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertEquals(32, spec.getBitsPerBand(2)); assertEquals(32, spec.getBitsPerBand(3)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertTrue(spec.getColorModel().hasAlpha()); assertTrue(spec.getColorModel().isAlphaPremultiplied()); assertEquals(4, spec.getColorModel().getNumComponents()); assertEquals(3, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(4, spec.getSampleModel().getNumBands()); assertEquals(4, spec.getSampleModel().getNumDataElements()); }
@Test public void testCMYKAlpha() { ImageTypeSpecifier spec = UInt32ImageTypeSpecifier.createInterleaved(CMYK, new int [] {0, 1, 2, 3, 4}, true, false); assertEquals(5, spec.getNumBands()); assertEquals(5, spec.getNumComponents()); assertEquals(32, spec.getBitsPerBand(0)); assertEquals(32, spec.getBitsPerBand(1)); assertEquals(32, spec.getBitsPerBand(2)); assertEquals(32, spec.getBitsPerBand(3)); assertEquals(32, spec.getBitsPerBand(4)); assertThat(spec.getColorModel(), is(ComponentColorModel.class)); assertTrue(spec.getColorModel().hasAlpha()); assertFalse(spec.getColorModel().isAlphaPremultiplied()); assertEquals(5, spec.getColorModel().getNumComponents()); assertEquals(4, spec.getColorModel().getNumColorComponents()); assertThat(spec.getSampleModel(), is(PixelInterleavedSampleModel.class)); assertEquals(5, spec.getSampleModel().getNumBands()); assertEquals(5, spec.getSampleModel().getNumDataElements()); }