/** * Returns {@code true} if the {@linkplain #image} uses a GrayScale {@linkplain ColorSpace color * space}. Note that a GrayScale color space doesn't mean that pixel values are directly stored * as GrayScale component. The image may be {@linkplain #isIndexed indexed} as well. * * @see #forceColorSpaceGRAYScale */ public final boolean isColorSpaceGRAYScale() { final ColorModel cm = image.getColorModel(); if (cm == null) return false; return cm.getColorSpace().getType() == ColorSpace.TYPE_GRAY; }
@Override public void extract(BufferedImage bimg) { if (bimg.getColorModel().getColorSpace().getType() != ColorSpace.TYPE_RGB) { BufferedImage img = new BufferedImage(bimg.getWidth(), bimg.getHeight(), BufferedImage.TYPE_INT_RGB); img.getGraphics().drawImage(bimg, 0, 0, null); bimg = img; } transform = createTransformArray(); int newWidth = bimg.getWidth() - bimg.getWidth() % BLOCK_SIZE; int newHeight = bimg.getHeight() - bimg.getHeight() % BLOCK_SIZE; int[][][] yuvImage = getYUVImage(bimg.getRaster(), newWidth, newHeight, -128); descriptorValues = new int[BLOCK_SIZE * BLOCK_SIZE * 3]; getComponentHistogram(yuvImage, newWidth, newHeight, 0, descriptorValues); getComponentHistogram(yuvImage, newWidth, newHeight, 1, descriptorValues); getComponentHistogram(yuvImage, newWidth, newHeight, 2, descriptorValues); }
@Override public void extract(BufferedImage bimg) { if (bimg.getColorModel().getColorSpace().getType() != ColorSpace.TYPE_RGB) { BufferedImage img = new BufferedImage(bimg.getWidth(), bimg.getHeight(), BufferedImage.TYPE_INT_RGB); img.getGraphics().drawImage(bimg, 0, 0, null); bimg = img; } transform = createTransformArray(); int newWidth = bimg.getWidth() - bimg.getWidth() % BLOCK_SIZE; int newHeight = bimg.getHeight() - bimg.getHeight() % BLOCK_SIZE; int[][][] yuvImage = getYUVImage(bimg.getRaster(), newWidth, newHeight, -128); descriptorValues = new int[BLOCK_SIZE * BLOCK_SIZE * 3]; getComponentHistogram(yuvImage, newWidth, newHeight, 0, descriptorValues); getComponentHistogram(yuvImage, newWidth, newHeight, 1, descriptorValues); getComponentHistogram(yuvImage, newWidth, newHeight, 2, descriptorValues); }
/** * Returns {@code true} if the {@linkplain #image} uses a RGB {@linkplain ColorSpace color * space}. Note that a RGB color space doesn't mean that pixel values are directly stored as RGB * components. The image may be {@linkplain #isIndexed indexed} as well. * * @see #forceColorSpaceRGB */ public final boolean isColorSpaceRGB() { final ColorModel cm = image.getColorModel(); if (cm == null) { return false; } return cm.getColorSpace().getType() == ColorSpace.TYPE_RGB; }
private static int getImageType(final ColorModel colorModel, final ImageWriteParam param) { int uncompressedType; if (colorModel instanceof IndexColorModel) { uncompressedType = TGA.IMAGETYPE_COLORMAPPED; } else { switch (colorModel.getColorSpace().getType()) { case TYPE_RGB: uncompressedType = TGA.IMAGETYPE_TRUECOLOR; break; case TYPE_GRAY: uncompressedType = TGA.IMAGETYPE_MONOCHROME; break; default: throw new IllegalArgumentException("Unsupported color space for TGA: " + colorModel.getColorSpace()); } } return uncompressedType | (TGAImageWriteParam.isRLE(param) ? 8 : 0); }
private boolean isDestinationCMYK(final IIOImage image, final ImageWriteParam param) { // If destination type != null, rendered image type doesn't matter return !image.hasRaster() && image.getRenderedImage().getColorModel().getColorSpace().getType() == ColorSpace.TYPE_CMYK || param != null && param.getDestinationType() != null && param.getDestinationType().getColorModel().getColorSpace().getType() == ColorSpace.TYPE_CMYK; }
@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(); }
@Test public void testCMYKIsTypeCMYK() { assertEquals(ColorSpace.TYPE_CMYK, ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK).getType()); }
@Test public void testAdobeRGB98IsTypeRGB() { assertEquals(ColorSpace.TYPE_RGB, ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998).getType()); }
public static ImageTypeSpecifier createPacked(final ColorSpace colorSpace, final int redMask, final int greenMask, final int blueMask, final int alphaMask, final int transferType, boolean isAlphaPremultiplied) { if (transferType == DataBuffer.TYPE_BYTE || transferType == DataBuffer.TYPE_USHORT) { // ImageTypeSpecifier unconditionally uses bits == 32, we'll use a workaround for BYTE/USHORT types notNull(colorSpace, "colorSpace"); isTrue(colorSpace.getType() == ColorSpace.TYPE_RGB, colorSpace, "ColorSpace must be TYPE_RGB"); isTrue(redMask != 0 || greenMask != 0 || blueMask != 0 || alphaMask != 0, "No mask has at least 1 bit set"); int bits = transferType == DataBuffer.TYPE_BYTE ? 8 : 16; ColorModel colorModel = new DirectColorModel(colorSpace, bits, redMask, greenMask, blueMask, alphaMask, isAlphaPremultiplied, transferType); return new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(1, 1)); } return ImageTypeSpecifier.createPacked(colorSpace, redMask, greenMask, blueMask, alphaMask, transferType, isAlphaPremultiplied); }
private static void assertSameData(BufferedImage expected, BufferedImage actual) { for (int y = 0; y < expected.getHeight(); y++) { for (int x = 0; x < expected.getWidth(); x++) { int expectedRGB = expected.getRGB(x, y); int actualRGB = actual.getRGB(x, y); if (expected.getColorModel().getColorSpace().getType() == ColorSpace.TYPE_GRAY) { // NOTE: For some reason, gray data seems to be one step off... assertEquals("R(" + x + "," + y + ")", expectedRGB & 0xff0000, actualRGB & 0xff0000, 0x10000); assertEquals("G(" + x + "," + y + ")", expectedRGB & 0x00ff00, actualRGB & 0x00ff00, 0x100); assertEquals("B(" + x + "," + y + ")", expectedRGB & 0x0000ff, actualRGB & 0x0000ff, 0x1); } else { assertEquals("R(" + x + "," + y + ")", expectedRGB & 0xff0000, actualRGB & 0xff0000); assertEquals("G(" + x + "," + y + ")", expectedRGB & 0x00ff00, actualRGB & 0x00ff00); assertEquals("B(" + x + "," + y + ")", expectedRGB & 0x0000ff, actualRGB & 0x0000ff); } } } }
public static ImageTypeSpecifier createPackedGrayscale(final ColorSpace colorSpace, final int bits, final int dataType) { notNull(colorSpace, "colorSpace"); isTrue(colorSpace.getType() == ColorSpace.TYPE_GRAY, colorSpace, "ColorSpace must be TYPE_GRAY"); isTrue(bits == 1 || bits == 2 || bits == 4, bits, "bits must be 1, 2, or 4: %s"); isTrue(dataType == DataBuffer.TYPE_BYTE, dataType, "dataType must be TYPE_BYTE: %s"); int numEntries = 1 << bits; byte[] arr = new byte[numEntries]; byte[] arg = new byte[numEntries]; byte[] arb = new byte[numEntries]; // Scale array values according to color profile.. for (int i = 0; i < numEntries; i++) { float[] gray = new float[]{i / (float) (numEntries - 1)}; float[] rgb = colorSpace.toRGB(gray); arr[i] = (byte) (rgb[0] * 255); arg[i] = (byte) (rgb[1] * 255); arb[i] = (byte) (rgb[2]* 255); } ColorModel colorModel = new IndexColorModel(bits, numEntries, arr, arg, arb); SampleModel sampleModel = new MultiPixelPackedSampleModel(dataType, 1, 1, bits); return new ImageTypeSpecifier(colorModel, sampleModel); }
@Test public void testReadAdobeAPP14CMYKAnd3channelData() throws IOException { JPEGImageReader reader = createReader(); try { reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/jpeg/exif-jfif-app13-app14ycck-3channel.jpg"))); IIOReadWarningListener listener = mock(IIOReadWarningListener.class); reader.addIIOReadWarningListener(listener); assertEquals(310, reader.getWidth(0)); assertEquals(384, reader.getHeight(0)); BufferedImage image = reader.read(0, null); verify(listener, times(1)).warningOccurred(eq(reader), matches("(?i).*Adobe App14.*(?-i)CMYK.*SOF.*")); assertNotNull(image); assertEquals(310, image.getWidth()); assertEquals(384, image.getHeight()); assertEquals(ColorSpace.TYPE_RGB, image.getColorModel().getColorSpace().getType()); } finally { reader.dispose(); } }