From 037e0d5473eb6aaa9ba6f23ef4b530ac8e533e5f Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Fri, 10 Apr 2015 11:23:38 +0200 Subject: [PATCH] Clean up. --- .../imageio/plugins/jpeg/JPEGImageReader.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java index 1c2a82c7..04fd210e 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java @@ -112,7 +112,7 @@ public class JPEGImageReader extends ImageReaderBase { private static final Map> SEGMENT_IDENTIFIERS = createSegmentIds(); private static Map> createSegmentIds() { - Map> map = new LinkedHashMap>(); + Map> map = new LinkedHashMap<>(); // Need all APP markers to be able to re-generate proper metadata later for (int appMarker = JPEG.APP0; appMarker <= JPEG.APP15; appMarker++) { @@ -224,7 +224,7 @@ public class JPEGImageReader extends ImageReaderBase { JPEGColorSpace csType = getSourceCSType(getJFIF(), getAdobeDCT(), getSOF()); if (types == null || !types.hasNext() || csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK) { - ArrayList typeList = new ArrayList(); + ArrayList typeList = new ArrayList<>(); // Add the standard types, we can always convert to these typeList.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR)); typeList.add(ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB)); @@ -371,6 +371,10 @@ public class JPEGImageReader extends ImageReaderBase { int origHeight = getHeight(imageIndex); Iterator imageTypes = getImageTypes(imageIndex); + // TODO: Avoid creating destination here, if possible (as it saves time and memory) + // If YCbCr or RGB, we could instead create a BufferedImage around the converted raster directly. + // If YCCK or CMYK, we could instead create a BufferedImage around the converted raster, + // leaving the fourth band as alpha (or pretend it's not there, by creating a child raster). BufferedImage image = getDestination(param, imageTypes, origWidth, origHeight); WritableRaster destination = image.getRaster(); @@ -466,6 +470,11 @@ public class JPEGImageReader extends ImageReaderBase { } else if (csType == JPEGColorSpace.YCCK) { YCbCrConverter.convertYCCK2CMYK(raster); + // flag0 bit 15, blend = 1 see http://graphicdesign.stackexchange.com/questions/12894/cmyk-jpegs-extracted-from-pdf-appear-inverted + if ((getAdobeDCT().flags0 & 0x8000) != 0) { + /// TODO: Better yet would be to not inverting in the first place, add flag to convertYCCK2CMYK + invertCMYK(raster); + } } else if (csType == JPEGColorSpace.CMYK) { invertCMYK(raster); @@ -670,16 +679,11 @@ public class JPEGImageReader extends ImageReaderBase { segments = JPEGSegmentUtil.readSegments(imageInput, SEGMENT_IDENTIFIERS); } - catch (IIOException ignore) { + catch (IIOException | IllegalArgumentException ignore) { if (DEBUG) { ignore.printStackTrace(); } } - catch (IllegalArgumentException foo) { - if (DEBUG) { - foo.printStackTrace(); - } - } finally { imageInput.reset(); } @@ -699,7 +703,7 @@ public class JPEGImageReader extends ImageReaderBase { if ((marker == ALL_APP_MARKERS && segment.marker() >= JPEG.APP0 && segment.marker() <= JPEG.APP15 || segment.marker() == marker) && (identifier == null || identifier.equals(segment.identifier()))) { if (appSegments == Collections.EMPTY_LIST) { - appSegments = new ArrayList(segments.size()); + appSegments = new ArrayList<>(segments.size()); } appSegments.add(segment); @@ -949,7 +953,7 @@ public class JPEGImageReader extends ImageReaderBase { checkBounds(imageIndex); if (thumbnails == null) { - thumbnails = new ArrayList(); + thumbnails = new ArrayList<>(); ThumbnailReadProgressListener thumbnailProgressDelegator = new ThumbnailProgressDelegate(); // Read JFIF thumbnails if present @@ -1408,10 +1412,16 @@ public class JPEGImageReader extends ImageReaderBase { try { IIOMetadata imageMetadata = reader.getImageMetadata(0); System.out.println("Metadata for File: " + file.getName()); - System.out.println("Native:"); - new XMLSerializer(System.out, System.getProperty("file.encoding")).serialize(imageMetadata.getAsTree(imageMetadata.getNativeMetadataFormatName()), false); - System.out.println("Standard:"); - new XMLSerializer(System.out, System.getProperty("file.encoding")).serialize(imageMetadata.getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName), false); + + if (imageMetadata.getNativeMetadataFormatName() != null) { + System.out.println("Native:"); + new XMLSerializer(System.out, System.getProperty("file.encoding")).serialize(imageMetadata.getAsTree(imageMetadata.getNativeMetadataFormatName()), false); + } + if (imageMetadata.isStandardMetadataFormatSupported()) { + System.out.println("Standard:"); + new XMLSerializer(System.out, System.getProperty("file.encoding")).serialize(imageMetadata.getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName), false); + } + System.out.println(); int numThumbnails = reader.getNumThumbnails(0);