diff --git a/imageio/imageio-clippath/src/main/java/com/twelvemonkeys/imageio/path/Paths.java b/imageio/imageio-clippath/src/main/java/com/twelvemonkeys/imageio/path/Paths.java index 335deba2..7ab5f441 100644 --- a/imageio/imageio-clippath/src/main/java/com/twelvemonkeys/imageio/path/Paths.java +++ b/imageio/imageio-clippath/src/main/java/com/twelvemonkeys/imageio/path/Paths.java @@ -50,13 +50,13 @@ import java.awt.geom.Path2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static com.twelvemonkeys.lang.Validate.isTrue; import static com.twelvemonkeys.lang.Validate.notNull; +import static java.util.Collections.singletonList; /** * Support for various Adobe Photoshop Path related operations: @@ -96,7 +96,7 @@ public final class Paths { int magic = readMagic(stream); if (magic == PSD.RESOURCE_TYPE) { - // This is a PSD Image Resource BLock, we can parse directly + // This is a PSD Image Resource Block, we can parse directly return buildPathFromPhotoshopResources(stream); } else if (magic == PSD.SIGNATURE_8BPS) { @@ -117,8 +117,8 @@ public final class Paths { } else if (magic >>> 16 == JPEG.SOI && (magic & 0xff00) == 0xff00) { // JPEG version - Map> segmentIdentifiers = new LinkedHashMap>(); - segmentIdentifiers.put(JPEG.APP13, Arrays.asList("Photoshop 3.0")); + Map> segmentIdentifiers = new LinkedHashMap<>(); + segmentIdentifiers.put(JPEG.APP13, singletonList("Photoshop 3.0")); List photoshop = JPEGSegmentUtil.readSegments(stream, segmentIdentifiers); @@ -262,7 +262,7 @@ public final class Paths { Desktop.getDesktop().open(tempFile); - Thread.sleep(3000l); + Thread.sleep(3000L); if (!tempFile.delete()) { System.err.printf("%s not deleted\n", tempFile); diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSD.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSD.java index ea1b3d0b..3a582a6a 100755 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSD.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSD.java @@ -42,6 +42,13 @@ public interface PSD { /** PSD image resource marker "8BIM". */ int RESOURCE_TYPE = ('8' << 24) + ('B' << 16) + ('I' << 8) + 'M'; + // http://fileformats.archiveteam.org/wiki/Photoshop_Image_Resources + // However, ExifTool says ImageReady is PHUT and PhotoDeluxe is MeSa... :-/ + int RESOURCE_TYPE_IMAGEREADY = ('M' << 24) + ('e' << 16) + ('S' << 8) + 'a'; + int RESOURCE_TYPE_PHOTODELUXE = ('P' << 24) + ('H' << 16) + ('U' << 8) + 'T'; + int RESOURCE_TYPE_LIGHTROOM = ('A' << 24) + ('g' << 16) + ('H' << 8) + 'g'; + int RESOURCE_TYPE_DCSR = ('D' << 24) + ('C' << 16) + ('S' << 8) + 'R'; + /** IPTC image resource id. */ int RES_IPTC_NAA = 0x0404; diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSDReader.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSDReader.java index a8904a50..c8ca0d8e 100755 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSDReader.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/psd/PSDReader.java @@ -64,9 +64,17 @@ public final class PSDReader extends MetadataReader { while (true) { try { int type = input.readInt(); - - if (type != PSD.RESOURCE_TYPE) { - throw new IIOException(String.format("Wrong image resource type, expected '8BIM': '%08x'", type)); + + switch (type) { + case PSD.RESOURCE_TYPE_IMAGEREADY: + case PSD.RESOURCE_TYPE_PHOTODELUXE: + case PSD.RESOURCE_TYPE_LIGHTROOM: + case PSD.RESOURCE_TYPE_DCSR: + // TODO: Warning for these types! + case PSD.RESOURCE_TYPE: + break; + default: + throw new IIOException(String.format("Wrong image resource type, expected '8BIM': '%08x'", type)); } short id = input.readShort(); diff --git a/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSD.java b/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSD.java index 82f506de..6fb112a0 100755 --- a/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSD.java +++ b/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSD.java @@ -38,7 +38,7 @@ package com.twelvemonkeys.imageio.plugins.psd; * @see Adobe Photoshop File Formats Specification * @see Adobe Photoshop File Format Summary */ -interface PSD { +interface PSD extends com.twelvemonkeys.imageio.metadata.psd.PSD { /** PSD 2+ Native format (.PSD) identifier "8BPS" */ int SIGNATURE_8BPS = ('8' << 24) + ('B' << 16) + ('P' << 8) + 'S'; @@ -49,9 +49,7 @@ interface PSD { int VERSION_PSD = 1; int VERSION_PSB = 2; - /** PSD Resource type identifier "8BIM" */ - int RESOURCE_TYPE = ('8' << 24) + ('B' << 16) + ('I' << 8) + 'M'; - int RESOURCE_TYPE_LONG = ('8' << 24) + ('B' << 16) + ('6' << 8) + '4';; + int RESOURCE_TYPE_LONG = ('8' << 24) + ('B' << 16) + ('6' << 8) + '4'; // Blending modes /** Pass through blending mode "pass"*/ diff --git a/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageResource.java b/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageResource.java index c3ba9809..ebb7ad80 100755 --- a/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageResource.java +++ b/imageio/imageio-psd/src/main/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageResource.java @@ -31,8 +31,8 @@ package com.twelvemonkeys.imageio.plugins.psd; import com.twelvemonkeys.imageio.stream.SubImageInputStream; import com.twelvemonkeys.lang.StringUtil; -import javax.imageio.stream.ImageInputStream; import javax.imageio.IIOException; +import javax.imageio.stream.ImageInputStream; import java.io.IOException; import java.lang.reflect.Field; @@ -163,8 +163,16 @@ public class PSDImageResource { public static PSDImageResource read(final ImageInputStream pInput) throws IOException { int type = pInput.readInt(); - if (type != PSD.RESOURCE_TYPE) { - throw new IIOException(String.format("Wrong image resource type, expected '8BIM': '%s'", PSDUtil.intToStr(type))); + switch (type) { + case com.twelvemonkeys.imageio.metadata.psd.PSD.RESOURCE_TYPE_IMAGEREADY: + case com.twelvemonkeys.imageio.metadata.psd.PSD.RESOURCE_TYPE_PHOTODELUXE: + case com.twelvemonkeys.imageio.metadata.psd.PSD.RESOURCE_TYPE_LIGHTROOM: + case com.twelvemonkeys.imageio.metadata.psd.PSD.RESOURCE_TYPE_DCSR: + // TODO: Warning for these types! + case com.twelvemonkeys.imageio.metadata.psd.PSD.RESOURCE_TYPE: + break; + default: + throw new IIOException(String.format("Wrong image resource type, expected '8BIM': '%s'", PSDUtil.intToStr(type))); } // TODO: Have PSDImageResources defer actual parsing? (Just store stream offsets) diff --git a/imageio/imageio-psd/src/test/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageReaderTest.java b/imageio/imageio-psd/src/test/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageReaderTest.java index fdeaf75e..ac939e2f 100755 --- a/imageio/imageio-psd/src/test/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageReaderTest.java +++ b/imageio/imageio-psd/src/test/java/com/twelvemonkeys/imageio/plugins/psd/PSDImageReaderTest.java @@ -96,8 +96,9 @@ public class PSDImageReaderTest extends ImageReaderAbstractTest new TestData(getClassLoaderResource("/psd/masks2.psd"), new Dimension(640, 1136)), // RGB, multiple alpha channels, no transparency new TestData(getClassLoaderResource("/psd/rgb-multichannel-no-transparency.psd"), new Dimension(100, 100)), - new TestData(getClassLoaderResource("/psb/rgb-multichannel-no-transparency.psb"), new Dimension(100, 100)) - // TODO: Need uncompressed PSD + new TestData(getClassLoaderResource("/psb/rgb-multichannel-no-transparency.psb"), new Dimension(100, 100)), + // CMYK, uncompressed + contains some uncommon MeSa (instead of 8BIM) resource blocks + new TestData(getClassLoaderResource("/psd/fruit-cmyk-MeSa-resource.psd"), new Dimension(400, 191)) // TODO: Need more recent ZIP compressed PSD files from CS2/CS3+ ); } diff --git a/imageio/imageio-psd/src/test/resources/psd/fruit-cmyk-MeSa-resource.psd b/imageio/imageio-psd/src/test/resources/psd/fruit-cmyk-MeSa-resource.psd new file mode 100644 index 00000000..6905e488 Binary files /dev/null and b/imageio/imageio-psd/src/test/resources/psd/fruit-cmyk-MeSa-resource.psd differ