#341 Work-around for OpenJDK JPEG read issue

This commit is contained in:
Harald Kuhr 2017-04-26 15:17:39 +02:00
parent acf7c5f007
commit 2eecdbb216

View File

@ -379,6 +379,7 @@ public final class JPEGImageReader extends ImageReaderBase {
sourceCSType == JPEGColorSpace.CMYK || sourceCSType == JPEGColorSpace.CMYK ||
sourceCSType == JPEGColorSpace.YCCK || sourceCSType == JPEGColorSpace.YCCK ||
profile != null && !ColorSpaces.isCS_sRGB(profile) || profile != null && !ColorSpaces.isCS_sRGB(profile) ||
!delegate.getImageTypes(imageIndex).hasNext() ||
sourceCSType == JPEGColorSpace.YCbCr && getRawImageType(imageIndex) != null)) { // TODO: Issue warning? sourceCSType == JPEGColorSpace.YCbCr && getRawImageType(imageIndex) != null)) { // TODO: Issue warning?
if (DEBUG) { if (DEBUG) {
System.out.println("Reading using raster and extra conversion"); System.out.println("Reading using raster and extra conversion");
@ -499,8 +500,11 @@ public final class JPEGImageReader extends ImageReaderBase {
Raster raster = delegate.readRaster(imageIndex, param); // non-converted Raster raster = delegate.readRaster(imageIndex, param); // non-converted
// Apply source color conversion from implicit color space // Apply source color conversion from implicit color space
if (csType == JPEGColorSpace.YCbCr || csType == JPEGColorSpace.YCbCrA) { if (csType == JPEGColorSpace.YCbCr) {
convertYCbCr2RGB(raster); convertYCbCr2RGB(raster, 3);
}
else if (csType == JPEGColorSpace.YCbCrA) {
convertYCbCr2RGB(raster, 4);
} }
else if (csType == JPEGColorSpace.YCCK) { else if (csType == JPEGColorSpace.YCCK) {
// TODO: Need to rethink this (non-) inversion, see #147 // TODO: Need to rethink this (non-) inversion, see #147
@ -1124,7 +1128,7 @@ public final class JPEGImageReader extends ImageReaderBase {
super.processWarningOccurred(warning); super.processWarningOccurred(warning);
} }
static void invertCMYK(final Raster raster) { private 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++) {
@ -1132,19 +1136,19 @@ public final class JPEGImageReader extends ImageReaderBase {
} }
} }
public static void convertYCbCr2RGB(final Raster raster) { private static void convertYCbCr2RGB(final Raster raster, final int numComponents) {
final int height = raster.getHeight(); final int height = raster.getHeight();
final int width = raster.getWidth(); final int width = raster.getWidth();
final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData(); final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
YCbCrConverter.convertYCbCr2RGB(data, data, (x + y * width) * 3); YCbCrConverter.convertYCbCr2RGB(data, data, (x + y * width) * numComponents);
} }
} }
} }
public static void convertYCCK2CMYK(final Raster raster) { private static void convertYCCK2CMYK(final Raster raster) {
final int height = raster.getHeight(); final int height = raster.getHeight();
final int width = raster.getWidth(); final int width = raster.getWidth();
final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData(); final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
@ -1293,10 +1297,10 @@ public final class JPEGImageReader extends ImageReaderBase {
try { try {
if (region.length >= 4) { if (region.length >= 4) {
roi = new Rectangle(Integer.parseInt(region[0]), Integer.parseInt(region[2]), Integer.parseInt(region[2]), Integer.parseInt(region[3])); roi = new Rectangle(Integer.parseInt(region[0]), Integer.parseInt(region[1]), Integer.parseInt(region[2]), Integer.parseInt(region[3]));
} }
else { else {
roi = new Rectangle(Integer.parseInt(region[0]), Integer.parseInt(region[2])); roi = new Rectangle(Integer.parseInt(region[0]), Integer.parseInt(region[1]));
} }
} }
catch (IndexOutOfBoundsException | NumberFormatException e) { catch (IndexOutOfBoundsException | NumberFormatException e) {
@ -1389,7 +1393,8 @@ public final class JPEGImageReader extends ImageReaderBase {
param.setSourceSubsampling(subX, subY, xOff, yOff); param.setSourceSubsampling(subX, subY, xOff, yOff);
param.setSourceRegion(roi); param.setSourceRegion(roi);
image = reader.getImageTypes(0).next().createBufferedImage((reader.getWidth(0) + subX - 1)/ subX, (reader.getHeight(0) + subY - 1) / subY); // image = reader.getImageTypes(0).next().createBufferedImage((reader.getWidth(0) + subX - 1)/ subX, (reader.getHeight(0) + subY - 1) / subY);
image = null;
} }
else { else {
// image = reader.getImageTypes(0).next().createBufferedImage(reader.getWidth(0), reader.getHeight(0)); // image = reader.getImageTypes(0).next().createBufferedImage(reader.getWidth(0), reader.getHeight(0));