mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-04 03:55:28 -04:00
TMI-81: Support for 32 bit unsigned int color model.
Bonus: Cleaned up creation of ImageTypeSpecifiers and added tests.
This commit is contained in:
parent
4b00945c9d
commit
654f7e7a70
@ -31,11 +31,10 @@ package com.twelvemonkeys.imageio.plugins.bmp;
|
|||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.stream.SubImageInputStream;
|
import com.twelvemonkeys.imageio.stream.SubImageInputStream;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
||||||
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.lang.Validate;
|
|
||||||
import com.twelvemonkeys.xml.XMLSerializer;
|
import com.twelvemonkeys.xml.XMLSerializer;
|
||||||
|
|
||||||
import javax.imageio.*;
|
import javax.imageio.*;
|
||||||
@ -167,7 +166,7 @@ public final class BMPImageReader extends ImageReaderBase {
|
|||||||
// Compute bits for > 8 bits (used only for meta data)
|
// Compute bits for > 8 bits (used only for meta data)
|
||||||
int bits = header.getBitCount() <= 8 ? header.getBitCount() : mapSize <= 256 ? 8 : 16;
|
int bits = header.getBitCount() <= 8 ? header.getBitCount() : mapSize <= 256 ? 8 : 16;
|
||||||
|
|
||||||
colorMap = new IndexColorModel(bits, mapSize, colors, 0, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
|
colorMap = new IndexColorModel(bits, mapSize, colors, 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,13 +208,13 @@ public final class BMPImageReader extends ImageReaderBase {
|
|||||||
case 2:
|
case 2:
|
||||||
case 4:
|
case 4:
|
||||||
case 8:
|
case 8:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(readColorMap());
|
return ImageTypeSpecifiers.createFromIndexColorModel(readColorMap());
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
if (header.hasMasks()) {
|
if (header.hasMasks()) {
|
||||||
int[] masks = getMasks();
|
int[] masks = getMasks();
|
||||||
|
|
||||||
return ImageTypeSpecifier.createPacked(
|
return ImageTypeSpecifiers.createPacked(
|
||||||
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
||||||
masks[0], masks[1], masks[2], masks[3],
|
masks[0], masks[1], masks[2], masks[3],
|
||||||
DataBuffer.TYPE_USHORT, false
|
DataBuffer.TYPE_USHORT, false
|
||||||
@ -223,20 +222,20 @@ public final class BMPImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Default if no mask is 555
|
// Default if no mask is 555
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
if (header.getCompression() != DIB.COMPRESSION_RGB) {
|
if (header.getCompression() != DIB.COMPRESSION_RGB) {
|
||||||
throw new IIOException("Unsupported compression for RGB: " + header.getCompression());
|
throw new IIOException("Unsupported compression for RGB: " + header.getCompression());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
if (header.hasMasks()) {
|
if (header.hasMasks()) {
|
||||||
int[] masks = getMasks();
|
int[] masks = getMasks();
|
||||||
|
|
||||||
return ImageTypeSpecifier.createPacked(
|
return ImageTypeSpecifiers.createPacked(
|
||||||
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
||||||
masks[0], masks[1], masks[2], masks[3],
|
masks[0], masks[1], masks[2], masks[3],
|
||||||
DataBuffer.TYPE_INT, false
|
DataBuffer.TYPE_INT, false
|
||||||
@ -244,7 +243,7 @@ public final class BMPImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Default if no mask
|
// Default if no mask
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
if (header.getCompression() == DIB.COMPRESSION_JPEG || header.getCompression() == DIB.COMPRESSION_PNG) {
|
if (header.getCompression() == DIB.COMPRESSION_JPEG || header.getCompression() == DIB.COMPRESSION_PNG) {
|
||||||
|
@ -31,7 +31,7 @@ package com.twelvemonkeys.imageio.plugins.bmp;
|
|||||||
import com.twelvemonkeys.image.ImageUtil;
|
import com.twelvemonkeys.image.ImageUtil;
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.util.WeakWeakMap;
|
import com.twelvemonkeys.util.WeakWeakMap;
|
||||||
|
|
||||||
import javax.imageio.*;
|
import javax.imageio.*;
|
||||||
@ -118,16 +118,16 @@ abstract class DIBImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
BitmapIndexed indexed = new BitmapIndexed(entry, header);
|
BitmapIndexed indexed = new BitmapIndexed(entry, header);
|
||||||
readColorMap(indexed);
|
readColorMap(indexed);
|
||||||
specifier = IndexedImageTypeSpecifier.createFromIndexColorModel(indexed.createColorModel());
|
specifier = ImageTypeSpecifiers.createFromIndexColorModel(indexed.createColorModel());
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IIOException(String.format("Unknown bit depth: %d", header.getBitCount()));
|
throw new IIOException(String.format("Unknown bit depth: %d", header.getBitCount()));
|
||||||
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Harald Kuhr
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name "TwelveMonkeys" nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.twelvemonkeys.imageio.color;
|
||||||
|
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.ComponentColorModel;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ComponentColorModel subclass that correctly handles full 32 bit {@code TYPE_INT} unsigned integral samples.
|
||||||
|
*
|
||||||
|
* @see <a href="https://bugs.openjdk.java.net/browse/JDK-6193686">
|
||||||
|
* ComponentColorModel.getNormalizedComponents() does not handle 32-bit TYPE_INT</a>
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||||
|
* @author last modified by $Author: haraldk$
|
||||||
|
* @version $Id: UInt32ColorModel.java,v 1.0 24.01.11 17.51 haraldk Exp$
|
||||||
|
*/
|
||||||
|
public final class UInt32ColorModel extends ComponentColorModel {
|
||||||
|
public UInt32ColorModel(final ColorSpace cs, final boolean hasAlpha, boolean isAlphaPremultiplied) {
|
||||||
|
super(cs, hasAlpha, isAlphaPremultiplied, hasAlpha ? TRANSLUCENT : OPAQUE, DataBuffer.TYPE_INT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float[] getNormalizedComponents(final Object pixel, float[] normComponents, final int normOffset) {
|
||||||
|
// Implementation borrowed from super class, with modifications to allow 32 bit shifts and unsigned values.
|
||||||
|
int numComponents = getNumComponents();
|
||||||
|
|
||||||
|
if (normComponents == null) {
|
||||||
|
normComponents = new float[numComponents + normOffset];
|
||||||
|
}
|
||||||
|
|
||||||
|
// This class only supports DataBuffer.TYPE_INT, cast is safe
|
||||||
|
int[] ipixel = (int[]) pixel;
|
||||||
|
for (int c = 0, nc = normOffset; c < numComponents; c++, nc++) {
|
||||||
|
normComponents[nc] = ((float) (ipixel[c] & 0xffffffffl)) / ((float) ((1l << getComponentSize(c)) - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
int numColorComponents = getNumColorComponents();
|
||||||
|
|
||||||
|
if (hasAlpha() && isAlphaPremultiplied()) {
|
||||||
|
float alpha = normComponents[numColorComponents + normOffset];
|
||||||
|
|
||||||
|
if (alpha != 0.0f) {
|
||||||
|
float invAlpha = 1.0f / alpha;
|
||||||
|
|
||||||
|
for (int c = normOffset; c < numColorComponents + normOffset; c++) {
|
||||||
|
normComponents[c] *= invAlpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: We don't currently support color spaces that has min and max other than 0.0f and 1.0f respectively.
|
||||||
|
|
||||||
|
return normComponents;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Harald Kuhr
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name "TwelveMonkeys" nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
|
import javax.imageio.ImageTypeSpecifier;
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
import java.awt.image.IndexColorModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory class for creating {@code ImageTypeSpecifier}s.
|
||||||
|
* In most cases, this class will delegate to the corresponding methods in {@link ImageTypeSpecifier}.
|
||||||
|
*
|
||||||
|
* @see javax.imageio.ImageTypeSpecifier
|
||||||
|
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||||
|
* @author last modified by $Author: haraldk$
|
||||||
|
* @version $Id: ImageTypeSpecifiers.java,v 1.0 24.01.11 17.51 haraldk Exp$
|
||||||
|
*/
|
||||||
|
public final class ImageTypeSpecifiers {
|
||||||
|
|
||||||
|
private ImageTypeSpecifiers() {}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createFromBufferedImageType(final int bufferedImageType) {
|
||||||
|
return ImageTypeSpecifier.createFromBufferedImageType(bufferedImageType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createPacked(final ColorSpace colorSpace,
|
||||||
|
final int redMask, final int greenMask,
|
||||||
|
final int blueMask, final int alphaMask,
|
||||||
|
final int transferType, boolean isAlphaPremultiplied) {
|
||||||
|
return ImageTypeSpecifier.createPacked(colorSpace, redMask, greenMask, blueMask, alphaMask, transferType, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createInterleaved(final ColorSpace colorSpace,
|
||||||
|
final int[] bandOffsets,
|
||||||
|
final int dataType,
|
||||||
|
final boolean hasAlpha,
|
||||||
|
final boolean isAlphaPremultiplied) {
|
||||||
|
// As the ComponentColorModel is broken for 32 bit unsigned int, we'll use our own version
|
||||||
|
if (dataType == DataBuffer.TYPE_INT) {
|
||||||
|
return new UInt32ImageTypeSpecifier(colorSpace, bandOffsets, hasAlpha, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...or fall back to default for anything else
|
||||||
|
return ImageTypeSpecifier.createInterleaved(colorSpace, bandOffsets, dataType, hasAlpha, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createBanded(final ColorSpace colorSpace,
|
||||||
|
final int[] bankIndices, final int[] bandOffsets,
|
||||||
|
final int dataType,
|
||||||
|
final boolean hasAlpha, final boolean isAlphaPremultiplied) {
|
||||||
|
return ImageTypeSpecifier.createBanded(colorSpace, bankIndices, bandOffsets, dataType, hasAlpha, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createGrayscale(final int bits, final int dataType) {
|
||||||
|
if (bits == 32 && dataType == DataBuffer.TYPE_INT) {
|
||||||
|
// As the ComponentColorModel is broken for 32 bit unsigned int, we'll use our own version
|
||||||
|
return new UInt32ImageTypeSpecifier(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] {0}, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: The isSigned boolean is stored but *not used for anything* in the Grayscale ImageTypeSpecifier...
|
||||||
|
return ImageTypeSpecifier.createGrayscale(bits, dataType, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createGrayscale(final int bits, final int dataType, final boolean isAlphaPremultiplied) {
|
||||||
|
if (bits == 32 && dataType == DataBuffer.TYPE_INT) {
|
||||||
|
// As the ComponentColorModel is broken for 32 bit unsigned int, we'll use our own version
|
||||||
|
return new UInt32ImageTypeSpecifier(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] {0, 1}, true, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: The isSigned boolean is stored but *not used for anything* in the Grayscale ImageTypeSpecifier...
|
||||||
|
return ImageTypeSpecifier.createGrayscale(bits, dataType, false, isAlphaPremultiplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createIndexed(final byte[] redLUT, final byte[] greenLUT,
|
||||||
|
final byte[] blueLUT, final byte[] alphaLUT,
|
||||||
|
final int bits, final int dataType) {
|
||||||
|
return ImageTypeSpecifier.createIndexed(redLUT, greenLUT, blueLUT, alphaLUT, bits, dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createIndexed(final int[] colors, final boolean hasAlpha, final int transIndex,
|
||||||
|
final int bits, final int dataType) {
|
||||||
|
return createFromIndexColorModel(new IndexColorModel(bits, colors.length, colors, 0, hasAlpha, transIndex, dataType));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ImageTypeSpecifier createFromIndexColorModel(final IndexColorModel pColorModel) {
|
||||||
|
return new IndexedImageTypeSpecifier(pColorModel);
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,13 @@
|
|||||||
package com.twelvemonkeys.imageio.util;
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
import javax.imageio.ImageTypeSpecifier;
|
import javax.imageio.ImageTypeSpecifier;
|
||||||
import java.awt.image.IndexColorModel;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.IndexColorModel;
|
||||||
import java.awt.image.WritableRaster;
|
import java.awt.image.WritableRaster;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
import static com.twelvemonkeys.lang.Validate.notNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IndexedImageTypeSpecifier
|
* IndexedImageTypeSpecifier
|
||||||
*
|
*
|
||||||
@ -13,18 +15,14 @@ import java.util.Hashtable;
|
|||||||
* @author last modified by $Author: haraldk$
|
* @author last modified by $Author: haraldk$
|
||||||
* @version $Id: IndexedImageTypeSpecifier.java,v 1.0 May 19, 2008 11:04:28 AM haraldk Exp$
|
* @version $Id: IndexedImageTypeSpecifier.java,v 1.0 May 19, 2008 11:04:28 AM haraldk Exp$
|
||||||
*/
|
*/
|
||||||
public class IndexedImageTypeSpecifier extends ImageTypeSpecifier {
|
final class IndexedImageTypeSpecifier extends ImageTypeSpecifier {
|
||||||
IndexedImageTypeSpecifier(IndexColorModel pColorModel) {
|
IndexedImageTypeSpecifier(final IndexColorModel pColorModel) {
|
||||||
// For some reason, we need a sample model
|
// For some reason, we need a sample model
|
||||||
super(pColorModel, pColorModel.createCompatibleSampleModel(1, 1));
|
super(notNull(pColorModel, "colorModel"), pColorModel.createCompatibleSampleModel(1, 1));
|
||||||
}
|
|
||||||
|
|
||||||
public static ImageTypeSpecifier createFromIndexColorModel(final IndexColorModel pColorModel) {
|
|
||||||
return new IndexedImageTypeSpecifier(pColorModel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final BufferedImage createBufferedImage(int pWidth, int pHeight) {
|
public final BufferedImage createBufferedImage(final int pWidth, final int pHeight) {
|
||||||
try {
|
try {
|
||||||
// This is a fix for the super-method, that first creates a sample model, and then
|
// This is a fix for the super-method, that first creates a sample model, and then
|
||||||
// creates a raster from it, using Raster.createWritableRaster. The problem with
|
// creates a raster from it, using Raster.createWritableRaster. The problem with
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Harald Kuhr
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name "TwelveMonkeys" nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
|
import com.twelvemonkeys.imageio.color.UInt32ColorModel;
|
||||||
|
|
||||||
|
import javax.imageio.ImageTypeSpecifier;
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
import java.awt.image.PixelInterleavedSampleModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ImageTypeSpecifier for interleaved 32 bit unsigned integral samples.
|
||||||
|
*
|
||||||
|
* @see com.twelvemonkeys.imageio.color.UInt32ColorModel
|
||||||
|
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||||
|
* @author last modified by $Author: haraldk$
|
||||||
|
* @version $Id: UInt32ImageTypeSpecifier.java,v 1.0 24.01.11 17.51 haraldk Exp$
|
||||||
|
*/
|
||||||
|
final class UInt32ImageTypeSpecifier extends ImageTypeSpecifier {
|
||||||
|
UInt32ImageTypeSpecifier(final ColorSpace cs, int[] bandOffsets, final boolean hasAlpha, final boolean isAlphaPremultiplied) {
|
||||||
|
super(
|
||||||
|
new UInt32ColorModel(cs, hasAlpha, isAlphaPremultiplied),
|
||||||
|
new PixelInterleavedSampleModel(
|
||||||
|
DataBuffer.TYPE_INT, 1, 1,
|
||||||
|
cs.getNumComponents() + (hasAlpha ? 1 : 0),
|
||||||
|
cs.getNumComponents() + (hasAlpha ? 1 : 0),
|
||||||
|
bandOffsets
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.twelvemonkeys.imageio.color;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.ComponentColorModel;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class UInt32ColorModelTest {
|
||||||
|
|
||||||
|
private static final ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||||
|
private static final ColorSpace GRAY = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsRGBBlack() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(sRGB, true, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{0, 0, 0, 0}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(0, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsRGBGray() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(sRGB, true, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(0.5f, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsRGBWhite() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(sRGB, true, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{-1, -1, -1, -1}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(1, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsRGB() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(sRGB, true, false);
|
||||||
|
int[] pixel = new int[4];
|
||||||
|
|
||||||
|
float[] normalized = null;
|
||||||
|
for (long pix = 0; pix < 1l << 32; pix += Short.MAX_VALUE) {
|
||||||
|
float expected = ((float) (pix & 0xffffffffl)) / ((float) ((1l << 32) - 1));
|
||||||
|
|
||||||
|
for (int i = 0; i < pixel.length; i++) {
|
||||||
|
pixel[i] = (int) pix;
|
||||||
|
}
|
||||||
|
|
||||||
|
normalized = model.getNormalizedComponents(pixel, normalized, 0);
|
||||||
|
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(expected, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsGrayBlack() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(GRAY, false, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{0}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(0, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsGrayGray() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(GRAY, false, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{Integer.MIN_VALUE}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(0.5f, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsGrayWhite() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(GRAY, false, false);
|
||||||
|
float[] normalized = model.getNormalizedComponents(new int[]{-1}, null, 0);
|
||||||
|
for (float norm : normalized) {
|
||||||
|
assertEquals(1, norm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNormalizedComponentsGray() {
|
||||||
|
ComponentColorModel model = new UInt32ColorModel(GRAY, false, false);
|
||||||
|
int[] pixel = new int[1];
|
||||||
|
|
||||||
|
float[] normalized = null;
|
||||||
|
for (long pix = 0; pix < 1l << 32; pix += Short.MAX_VALUE) {
|
||||||
|
float expected = ((float) (pix & 0xffffffffl)) / ((float) ((1l << 32) - 1));
|
||||||
|
|
||||||
|
pixel[0] = (int) pix;
|
||||||
|
|
||||||
|
normalized = model.getNormalizedComponents(pixel, normalized, 0);
|
||||||
|
|
||||||
|
assertEquals(expected, normalized[0], 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,583 @@
|
|||||||
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.imageio.ImageTypeSpecifier;
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
import java.awt.image.IndexColorModel;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class ImageTypeSpecifiersTest {
|
||||||
|
|
||||||
|
private static final ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||||
|
private static final ColorSpace GRAY = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||||
|
|
||||||
|
private static final int DCM_RED_MASK = 0x00ff0000;
|
||||||
|
private static final int DCM_GREEN_MASK = 0x0000ff00;
|
||||||
|
private static final int DCM_BLUE_MASK = 0x000000ff;
|
||||||
|
private static final int DCM_ALPHA_MASK = 0xff000000;
|
||||||
|
private static final int DCM_565_RED_MASK = 0xf800;
|
||||||
|
private static final int DCM_565_GRN_MASK = 0x07E0;
|
||||||
|
private static final int DCM_565_BLU_MASK = 0x001F;
|
||||||
|
private static final int DCM_555_RED_MASK = 0x7C00;
|
||||||
|
private static final int DCM_555_GRN_MASK = 0x03E0;
|
||||||
|
private static final int DCM_555_BLU_MASK = 0x001F;
|
||||||
|
private static final int DCM_BGR_RED_MASK = 0x0000ff;
|
||||||
|
private static final int DCM_BGR_GRN_MASK = 0x00ff00;
|
||||||
|
private static final int DCM_BGR_BLU_MASK = 0xff0000;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateFromBufferedImageType() {
|
||||||
|
for (int type = BufferedImage.TYPE_INT_RGB; type < BufferedImage.TYPE_BYTE_INDEXED; type++) {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createFromBufferedImageType(type),
|
||||||
|
ImageTypeSpecifiers.createFromBufferedImageType(type)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreatePacked() {
|
||||||
|
// TYPE_INT_RGB
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, 0, DataBuffer.TYPE_INT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, 0, DataBuffer.TYPE_INT, false)
|
||||||
|
);
|
||||||
|
// TYPE_INT_ARGB
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, DCM_ALPHA_MASK, DataBuffer.TYPE_INT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, DCM_ALPHA_MASK, DataBuffer.TYPE_INT, false)
|
||||||
|
);
|
||||||
|
// TYPE_INT_ARGB_PRE
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, DCM_ALPHA_MASK, DataBuffer.TYPE_INT, true),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_RED_MASK, DCM_GREEN_MASK, DCM_BLUE_MASK, DCM_ALPHA_MASK, DataBuffer.TYPE_INT, true)
|
||||||
|
);
|
||||||
|
// TYPE_INT_BGR
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_BGR_RED_MASK, DCM_BGR_GRN_MASK, DCM_BGR_BLU_MASK, 0, DataBuffer.TYPE_INT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_BGR_RED_MASK, DCM_BGR_GRN_MASK, DCM_BGR_BLU_MASK, 0, DataBuffer.TYPE_INT, false)
|
||||||
|
);
|
||||||
|
// TYPE_USHORT_555_RGB
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_555_RED_MASK, DCM_555_GRN_MASK, DCM_555_BLU_MASK, 0, DataBuffer.TYPE_USHORT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_555_RED_MASK, DCM_555_GRN_MASK, DCM_555_BLU_MASK, 0, DataBuffer.TYPE_USHORT, false)
|
||||||
|
);
|
||||||
|
// "SHORT 555 RGB" (impossible for some reason)
|
||||||
|
// assertEquals(
|
||||||
|
// ImageTypeSpecifier.createPacked(sRGB, DCM_555_RED_MASK, DCM_555_GRN_MASK, DCM_555_BLU_MASK, 0, DataBuffer.TYPE_SHORT, false),
|
||||||
|
// ImageTypeSpecifiers.createPacked(sRGB, DCM_555_RED_MASK, DCM_555_GRN_MASK, DCM_555_BLU_MASK, 0, DataBuffer.TYPE_SHORT, false)
|
||||||
|
// );
|
||||||
|
// TYPE_USHORT_565_RGB
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, DCM_565_RED_MASK, DCM_565_GRN_MASK, DCM_565_BLU_MASK, 0, DataBuffer.TYPE_USHORT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, DCM_565_RED_MASK, DCM_565_GRN_MASK, DCM_565_BLU_MASK, 0, DataBuffer.TYPE_USHORT, false)
|
||||||
|
);
|
||||||
|
// "USHORT 4444 ARGB"
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, 0xf00, 0xf0, 0xf, 0xf000, DataBuffer.TYPE_USHORT, false),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, 0xf00, 0xf0, 0xf, 0xf000, DataBuffer.TYPE_USHORT, false)
|
||||||
|
);
|
||||||
|
// "USHORT 4444 ARGB PRE"
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createPacked(sRGB, 0xf00, 0xf0, 0xf, 0xf000, DataBuffer.TYPE_USHORT, true),
|
||||||
|
ImageTypeSpecifiers.createPacked(sRGB, 0xf00, 0xf0, 0xf, 0xf000, DataBuffer.TYPE_USHORT, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateInterleaved8() {
|
||||||
|
// 8 bits/sample
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_BYTE, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_BYTE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_BYTE, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_BYTE, true, false)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_BYTE, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_BYTE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, true, true),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateInterleaved16() {
|
||||||
|
// 16 bits/sample
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_USHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_USHORT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_USHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_USHORT, true, false)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_USHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_USHORT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_USHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_USHORT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_USHORT, true, true),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_USHORT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateInterleaved32() {
|
||||||
|
// 32 bits/sample
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0}, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_INT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0, 1}, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_INT, true, false)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(sRGB, new int[] {0, 1, 2}, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_INT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(sRGB, new int[] {0, 1, 2, 3}, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_INT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(sRGB, new int[] {0, 1, 2, 3}, true, true),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_INT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateInterleaved32fp() {
|
||||||
|
// 32 bits/sample
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_FLOAT, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_FLOAT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_FLOAT, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_FLOAT, true, false)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_FLOAT, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_FLOAT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_FLOAT, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_FLOAT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_FLOAT, true, true),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_FLOAT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateInterleaved64fp() {
|
||||||
|
// 64 bits/sample
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_DOUBLE, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0}, DataBuffer.TYPE_DOUBLE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_DOUBLE, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(GRAY, new int[] {0, 1}, DataBuffer.TYPE_DOUBLE, true, false)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_DOUBLE, false, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2}, DataBuffer.TYPE_DOUBLE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_DOUBLE, true, false),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_DOUBLE, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_DOUBLE, true, true),
|
||||||
|
ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {0, 1, 2, 3}, DataBuffer.TYPE_DOUBLE, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBanded8() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_BYTE, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_BYTE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_BYTE, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_BYTE, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBanded16() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_USHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_USHORT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_USHORT, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_USHORT, true, true)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_SHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_SHORT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_SHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_SHORT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_SHORT, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_SHORT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBanded32() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_INT, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_INT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_INT, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_INT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBanded32fp() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_FLOAT, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_FLOAT, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_FLOAT, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_FLOAT, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_FLOAT, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_FLOAT, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBanded64fp() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_DOUBLE, false, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_DOUBLE, false, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_DOUBLE, true, false),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_DOUBLE, true, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_DOUBLE, true, true),
|
||||||
|
ImageTypeSpecifiers.createBanded(sRGB, new int[] {0, 1, 2, 3}, new int[] {0, 1000, 2000, 3000}, DataBuffer.TYPE_DOUBLE, true, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscale1to8() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscale16() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, true), // NOTE: Signed TYPE_USHORT makes no sense...
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, false), // NOTE: Unsigned TYPE_SHORT makes no sense...
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscale32() {
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0}, false, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0}, false, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscaleAlpha1to8() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, false, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, false, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE, true)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, true, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, true, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(bits, DataBuffer.TYPE_BYTE, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscaleAlpha16() {
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, false, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT, true)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_USHORT, true, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_USHORT, true)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, false, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, false, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT, true)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, true, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createGrayscale(16, DataBuffer.TYPE_SHORT, true, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(16, DataBuffer.TYPE_SHORT, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateGrayscaleAlpha32() {
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0, 1}, true, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0, 1}, true, false),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT, false)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0, 1}, true, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT, true)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
new UInt32ImageTypeSpecifier(GRAY, new int[] {0, 1}, true, true),
|
||||||
|
ImageTypeSpecifiers.createGrayscale(32, DataBuffer.TYPE_INT, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateIndexedByteArrays1to8() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
byte[] lut = createByteLut(1 << bits);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_BYTE),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_BYTE)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_BYTE),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_BYTE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateIndexedByteArrays16() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
byte[] lut = createByteLut(1 << bits);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_USHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_USHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
|
||||||
|
// TYPE_SHORT is unsupported to MultiPixelPacked format (MultiPixelPackedSampleModel)
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] lut = createByteLut(1 << 16); // This is stupid, but ImageTypeSpecifier enforces lut.length == 1 << bits
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_USHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_USHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_SHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_SHORT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_SHORT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_SHORT)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateIndexedByteArrays32() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
byte[] lut = createByteLut(1 << bits);
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_INT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, bits, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_INT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, bits, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] lut = createByteLut(1 << 16); // This is stupid, but ImageTypeSpecifier enforces lut.length == 1 << bits
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_INT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, null, 16, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
assertEquals(
|
||||||
|
ImageTypeSpecifier.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_INT),
|
||||||
|
ImageTypeSpecifiers.createIndexed(lut, lut, lut, lut, 16, DataBuffer.TYPE_INT)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateIndexedIntArray1to8() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
int[] colors = createIntLut(1 << bits);
|
||||||
|
assertEquals(
|
||||||
|
new IndexedImageTypeSpecifier(new IndexColorModel(bits, colors.length, colors, 0, false, -1, DataBuffer.TYPE_BYTE)),
|
||||||
|
ImageTypeSpecifiers.createIndexed(colors, false, -1, bits, DataBuffer.TYPE_BYTE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateIndexedIntArray16() {
|
||||||
|
int[] colors = createIntLut(1 << 16);
|
||||||
|
assertEquals(
|
||||||
|
new IndexedImageTypeSpecifier(new IndexColorModel(16, colors.length, colors, 0, false, -1, DataBuffer.TYPE_USHORT)),
|
||||||
|
ImageTypeSpecifiers.createIndexed(colors, false, -1, 16, DataBuffer.TYPE_USHORT)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateFromIndexedColorModel1to8() {
|
||||||
|
for (int bits = 1; bits <= 8; bits <<= 1) {
|
||||||
|
int[] colors = createIntLut(1 << bits);
|
||||||
|
IndexColorModel colorModel = new IndexColorModel(bits, colors.length, colors, 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
|
assertEquals(
|
||||||
|
new IndexedImageTypeSpecifier(colorModel),
|
||||||
|
ImageTypeSpecifiers.createFromIndexColorModel(colorModel)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateFromIndexedColorModel16() {
|
||||||
|
int[] colors = createIntLut(1 << 16);
|
||||||
|
IndexColorModel colorModel = new IndexColorModel(16, colors.length, colors, 0, false, -1, DataBuffer.TYPE_USHORT);
|
||||||
|
assertEquals(
|
||||||
|
new IndexedImageTypeSpecifier(colorModel),
|
||||||
|
ImageTypeSpecifiers.createFromIndexColorModel(colorModel)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static byte[] createByteLut(final int count) {
|
||||||
|
byte[] lut = new byte[count];
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
lut[i] = (byte) count;
|
||||||
|
}
|
||||||
|
return lut;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[] createIntLut(final int count) {
|
||||||
|
int[] lut = new int[count];
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
lut[i] = 0xff000000 | count << 16 | count << 8 | count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lut;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
import java.awt.image.IndexColorModel;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IndexedImageTypeSpecifierTestCase
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||||
|
* @author last modified by $Author: haraldk$
|
||||||
|
* @version $Id: IndexedImageTypeSpecifierTestCase.java,v 1.0 Jun 9, 2008 2:42:03 PM haraldk Exp$
|
||||||
|
*/
|
||||||
|
public class IndexedImageTypeSpecifierTest {
|
||||||
|
@Test
|
||||||
|
public void testEquals() {
|
||||||
|
IndexColorModel cm = new IndexColorModel(1, 2, new int[]{0xffffff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
|
|
||||||
|
IndexedImageTypeSpecifier spec = new IndexedImageTypeSpecifier(cm);
|
||||||
|
IndexedImageTypeSpecifier other = new IndexedImageTypeSpecifier(cm);
|
||||||
|
IndexedImageTypeSpecifier different = new IndexedImageTypeSpecifier(new IndexColorModel(2, 2, new int[]{0xff00ff, 0x00, 0xff00ff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE));
|
||||||
|
|
||||||
|
assertEquals(spec, other);
|
||||||
|
assertEquals(other, spec);
|
||||||
|
|
||||||
|
assertEquals(spec.hashCode(), other.hashCode());
|
||||||
|
|
||||||
|
assertTrue(spec.equals(other));
|
||||||
|
assertTrue(other.equals(spec));
|
||||||
|
|
||||||
|
// TODO: There is still a problem that IndexColorModel does not override equals,
|
||||||
|
// so any model with the same number of bits, transparency, and transfer type will be treated as equal
|
||||||
|
assertFalse(other.equals(different));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHashCode() {
|
||||||
|
IndexColorModel cm = new IndexColorModel(1, 2, new int[]{0xffffff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
|
|
||||||
|
IndexedImageTypeSpecifier spec = new IndexedImageTypeSpecifier(cm);
|
||||||
|
IndexedImageTypeSpecifier other = new IndexedImageTypeSpecifier(cm);
|
||||||
|
IndexedImageTypeSpecifier different = new IndexedImageTypeSpecifier(new IndexColorModel(2, 2, new int[]{0xff00ff, 0x00, 0xff00ff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE));
|
||||||
|
|
||||||
|
// TODO: There is still a problem that IndexColorModel does not override hashCode,
|
||||||
|
// so any model with the same number of bits, transparency, and transfer type will have same hash
|
||||||
|
assertEquals(spec.hashCode(), other.hashCode());
|
||||||
|
assertFalse(spec.hashCode() == different.hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void testCreateNull() {
|
||||||
|
new IndexedImageTypeSpecifier(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBufferedImageBinary() {
|
||||||
|
IndexColorModel cm = new IndexColorModel(1, 2, new int[]{0xffffff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
|
IndexedImageTypeSpecifier spec = new IndexedImageTypeSpecifier(cm);
|
||||||
|
|
||||||
|
BufferedImage image = spec.createBufferedImage(2, 2);
|
||||||
|
|
||||||
|
assertNotNull(image);
|
||||||
|
assertEquals(BufferedImage.TYPE_BYTE_BINARY, image.getType());
|
||||||
|
assertEquals(cm, image.getColorModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateBufferedImageIndexed() {
|
||||||
|
IndexColorModel cm = new IndexColorModel(8, 256, new int[256], 0, false, -1, DataBuffer.TYPE_BYTE);
|
||||||
|
IndexedImageTypeSpecifier spec = new IndexedImageTypeSpecifier(cm);
|
||||||
|
|
||||||
|
BufferedImage image = spec.createBufferedImage(2, 2);
|
||||||
|
|
||||||
|
assertNotNull(image);
|
||||||
|
assertEquals(BufferedImage.TYPE_BYTE_INDEXED, image.getType());
|
||||||
|
assertEquals(cm, image.getColorModel());
|
||||||
|
}
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
package com.twelvemonkeys.imageio.util;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import java.awt.image.DataBuffer;
|
|
||||||
import java.awt.image.IndexColorModel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IndexedImageTypeSpecifierTestCase
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
|
||||||
* @author last modified by $Author: haraldk$
|
|
||||||
* @version $Id: IndexedImageTypeSpecifierTestCase.java,v 1.0 Jun 9, 2008 2:42:03 PM haraldk Exp$
|
|
||||||
*/
|
|
||||||
public class IndexedImageTypeSpecifierTestCase extends TestCase {
|
|
||||||
public void testEquals() {
|
|
||||||
IndexColorModel cm = new IndexColorModel(1, 2, new int[]{0xffffff, 0x00}, 0, false, -1, DataBuffer.TYPE_BYTE);
|
|
||||||
|
|
||||||
IndexedImageTypeSpecifier spec = new IndexedImageTypeSpecifier(cm);
|
|
||||||
IndexedImageTypeSpecifier other = new IndexedImageTypeSpecifier(cm);
|
|
||||||
|
|
||||||
assertEquals(spec, other);
|
|
||||||
assertEquals(other, spec);
|
|
||||||
|
|
||||||
assertTrue(spec.equals(other));
|
|
||||||
assertTrue(other.equals(spec));
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,199 @@
|
|||||||
|
package com.twelvemonkeys.imageio.util;
|
||||||
|
|
||||||
|
import com.twelvemonkeys.imageio.color.ColorSpaces;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.imageio.ImageTypeSpecifier;
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
import java.awt.image.ComponentColorModel;
|
||||||
|
import java.awt.image.DataBuffer;
|
||||||
|
import java.awt.image.PixelInterleavedSampleModel;
|
||||||
|
|
||||||
|
import static org.hamcrest.core.Is.is;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class UInt32ImageTypeSpecifierTest {
|
||||||
|
private static final ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||||
|
private static final ColorSpace GRAY = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||||
|
private static final ColorSpace CMYK = ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGray() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(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 = new UInt32ImageTypeSpecifier(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 = new UInt32ImageTypeSpecifier(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 = new UInt32ImageTypeSpecifier(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 testRGBAlphaPre() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(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 testCMYK() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(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 testCMYKAlpha() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEquals() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2}, false, false);
|
||||||
|
ImageTypeSpecifier other = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2}, false, false);
|
||||||
|
ImageTypeSpecifier different = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2, 3}, true, false);
|
||||||
|
// Equivalent, but broken, not equal
|
||||||
|
ImageTypeSpecifier broken =
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int [] {0, 1, 2}, DataBuffer.TYPE_INT, false, false);
|
||||||
|
|
||||||
|
assertEquals(spec, other);
|
||||||
|
assertEquals(other, spec);
|
||||||
|
|
||||||
|
assertTrue(spec.equals(other));
|
||||||
|
assertTrue(other.equals(spec));
|
||||||
|
assertFalse(spec.equals(different));
|
||||||
|
assertFalse(different.equals(spec));
|
||||||
|
assertFalse(spec.equals(broken));
|
||||||
|
assertFalse(broken.equals(spec));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHashCode() {
|
||||||
|
ImageTypeSpecifier spec = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2}, false, false);
|
||||||
|
ImageTypeSpecifier other = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2}, false, false);
|
||||||
|
ImageTypeSpecifier different = new UInt32ImageTypeSpecifier(sRGB, new int [] {0, 1, 2, 3}, true, false);
|
||||||
|
// Equivalent, but broken, not equal
|
||||||
|
ImageTypeSpecifier broken =
|
||||||
|
ImageTypeSpecifier.createInterleaved(sRGB, new int [] {0, 1, 2}, DataBuffer.TYPE_INT, false, false);
|
||||||
|
|
||||||
|
assertEquals(spec.hashCode(), other.hashCode());
|
||||||
|
assertFalse(spec.hashCode() == different.hashCode());
|
||||||
|
assertFalse(spec.hashCode() == broken.hashCode());
|
||||||
|
}
|
||||||
|
}
|
@ -30,7 +30,7 @@ package com.twelvemonkeys.imageio.plugins.icns;
|
|||||||
|
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
|
|
||||||
import javax.imageio.*;
|
import javax.imageio.*;
|
||||||
import javax.imageio.spi.ImageReaderSpi;
|
import javax.imageio.spi.ImageReaderSpi;
|
||||||
@ -99,21 +99,21 @@ public final class ICNSImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
switch (resource.depth()) {
|
switch (resource.depth()) {
|
||||||
case 1:
|
case 1:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(ICNS1BitColorModel.INSTANCE);
|
return ImageTypeSpecifiers.createFromIndexColorModel(ICNS1BitColorModel.INSTANCE);
|
||||||
case 4:
|
case 4:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(ICNS4BitColorModel.INSTANCE);
|
return ImageTypeSpecifiers.createFromIndexColorModel(ICNS4BitColorModel.INSTANCE);
|
||||||
case 8:
|
case 8:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(ICNS8BitColorModel.INSTANCE);
|
return ImageTypeSpecifiers.createFromIndexColorModel(ICNS8BitColorModel.INSTANCE);
|
||||||
case 32:
|
case 32:
|
||||||
if (resource.isCompressed()) {
|
if (resource.isCompressed()) {
|
||||||
return ImageTypeSpecifier.createBanded(
|
return ImageTypeSpecifiers.createBanded(
|
||||||
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
||||||
new int[]{0, 1, 2, 3}, createBandOffsets(resource.size().width * resource.size().height),
|
new int[]{0, 1, 2, 3}, createBandOffsets(resource.size().width * resource.size().height),
|
||||||
DataBuffer.TYPE_BYTE, true, false
|
DataBuffer.TYPE_BYTE, true, false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return ImageTypeSpecifier.createInterleaved(
|
return ImageTypeSpecifiers.createInterleaved(
|
||||||
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
||||||
new int[]{1, 2, 3, 0},
|
new int[]{1, 2, 3, 0},
|
||||||
DataBuffer.TYPE_BYTE, true, false
|
DataBuffer.TYPE_BYTE, true, false
|
||||||
@ -141,8 +141,8 @@ public final class ICNSImageReader extends ImageReaderBase {
|
|||||||
case 8:
|
case 8:
|
||||||
// Fall through & convert during read
|
// Fall through & convert during read
|
||||||
case 32:
|
case 32:
|
||||||
specifiers.add(ImageTypeSpecifier.createPacked(ColorSpace.getInstance(ColorSpace.CS_sRGB), 0xff0000, 0x00ff00, 0x0000ff, 0xff000000, DataBuffer.TYPE_INT, false));
|
specifiers.add(ImageTypeSpecifiers.createPacked(ColorSpace.getInstance(ColorSpace.CS_sRGB), 0xff0000, 0x00ff00, 0x0000ff, 0xff000000, DataBuffer.TYPE_INT, false));
|
||||||
specifiers.add(ImageTypeSpecifier.createInterleaved(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
specifiers.add(ImageTypeSpecifiers.createInterleaved(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException(String.format("Unknown bit depth: %d", resource.depth()));
|
throw new IllegalStateException(String.format("Unknown bit depth: %d", resource.depth()));
|
||||||
@ -199,7 +199,7 @@ public final class ICNSImageReader extends ImageReaderBase {
|
|||||||
BufferedImage image = getDestination(param, getImageTypes(imageIndex), width, height);
|
BufferedImage image = getDestination(param, getImageTypes(imageIndex), width, height);
|
||||||
ImageTypeSpecifier rawType = getRawImageType(imageIndex);
|
ImageTypeSpecifier rawType = getRawImageType(imageIndex);
|
||||||
|
|
||||||
if (rawType instanceof IndexedImageTypeSpecifier && rawType.getBufferedImageType() != image.getType()) {
|
if (rawType.getColorModel() instanceof IndexColorModel && rawType.getBufferedImageType() != image.getType()) {
|
||||||
checkReadParamBandSettings(param, 4, image.getSampleModel().getNumBands());
|
checkReadParamBandSettings(param, 4, image.getSampleModel().getNumBands());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -32,7 +32,7 @@ import com.twelvemonkeys.image.ResampleOp;
|
|||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.stream.BufferedImageInputStream;
|
import com.twelvemonkeys.imageio.stream.BufferedImageInputStream;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.io.enc.PackBitsDecoder;
|
import com.twelvemonkeys.io.enc.PackBitsDecoder;
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ public class IFFImageReader extends ImageReaderBase {
|
|||||||
int remaining = imageInput.readInt() - 4; // We'll read 4 more in a sec
|
int remaining = imageInput.readInt() - 4; // We'll read 4 more in a sec
|
||||||
|
|
||||||
formType = imageInput.readInt();
|
formType = imageInput.readInt();
|
||||||
if (formType != IFF.TYPE_ILBM && formType != IFF.TYPE_PBM) {
|
if (formType != IFF.TYPE_ILBM && formType != IFF.TYPE_PBM/* && formType != IFF.TYPE_DEEP*/) {
|
||||||
throw new IIOException(String.format("Only IFF FORM types 'ILBM' and 'PBM ' supported: %s", IFFUtil.toChunkStr(formType)));
|
throw new IIOException(String.format("Only IFF FORM types 'ILBM' and 'PBM ' supported: %s", IFFUtil.toChunkStr(formType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ public class IFFImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
List<ImageTypeSpecifier> types = Arrays.asList(
|
List<ImageTypeSpecifier> types = Arrays.asList(
|
||||||
getRawImageType(pIndex),
|
getRawImageType(pIndex),
|
||||||
ImageTypeSpecifier.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR)
|
ImageTypeSpecifiers.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR)
|
||||||
// TODO: ImageTypeSpecifier.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB),
|
// TODO: ImageTypeSpecifier.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB),
|
||||||
// TODO: Allow 32 bit always. Allow RGB and discard alpha, if present?
|
// TODO: Allow 32 bit always. Allow RGB and discard alpha, if present?
|
||||||
);
|
);
|
||||||
@ -357,22 +357,22 @@ public class IFFImageReader extends ImageReaderBase {
|
|||||||
if (!isConvertToRGB()) {
|
if (!isConvertToRGB()) {
|
||||||
if (colorMap != null) {
|
if (colorMap != null) {
|
||||||
IndexColorModel cm = colorMap.getIndexColorModel(header, isEHB());
|
IndexColorModel cm = colorMap.getIndexColorModel(header, isEHB());
|
||||||
specifier = IndexedImageTypeSpecifier.createFromIndexColorModel(cm);
|
specifier = ImageTypeSpecifiers.createFromIndexColorModel(cm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// NOTE: HAM modes falls through, as they are converted to RGB
|
// NOTE: HAM modes falls through, as they are converted to RGB
|
||||||
case 24:
|
case 24:
|
||||||
// 24 bit RGB
|
// 24 bit RGB
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
// 32 bit ARGB
|
// 32 bit ARGB
|
||||||
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
specifier = ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IIOException(String.format("Bit depth not implemented: %d", header.bitplanes));
|
throw new IIOException(String.format("Bit depth not implemented: %d", header.bitplanes));
|
||||||
@ -819,6 +819,9 @@ public class IFFImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
showIt(image, arg);
|
showIt(image, arg);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
System.err.println("Foo!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
System.err.println("Error reading file: " + file);
|
System.err.println("Error reading file: " + file);
|
||||||
|
@ -39,6 +39,7 @@ import com.twelvemonkeys.imageio.metadata.exif.TIFF;
|
|||||||
import com.twelvemonkeys.imageio.metadata.jpeg.JPEG;
|
import com.twelvemonkeys.imageio.metadata.jpeg.JPEG;
|
||||||
import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegment;
|
import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegment;
|
||||||
import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegmentUtil;
|
import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegmentUtil;
|
||||||
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
||||||
import com.twelvemonkeys.lang.Validate;
|
import com.twelvemonkeys.lang.Validate;
|
||||||
import com.twelvemonkeys.xml.XMLSerializer;
|
import com.twelvemonkeys.xml.XMLSerializer;
|
||||||
@ -217,36 +218,36 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
if (types == null || !types.hasNext() || csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK) {
|
if (types == null || !types.hasNext() || csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK) {
|
||||||
ArrayList<ImageTypeSpecifier> typeList = new ArrayList<ImageTypeSpecifier>();
|
ArrayList<ImageTypeSpecifier> typeList = new ArrayList<ImageTypeSpecifier>();
|
||||||
// Add the standard types, we can always convert to these
|
// Add the standard types, we can always convert to these
|
||||||
typeList.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR));
|
typeList.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR));
|
||||||
typeList.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB));
|
typeList.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB));
|
||||||
typeList.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_BGR));
|
typeList.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_BGR));
|
||||||
|
|
||||||
// We also read and return CMYK if the source image is CMYK/YCCK + original color profile if present
|
// We also read and return CMYK if the source image is CMYK/YCCK + original color profile if present
|
||||||
ICC_Profile profile = getEmbeddedICCProfile(false);
|
ICC_Profile profile = getEmbeddedICCProfile(false);
|
||||||
|
|
||||||
if (csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK) {
|
if (csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK) {
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
typeList.add(ImageTypeSpecifier.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
typeList.add(ImageTypeSpecifiers.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
typeList.add(ImageTypeSpecifier.createInterleaved(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
typeList.add(ImageTypeSpecifiers.createInterleaved(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
else if (csType == JPEGColorSpace.YCbCr || csType == JPEGColorSpace.RGB) {
|
else if (csType == JPEGColorSpace.YCbCr || csType == JPEGColorSpace.RGB) {
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
typeList.add(ImageTypeSpecifier.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {0, 1, 2}, DataBuffer.TYPE_BYTE, false, false));
|
typeList.add(ImageTypeSpecifiers.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {0, 1, 2}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (csType == JPEGColorSpace.YCbCrA || csType == JPEGColorSpace.RGBA) {
|
else if (csType == JPEGColorSpace.YCbCrA || csType == JPEGColorSpace.RGBA) {
|
||||||
// Prepend ARGB types
|
// Prepend ARGB types
|
||||||
typeList.addAll(0, Arrays.asList(
|
typeList.addAll(0, Arrays.asList(
|
||||||
ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB),
|
ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB),
|
||||||
ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR),
|
ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR),
|
||||||
ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB_PRE),
|
ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB_PRE),
|
||||||
ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR_PRE)
|
ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR_PRE)
|
||||||
));
|
));
|
||||||
|
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
typeList.add(ImageTypeSpecifier.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, false, false));
|
typeList.add(ImageTypeSpecifiers.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {0, 1, 2, 3}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,10 +275,12 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
ICC_Profile profile = getEmbeddedICCProfile(false);
|
ICC_Profile profile = getEmbeddedICCProfile(false);
|
||||||
|
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
return ImageTypeSpecifier.createInterleaved(ColorSpaces.createColorSpace(profile), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false);
|
return ImageTypeSpecifiers.createInterleaved(ColorSpaces.createColorSpace(profile), new int[]{
|
||||||
|
3, 2, 1, 0
|
||||||
|
}, DataBuffer.TYPE_BYTE, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createInterleaved(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false);
|
return ImageTypeSpecifiers.createInterleaved(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false);
|
||||||
default:
|
default:
|
||||||
// For other types, we probably can't give a proper type, return null
|
// For other types, we probably can't give a proper type, return null
|
||||||
return null;
|
return null;
|
||||||
@ -1070,7 +1073,7 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
super.processWarningOccurred(warning);
|
super.processWarningOccurred(warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void invertCMYK(final Raster raster) {
|
static void invertCMYK(final Raster raster) {
|
||||||
byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
|
byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
|
||||||
|
|
||||||
for (int i = 0, dataLength = data.length; i < dataLength; i++) {
|
for (int i = 0, dataLength = data.length; i < dataLength; i++) {
|
||||||
|
@ -30,7 +30,7 @@ package com.twelvemonkeys.imageio.plugins.pcx;
|
|||||||
|
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.xml.XMLSerializer;
|
import com.twelvemonkeys.xml.XMLSerializer;
|
||||||
|
|
||||||
@ -45,7 +45,10 @@ import javax.imageio.stream.ImageInputStream;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.color.ColorSpace;
|
import java.awt.color.ColorSpace;
|
||||||
import java.awt.image.*;
|
import java.awt.image.*;
|
||||||
import java.io.*;
|
import java.io.DataInput;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -53,7 +56,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public final class PCXImageReader extends ImageReaderBase {
|
public final class PCXImageReader extends ImageReaderBase {
|
||||||
/** 8 bit ImageTypeSpecifer used for reading bitplane images. */
|
/** 8 bit ImageTypeSpecifer used for reading bitplane images. */
|
||||||
private static final ImageTypeSpecifier GRAYSCALE = ImageTypeSpecifier.createGrayscale(8, DataBuffer.TYPE_BYTE, false);
|
private static final ImageTypeSpecifier GRAYSCALE = ImageTypeSpecifiers.createGrayscale(8, DataBuffer.TYPE_BYTE, false);
|
||||||
|
|
||||||
private PCXHeader header;
|
private PCXHeader header;
|
||||||
private boolean readPalette;
|
private boolean readPalette;
|
||||||
@ -111,7 +114,7 @@ public final class PCXImageReader extends ImageReaderBase {
|
|||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 4:
|
case 4:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(header.getEGAPalette());
|
return ImageTypeSpecifiers.createFromIndexColorModel(header.getEGAPalette());
|
||||||
case 8:
|
case 8:
|
||||||
// We may have IndexColorModel here for 1 channel images
|
// We may have IndexColorModel here for 1 channel images
|
||||||
if (channels == 1 && paletteInfo != PCX.PALETTEINFO_GRAY) {
|
if (channels == 1 && paletteInfo != PCX.PALETTEINFO_GRAY) {
|
||||||
@ -120,17 +123,17 @@ public final class PCXImageReader extends ImageReaderBase {
|
|||||||
throw new IIOException("Expected VGA palette not found");
|
throw new IIOException("Expected VGA palette not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(palette);
|
return ImageTypeSpecifiers.createFromIndexColorModel(palette);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PCX has 1 or 3 channels for 8 bit gray or 24 bit RGB, will be validated by ImageTypeSpecifier
|
// PCX has 1 or 3 channels for 8 bit gray or 24 bit RGB, will be validated by ImageTypeSpecifier
|
||||||
return ImageTypeSpecifier.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_BYTE, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_BYTE, false, false);
|
||||||
case 24:
|
case 24:
|
||||||
// Some sources says this is possible...
|
// Some sources says this is possible...
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
case 32:
|
case 32:
|
||||||
// Some sources says this is possible...
|
// Some sources says this is possible...
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
default:
|
default:
|
||||||
throw new IIOException("Unknown number of bytes per pixel: " + header.getBitsPerPixel());
|
throw new IIOException("Unknown number of bytes per pixel: " + header.getBitsPerPixel());
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,7 @@ package com.twelvemonkeys.imageio.plugins.pict;
|
|||||||
|
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.io.enc.Decoder;
|
import com.twelvemonkeys.io.enc.Decoder;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.io.enc.PackBits16Decoder;
|
import com.twelvemonkeys.io.enc.PackBits16Decoder;
|
||||||
@ -2659,7 +2660,7 @@ public class PICTImageReader extends ImageReaderBase {
|
|||||||
public Iterator<ImageTypeSpecifier> getImageTypes(int pIndex) throws IOException {
|
public Iterator<ImageTypeSpecifier> getImageTypes(int pIndex) throws IOException {
|
||||||
// TODO: The images look slightly different in Preview.. Could indicate the color space is wrong...
|
// TODO: The images look slightly different in Preview.. Could indicate the color space is wrong...
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
ImageTypeSpecifier.createPacked(
|
ImageTypeSpecifiers.createPacked(
|
||||||
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
ColorSpace.getInstance(ColorSpace.CS_sRGB),
|
||||||
0xff0000, 0xff00, 0xff, 0xff000000, DataBuffer.TYPE_INT, false
|
0xff0000, 0xff00, 0xff, 0xff000000, DataBuffer.TYPE_INT, false
|
||||||
)
|
)
|
||||||
|
@ -31,6 +31,7 @@ package com.twelvemonkeys.imageio.plugins.pnm;
|
|||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.color.ColorSpaces;
|
import com.twelvemonkeys.imageio.color.ColorSpaces;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
|
|
||||||
import javax.imageio.IIOException;
|
import javax.imageio.IIOException;
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
@ -116,29 +117,29 @@ public final class PNMImageReader extends ImageReaderBase {
|
|||||||
ColorSpace gray = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
ColorSpace gray = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||||
|
|
||||||
if (header.getTransferType() == DataBuffer.TYPE_FLOAT) {
|
if (header.getTransferType() == DataBuffer.TYPE_FLOAT) {
|
||||||
return ImageTypeSpecifier.createInterleaved(gray, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
return ImageTypeSpecifiers.createInterleaved(gray, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
||||||
}
|
}
|
||||||
if (header.getMaxSample() <= PNM.MAX_VAL_16BIT) {
|
if (header.getMaxSample() <= PNM.MAX_VAL_16BIT) {
|
||||||
return hasAlpha ? ImageTypeSpecifier.createGrayscale(bitsPerSample, transferType, false, false)
|
return hasAlpha ? ImageTypeSpecifiers.createGrayscale(bitsPerSample, transferType, false, false)
|
||||||
: ImageTypeSpecifier.createGrayscale(bitsPerSample, transferType, false);
|
: ImageTypeSpecifiers.createGrayscale(bitsPerSample, transferType, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createInterleaved(gray, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
return ImageTypeSpecifiers.createInterleaved(gray, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
||||||
|
|
||||||
case RGB:
|
case RGB:
|
||||||
case RGB_ALPHA:
|
case RGB_ALPHA:
|
||||||
// Using sRGB seems sufficient for PPM, as it is very close to ITU-R Recommendation BT.709 (same gamut and white point CIE D65)
|
// Using sRGB seems sufficient for PPM, as it is very close to ITU-R Recommendation BT.709 (same gamut and white point CIE D65)
|
||||||
ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||||
if (header.getTransferType() == DataBuffer.TYPE_FLOAT) {
|
if (header.getTransferType() == DataBuffer.TYPE_FLOAT) {
|
||||||
return ImageTypeSpecifier.createInterleaved(sRGB, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
return ImageTypeSpecifiers.createInterleaved(sRGB, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createInterleaved(sRGB, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
return ImageTypeSpecifiers.createInterleaved(sRGB, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
||||||
|
|
||||||
case CMYK:
|
case CMYK:
|
||||||
case CMYK_ALPHA:
|
case CMYK_ALPHA:
|
||||||
ColorSpace cmyk = ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK);
|
ColorSpace cmyk = ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK);
|
||||||
return ImageTypeSpecifier.createInterleaved(cmyk, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
return ImageTypeSpecifiers.createInterleaved(cmyk, createBandOffsets(samplesPerPixel), transferType, hasAlpha, false);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// TODO: Allow reading unknown tuple types as Raster!
|
// TODO: Allow reading unknown tuple types as Raster!
|
||||||
|
@ -31,7 +31,7 @@ package com.twelvemonkeys.imageio.plugins.psd;
|
|||||||
import com.twelvemonkeys.image.ImageUtil;
|
import com.twelvemonkeys.image.ImageUtil;
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.color.ColorSpaces;
|
import com.twelvemonkeys.imageio.color.ColorSpaces;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
|
|
||||||
import javax.imageio.IIOException;
|
import javax.imageio.IIOException;
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
@ -145,14 +145,14 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
switch (header.mode) {
|
switch (header.mode) {
|
||||||
case PSD.COLOR_MODE_BITMAP:
|
case PSD.COLOR_MODE_BITMAP:
|
||||||
if (header.channels == 1 && header.bits == 1) {
|
if (header.channels == 1 && header.bits == 1) {
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_BINARY);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_BYTE_BINARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IIOException(String.format("Unsupported channel count/bit depth for Monochrome PSD: %d channels/%d bits", header.channels, header.bits));
|
throw new IIOException(String.format("Unsupported channel count/bit depth for Monochrome PSD: %d channels/%d bits", header.channels, header.bits));
|
||||||
|
|
||||||
case PSD.COLOR_MODE_INDEXED:
|
case PSD.COLOR_MODE_INDEXED:
|
||||||
if (header.channels == 1 && header.bits == 8) {
|
if (header.channels == 1 && header.bits == 8) {
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(metadata.colorData.getIndexColorModel());
|
return ImageTypeSpecifiers.createFromIndexColorModel(metadata.colorData.getIndexColorModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IIOException(String.format("Unsupported channel count/bit depth for Indexed Color PSD: %d channels/%d bits", header.channels, header.bits));
|
throw new IIOException(String.format("Unsupported channel count/bit depth for Indexed Color PSD: %d channels/%d bits", header.channels, header.bits));
|
||||||
@ -167,22 +167,22 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (header.channels == 1 && header.bits == 8) {
|
if (header.channels == 1 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY);
|
||||||
}
|
}
|
||||||
else if (header.channels == 2 && header.bits == 8) {
|
else if (header.channels == 2 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 1 && header.bits == 16) {
|
else if (header.channels == 1 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_USHORT_GRAY);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_GRAY);
|
||||||
}
|
}
|
||||||
else if (header.channels == 2 && header.bits == 16) {
|
else if (header.channels == 2 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 1 && header.bits == 32) {
|
else if (header.channels == 1 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0}, new int[] {0}, DataBuffer.TYPE_INT, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0}, new int[] {0}, DataBuffer.TYPE_INT, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 2 && header.bits == 32) {
|
else if (header.channels == 2 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_INT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1}, new int[] {0, 0}, DataBuffer.TYPE_INT, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IIOException(String.format("Unsupported channel count/bit depth for Gray Scale PSD: %d channels/%d bits", header.channels, header.bits));
|
throw new IIOException(String.format("Unsupported channel count/bit depth for Gray Scale PSD: %d channels/%d bits", header.channels, header.bits));
|
||||||
@ -194,22 +194,22 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (header.channels == 3 && header.bits == 8) {
|
if (header.channels == 3 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels >= 4 && header.bits == 8) {
|
else if (header.channels >= 4 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 3 && header.bits == 16) {
|
else if (header.channels == 3 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels >= 4 && header.bits == 16) {
|
else if (header.channels >= 4 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 3 && header.bits == 32) {
|
else if (header.channels == 3 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_INT, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_INT, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels >= 4 && header.bits == 32) {
|
else if (header.channels >= 4 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IIOException(String.format("Unsupported channel count/bit depth for RGB PSD: %d channels/%d bits", header.channels, header.bits));
|
throw new IIOException(String.format("Unsupported channel count/bit depth for RGB PSD: %d channels/%d bits", header.channels, header.bits));
|
||||||
@ -221,22 +221,22 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (header.channels == 4 && header.bits == 8) {
|
if (header.channels == 4 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 5 && header.bits == 8) {
|
else if (header.channels == 5 && header.bits == 8) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 4 && header.bits == 16) {
|
else if (header.channels == 4 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 5 && header.bits == 16) {
|
else if (header.channels == 5 && header.bits == 16) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 4 && header.bits == 32) {
|
else if (header.channels == 4 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_INT, false, false);
|
||||||
}
|
}
|
||||||
else if (header.channels == 5 && header.bits == 32) {
|
else if (header.channels == 5 && header.bits == 32) {
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_INT, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IIOException(String.format("Unsupported channel count/bit depth for CMYK PSD: %d channels/%d bits", header.channels, header.bits));
|
throw new IIOException(String.format("Unsupported channel count/bit depth for CMYK PSD: %d channels/%d bits", header.channels, header.bits));
|
||||||
@ -269,11 +269,11 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
// TODO: ColorConvertOp to CS_sRGB
|
// TODO: ColorConvertOp to CS_sRGB
|
||||||
// TODO: Integer raster
|
// TODO: Integer raster
|
||||||
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_RGB));
|
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_RGB));
|
||||||
types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR));
|
types.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR));
|
||||||
|
|
||||||
if (!cs.isCS_sRGB()) {
|
if (!cs.isCS_sRGB()) {
|
||||||
// Basically BufferedImage.TYPE_3BYTE_BGR, with corrected ColorSpace. Possibly slow.
|
// Basically BufferedImage.TYPE_3BYTE_BGR, with corrected ColorSpace. Possibly slow.
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// else if (header.channels >= 4 && header.bits == 8) {
|
// else if (header.channels >= 4 && header.bits == 8) {
|
||||||
@ -281,20 +281,20 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
// TODO: ColorConvertOp to CS_sRGB
|
// TODO: ColorConvertOp to CS_sRGB
|
||||||
// TODO: Integer raster
|
// TODO: Integer raster
|
||||||
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_ARGB));
|
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_ARGB));
|
||||||
types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR));
|
types.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR));
|
||||||
//
|
//
|
||||||
if (!cs.isCS_sRGB()) {
|
if (!cs.isCS_sRGB()) {
|
||||||
// Basically BufferedImage.TYPE_4BYTE_ABGR, with corrected ColorSpace. Possibly slow.
|
// Basically BufferedImage.TYPE_4BYTE_ABGR, with corrected ColorSpace. Possibly slow.
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// else if (header.channels == 3 && header.bits == 16) {
|
// else if (header.channels == 3 && header.bits == 16) {
|
||||||
else if (rawType.getNumBands() == 3 && rawType.getBitsPerBand(0) == 16) {
|
else if (rawType.getNumBands() == 3 && rawType.getBitsPerBand(0) == 16) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
|
||||||
}
|
}
|
||||||
// else if (header.channels >= 4 && header.bits == 16) {
|
// else if (header.channels >= 4 && header.bits == 16) {
|
||||||
else if (rawType.getNumBands() >= 4 && rawType.getBitsPerBand(0) == 16) {
|
else if (rawType.getNumBands() >= 4 && rawType.getBitsPerBand(0) == 16) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PSD.COLOR_MODE_CMYK:
|
case PSD.COLOR_MODE_CMYK:
|
||||||
@ -306,19 +306,19 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
// Doing this, will require rewriting the image reading, as the raw image data is channelled, not interleaved :-/
|
// Doing this, will require rewriting the image reading, as the raw image data is channelled, not interleaved :-/
|
||||||
// if (header.channels == 4 && header.bits == 8) {
|
// if (header.channels == 4 && header.bits == 8) {
|
||||||
if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 8) {
|
if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 8) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
|
||||||
}
|
}
|
||||||
// else if (header.channels == 5 && header.bits == 8) {
|
// else if (header.channels == 5 && header.bits == 8) {
|
||||||
else if (rawType.getNumBands() == 5 && rawType.getBitsPerBand(0) == 8) {
|
else if (rawType.getNumBands() == 5 && rawType.getBitsPerBand(0) == 8) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
|
||||||
}
|
}
|
||||||
// else if (header.channels == 4 && header.bits == 16) {
|
// else if (header.channels == 4 && header.bits == 16) {
|
||||||
else if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 16) {
|
else if (rawType.getNumBands() == 4 && rawType.getBitsPerBand(0) == 16) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[]{3, 2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[]{3, 2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
|
||||||
}
|
}
|
||||||
// else if (header.channels == 5 && header.bits == 16) {
|
// else if (header.channels == 5 && header.bits == 16) {
|
||||||
else if (rawType.getNumBands() == 5 && rawType.getBitsPerBand(0) == 16) {
|
else if (rawType.getNumBands() == 5 && rawType.getBitsPerBand(0) == 16) {
|
||||||
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
|
types.add(ImageTypeSpecifiers.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1134,7 +1134,7 @@ public final class PSDImageReader extends ImageReaderBase {
|
|||||||
offs[i] = 0;
|
offs[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createBanded(compositeType.getColorModel().getColorSpace(), indices, offs, compositeType.getSampleModel().getDataType(), true, false);
|
return ImageTypeSpecifiers.createBanded(compositeType.getColorModel().getColorSpace(), indices, offs, compositeType.getSampleModel().getDataType(), true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ package com.twelvemonkeys.imageio.plugins.sgi;
|
|||||||
|
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.xml.XMLSerializer;
|
import com.twelvemonkeys.xml.XMLSerializer;
|
||||||
|
|
||||||
@ -107,9 +108,9 @@ public final class SGIImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
switch (header.getBytesPerPixel()) {
|
switch (header.getBytesPerPixel()) {
|
||||||
case 1:
|
case 1:
|
||||||
return ImageTypeSpecifier.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_BYTE, channels == 2 || channels == 4, false);
|
return ImageTypeSpecifiers.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_BYTE, channels == 2 || channels == 4, false);
|
||||||
case 2:
|
case 2:
|
||||||
return ImageTypeSpecifier.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_USHORT, channels == 2 || channels == 4, false);
|
return ImageTypeSpecifiers.createBanded(cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_USHORT, channels == 2 || channels == 4, false);
|
||||||
default:
|
default:
|
||||||
throw new IIOException("Unknown number of bytes per pixel: " + header.getBytesPerPixel());
|
throw new IIOException("Unknown number of bytes per pixel: " + header.getBytesPerPixel());
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ package com.twelvemonkeys.imageio.plugins.tga;
|
|||||||
|
|
||||||
import com.twelvemonkeys.imageio.ImageReaderBase;
|
import com.twelvemonkeys.imageio.ImageReaderBase;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
||||||
import com.twelvemonkeys.io.enc.DecoderStream;
|
import com.twelvemonkeys.io.enc.DecoderStream;
|
||||||
import com.twelvemonkeys.xml.XMLSerializer;
|
import com.twelvemonkeys.xml.XMLSerializer;
|
||||||
@ -107,22 +107,22 @@ public final class TGAImageReader extends ImageReaderBase {
|
|||||||
case TGA.IMAGETYPE_COLORMAPPED_RLE:
|
case TGA.IMAGETYPE_COLORMAPPED_RLE:
|
||||||
case TGA.IMAGETYPE_COLORMAPPED_HUFFMAN:
|
case TGA.IMAGETYPE_COLORMAPPED_HUFFMAN:
|
||||||
case TGA.IMAGETYPE_COLORMAPPED_HUFFMAN_QUADTREE:
|
case TGA.IMAGETYPE_COLORMAPPED_HUFFMAN_QUADTREE:
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(header.getColorMap());
|
return ImageTypeSpecifiers.createFromIndexColorModel(header.getColorMap());
|
||||||
case TGA.IMAGETYPE_MONOCHROME:
|
case TGA.IMAGETYPE_MONOCHROME:
|
||||||
case TGA.IMAGETYPE_MONOCHROME_RLE:
|
case TGA.IMAGETYPE_MONOCHROME_RLE:
|
||||||
return ImageTypeSpecifier.createGrayscale(1, DataBuffer.TYPE_BYTE, false);
|
return ImageTypeSpecifiers.createGrayscale(1, DataBuffer.TYPE_BYTE, false);
|
||||||
case TGA.IMAGETYPE_TRUECOLOR:
|
case TGA.IMAGETYPE_TRUECOLOR:
|
||||||
case TGA.IMAGETYPE_TRUECOLOR_RLE:
|
case TGA.IMAGETYPE_TRUECOLOR_RLE:
|
||||||
ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||||
|
|
||||||
switch (header.getPixelDepth()) {
|
switch (header.getPixelDepth()) {
|
||||||
case 16:
|
case 16:
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_555_RGB);
|
||||||
case 24:
|
case 24:
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
case 32:
|
case 32:
|
||||||
// 4BYTE_BGRA...
|
// 4BYTE_BGRA...
|
||||||
return ImageTypeSpecifier.createInterleaved(sRGB, new int[] {2, 1, 0, 3}, DataBuffer.TYPE_BYTE, true, false);
|
return ImageTypeSpecifiers.createInterleaved(sRGB, new int[] {2, 1, 0, 3}, DataBuffer.TYPE_BYTE, true, false);
|
||||||
default:
|
default:
|
||||||
throw new IIOException("Unknown pixel depth for truecolor: " + header.getPixelDepth());
|
throw new IIOException("Unknown pixel depth for truecolor: " + header.getPixelDepth());
|
||||||
}
|
}
|
||||||
@ -162,7 +162,7 @@ public final class TGAImageReader extends ImageReaderBase {
|
|||||||
int imageType = header.getImageType();
|
int imageType = header.getImageType();
|
||||||
|
|
||||||
// Wrap input if RLE encoded.
|
// Wrap input if RLE encoded.
|
||||||
// NOTE: As early sepcs said it was ok to compress across boundaries, we need to support that.
|
// NOTE: As early specs said it was ok to compress across boundaries, we need to support that.
|
||||||
DataInput input;
|
DataInput input;
|
||||||
if (imageType == TGA.IMAGETYPE_COLORMAPPED_RLE || imageType == TGA.IMAGETYPE_TRUECOLOR_RLE || imageType == TGA.IMAGETYPE_MONOCHROME_RLE) {
|
if (imageType == TGA.IMAGETYPE_COLORMAPPED_RLE || imageType == TGA.IMAGETYPE_TRUECOLOR_RLE || imageType == TGA.IMAGETYPE_MONOCHROME_RLE) {
|
||||||
input = new LittleEndianDataInputStream(new DecoderStream(IIOUtil.createStreamAdapter(imageInput), new RLEDecoder(header.getPixelDepth())));
|
input = new LittleEndianDataInputStream(new DecoderStream(IIOUtil.createStreamAdapter(imageInput), new RLEDecoder(header.getPixelDepth())));
|
||||||
|
@ -41,7 +41,7 @@ import com.twelvemonkeys.imageio.metadata.jpeg.JPEG;
|
|||||||
import com.twelvemonkeys.imageio.stream.ByteArrayImageInputStream;
|
import com.twelvemonkeys.imageio.stream.ByteArrayImageInputStream;
|
||||||
import com.twelvemonkeys.imageio.stream.SubImageInputStream;
|
import com.twelvemonkeys.imageio.stream.SubImageInputStream;
|
||||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||||
import com.twelvemonkeys.imageio.util.IndexedImageTypeSpecifier;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
import com.twelvemonkeys.imageio.util.ProgressListenerBase;
|
||||||
import com.twelvemonkeys.io.FastByteArrayOutputStream;
|
import com.twelvemonkeys.io.FastByteArrayOutputStream;
|
||||||
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
import com.twelvemonkeys.io.LittleEndianDataInputStream;
|
||||||
@ -121,7 +121,7 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
// http://download.java.net/media/jai-imageio/javadoc/1.1/com/sun/media/imageio/plugins/tiff/package-summary.html#ImageMetadata
|
// http://download.java.net/media/jai-imageio/javadoc/1.1/com/sun/media/imageio/plugins/tiff/package-summary.html#ImageMetadata
|
||||||
|
|
||||||
// TODOs Extension support
|
// TODOs Extension support
|
||||||
// TODO: Support PlanarConfiguration 2
|
// TODO: Support PlanarConfiguration 2, look at PCXImageReader
|
||||||
// TODO: Auto-rotate based on Orientation
|
// TODO: Auto-rotate based on Orientation
|
||||||
// TODO: Support ICCProfile (fully)
|
// TODO: Support ICCProfile (fully)
|
||||||
// TODO: Support Compression 3 & 4 (CCITT T.4 & T.6)
|
// TODO: Support Compression 3 & 4 (CCITT T.4 & T.6)
|
||||||
@ -266,10 +266,10 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
cs = profile == null ? ColorSpace.getInstance(ColorSpace.CS_GRAY) : ColorSpaces.createColorSpace(profile);
|
cs = profile == null ? ColorSpace.getInstance(ColorSpace.CS_GRAY) : ColorSpaces.createColorSpace(profile);
|
||||||
|
|
||||||
if (cs == ColorSpace.getInstance(ColorSpace.CS_GRAY) && (bitsPerSample == 1 || bitsPerSample == 2 || bitsPerSample == 4 || bitsPerSample == 8 || bitsPerSample == 16)) {
|
if (cs == ColorSpace.getInstance(ColorSpace.CS_GRAY) && (bitsPerSample == 1 || bitsPerSample == 2 || bitsPerSample == 4 || bitsPerSample == 8 || bitsPerSample == 16)) {
|
||||||
return ImageTypeSpecifier.createGrayscale(bitsPerSample, dataType, false);
|
return ImageTypeSpecifiers.createGrayscale(bitsPerSample, dataType, false);
|
||||||
}
|
}
|
||||||
else if (bitsPerSample == 1 || bitsPerSample == 2 || bitsPerSample == 4 || bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32) {
|
else if (bitsPerSample == 1 || bitsPerSample == 2 || bitsPerSample == 4 || bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32) {
|
||||||
return ImageTypeSpecifier.createInterleaved(cs, new int[] {0}, dataType, false, false);
|
return ImageTypeSpecifiers.createInterleaved(cs, new int[] {0}, dataType, false, false);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
// TODO: If ExtraSamples is used, PlanarConfiguration must be taken into account also for gray data
|
// TODO: If ExtraSamples is used, PlanarConfiguration must be taken into account also for gray data
|
||||||
@ -291,34 +291,34 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
switch (samplesPerPixel) {
|
switch (samplesPerPixel) {
|
||||||
case 3:
|
case 3:
|
||||||
if (bitsPerSample == 8 || bitsPerSample == 16) {
|
if (bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32) {
|
||||||
switch (planarConfiguration) {
|
switch (planarConfiguration) {
|
||||||
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
||||||
if (bitsPerSample == 8 && cs.isCS_sRGB()) {
|
if (bitsPerSample == 8 && cs.isCS_sRGB()) {
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createInterleaved(cs, new int[] {0, 1, 2}, dataType, false, false);
|
return ImageTypeSpecifiers.createInterleaved(cs, new int[] {0, 1, 2}, dataType, false, false);
|
||||||
|
|
||||||
case TIFFExtension.PLANARCONFIG_PLANAR:
|
case TIFFExtension.PLANARCONFIG_PLANAR:
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, dataType, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, dataType, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
if (bitsPerSample == 8 || bitsPerSample == 16) {
|
if (bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32) {
|
||||||
// ExtraSamples 0=unspecified, 1=associated (pre-multiplied), 2=unassociated (TODO: Support unspecified, not alpha)
|
// ExtraSamples 0=unspecified, 1=associated (pre-multiplied), 2=unassociated (TODO: Support unspecified, not alpha)
|
||||||
long[] extraSamples = getValueAsLongArray(TIFF.TAG_EXTRA_SAMPLES, "ExtraSamples", true);
|
long[] extraSamples = getValueAsLongArray(TIFF.TAG_EXTRA_SAMPLES, "ExtraSamples", true);
|
||||||
|
|
||||||
switch (planarConfiguration) {
|
switch (planarConfiguration) {
|
||||||
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
||||||
if (bitsPerSample == 8 && cs.isCS_sRGB()) {
|
if (bitsPerSample == 8 && cs.isCS_sRGB()) {
|
||||||
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageTypeSpecifier.createInterleaved(cs, new int[] {0, 1, 2, 3}, dataType, true, extraSamples[0] == 1);
|
return ImageTypeSpecifiers.createInterleaved(cs, new int[]{ 0, 1, 2, 3}, dataType, true, extraSamples[0] == 1);
|
||||||
|
|
||||||
case TIFFExtension.PLANARCONFIG_PLANAR:
|
case TIFFExtension.PLANARCONFIG_PLANAR:
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, dataType, true, extraSamples[0] == 1);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, dataType, true, extraSamples[0] == 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: More samples might be ok, if multiple alpha or unknown samples
|
// TODO: More samples might be ok, if multiple alpha or unknown samples
|
||||||
@ -342,7 +342,7 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
IndexColorModel icm = createIndexColorModel(bitsPerSample, dataType, (int[]) colorMap.getValue());
|
IndexColorModel icm = createIndexColorModel(bitsPerSample, dataType, (int[]) colorMap.getValue());
|
||||||
|
|
||||||
return IndexedImageTypeSpecifier.createFromIndexColorModel(icm);
|
return ImageTypeSpecifiers.createFromIndexColorModel(icm);
|
||||||
|
|
||||||
case TIFFExtension.PHOTOMETRIC_SEPARATED:
|
case TIFFExtension.PHOTOMETRIC_SEPARATED:
|
||||||
// Separated (CMYK etc)
|
// Separated (CMYK etc)
|
||||||
@ -369,9 +369,9 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
if (bitsPerSample == 8 || bitsPerSample == 16) {
|
if (bitsPerSample == 8 || bitsPerSample == 16) {
|
||||||
switch (planarConfiguration) {
|
switch (planarConfiguration) {
|
||||||
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
||||||
return ImageTypeSpecifier.createInterleaved(cs, new int[] {0, 1, 2, 3}, dataType, false, false);
|
return ImageTypeSpecifiers.createInterleaved(cs, new int[] {0, 1, 2, 3}, dataType, false, false);
|
||||||
case TIFFExtension.PLANARCONFIG_PLANAR:
|
case TIFFExtension.PLANARCONFIG_PLANAR:
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, dataType, false, false);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, dataType, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 5:
|
case 5:
|
||||||
@ -381,9 +381,9 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
switch (planarConfiguration) {
|
switch (planarConfiguration) {
|
||||||
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
case TIFFBaseline.PLANARCONFIG_CHUNKY:
|
||||||
return ImageTypeSpecifier.createInterleaved(cs, new int[] {0, 1, 2, 3, 4}, dataType, true, extraSamples[0] == 1);
|
return ImageTypeSpecifiers.createInterleaved(cs, new int[] {0, 1, 2, 3, 4}, dataType, true, extraSamples[0] == 1);
|
||||||
case TIFFExtension.PLANARCONFIG_PLANAR:
|
case TIFFExtension.PLANARCONFIG_PLANAR:
|
||||||
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, dataType, true, extraSamples[0] == 1);
|
return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, dataType, true, extraSamples[0] == 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1443,7 +1443,7 @@ public class TIFFImageReader extends ImageReaderBase {
|
|||||||
new XMLSerializer(System.out, "UTF-8").serialize(metadata.getAsTree(metadata.getNativeMetadataFormatName()), false);
|
new XMLSerializer(System.out, "UTF-8").serialize(metadata.getAsTree(metadata.getNativeMetadataFormatName()), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// System.err.println("image: " + image);
|
System.err.println("image: " + image);
|
||||||
|
|
||||||
// File tempFile = File.createTempFile("lzw-", ".bin");
|
// File tempFile = File.createTempFile("lzw-", ".bin");
|
||||||
// byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
|
// byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user