From 673f3e5b5362aef4811236ccc116df6c9e8b3fd8 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 23 Aug 2016 21:21:58 +0200 Subject: [PATCH] #182 Massive refactorings to clean up metadata and segment handling --- .../{AdobeDCTSegment.java => AdobeDCT.java} | 43 ++-- .../imageio/plugins/jpeg/AppSegment.java | 70 ++++++ .../imageio/plugins/jpeg/Comment.java | 30 +++ .../imageio/plugins/jpeg/Frame.java | 139 +++++++++++ .../imageio/plugins/jpeg/HuffmanTable.java | 175 ++++++++++++++ .../imageio/plugins/jpeg/ICCProfile.java | 28 +++ .../jpeg/{JFIFSegment.java => JFIF.java} | 67 ++++-- .../plugins/jpeg/JFIFThumbnailReader.java | 4 +- .../jpeg/{JFXXSegment.java => JFXX.java} | 22 +- .../plugins/jpeg/JFXXThumbnailReader.java | 22 +- .../plugins/jpeg/JPEGImage10Metadata.java | 215 +++++++++++++++++ .../jpeg/JPEGImage10MetadataCleaner.java | 76 +++--- .../imageio/plugins/jpeg/JPEGImageReader.java | 227 ++++++------------ .../plugins/jpeg/QuantizationTable.java | 151 ++++++++++++ .../imageio/plugins/jpeg/SOFComponent.java | 59 ----- .../imageio/plugins/jpeg/SOFSegment.java | 87 ------- .../imageio/plugins/jpeg/Scan.java | 112 +++++++++ .../imageio/plugins/jpeg/Segment.java | 72 ++++++ .../imageio/plugins/jpeg/ThumbnailReader.java | 15 +- .../imageio/plugins/jpeg/Unknown.java | 27 +++ .../plugins/jpeg/lossless/ComponentSpec.java | 1 + .../plugins/jpeg/lossless/FrameHeader.java | 22 +- .../jpeg/lossless/JPEGLosslessDecoder.java | 20 +- .../lossless/JPEGLosslessDecoderWrapper.java | 62 ++--- .../plugins/jpeg/JFIFThumbnailReaderTest.java | 4 +- .../plugins/jpeg/JFXXThumbnailReaderTest.java | 3 +- .../plugins/jpeg/JPEGImageReaderTest.java | 3 +- .../resources/jpeg-lossless/testimg_gray.jpg | Bin 0 -> 209584 bytes .../resources/jpeg-lossless/testimg_rgb.jpg | Bin 0 -> 38374 bytes .../imageio/metadata/jpeg/JPEGSegment.java | 6 +- .../metadata/jpeg/JPEGSegmentUtil.java | 2 +- 31 files changed, 1315 insertions(+), 449 deletions(-) rename imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/{AdobeDCTSegment.java => AdobeDCT.java} (68%) create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AppSegment.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Comment.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Frame.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/HuffmanTable.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ICCProfile.java rename imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/{JFIFSegment.java => JFIF.java} (64%) rename imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/{JFXXSegment.java => JFXX.java} (80%) create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10Metadata.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/QuantizationTable.java delete mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFComponent.java delete mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFSegment.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Scan.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Segment.java create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Unknown.java create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg-lossless/testimg_gray.jpg create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg-lossless/testimg_rgb.jpg diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCTSegment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCT.java similarity index 68% rename from imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCTSegment.java rename to imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCT.java index 1d0651b7..19b6dc06 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCTSegment.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AdobeDCT.java @@ -28,6 +28,11 @@ package com.twelvemonkeys.imageio.plugins.jpeg; +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import java.io.DataInput; +import java.io.IOException; + /** * AdobeDCTSegment * @@ -35,7 +40,7 @@ package com.twelvemonkeys.imageio.plugins.jpeg; * @author last modified by $Author: haraldk$ * @version $Id: AdobeDCTSegment.java,v 1.0 23.04.12 16:55 haraldk Exp$ */ -class AdobeDCTSegment { +final class AdobeDCT extends AppSegment { public static final int Unknown = 0; public static final int YCC = 1; public static final int YCCK = 2; @@ -45,34 +50,34 @@ class AdobeDCTSegment { final int flags1; final int transform; - AdobeDCTSegment(int version, int flags0, int flags1, int transform) { + AdobeDCT(int version, int flags0, int flags1, int transform) { + super(JPEG.APP14, "Adobe", new byte[]{'A', 'd', 'o', 'b', 'e', 0, (byte) version, (byte) (flags0 >> 8), (byte) (flags0 & 0xff), (byte) (flags1 >> 8), (byte) (flags1 & 0xff), (byte) transform}); + this.version = version; // 100 or 101 this.flags0 = flags0; this.flags1 = flags1; this.transform = transform; } - public int getVersion() { - return version; - } - - public int getFlags0() { - return flags0; - } - - public int getFlags1() { - return flags1; - } - - public int getTransform() { - return transform; - } - @Override public String toString() { return String.format( "AdobeDCT[ver: %d.%02d, flags: %s %s, transform: %d]", - getVersion() / 100, getVersion() % 100, Integer.toBinaryString(getFlags0()), Integer.toBinaryString(getFlags1()), getTransform() + version / 100, version % 100, Integer.toBinaryString(flags0), Integer.toBinaryString(flags1), transform + ); + } + + public static AdobeDCT read(final DataInput data, final int length) throws IOException { + // TODO: Investigate http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6355567: 33/35 byte Adobe APP14 markers + + data.skipBytes(6); + + // version (byte), flags (4bytes), color transform (byte: 0=unknown, 1=YCC, 2=YCCK) + return new AdobeDCT( + data.readUnsignedByte(), + data.readUnsignedShort(), + data.readUnsignedShort(), + data.readUnsignedByte() ); } } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AppSegment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AppSegment.java new file mode 100644 index 00000000..e77472be --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/AppSegment.java @@ -0,0 +1,70 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; +import com.twelvemonkeys.lang.Validate; + +import java.io.ByteArrayInputStream; +import java.io.DataInput; +import java.io.IOException; +import java.io.InputStream; + +/** + * AppSegment. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: AppSegment.java,v 1.0 22/08/16 harald.kuhr Exp$ + */ +class AppSegment extends Segment { + + final String identifier; + final byte[] data; + + AppSegment(int marker, final String identifier, final byte[] data) { + super(marker); + + this.identifier = Validate.notEmpty(identifier, "identifier"); + this.data = data; + } + + protected AppSegment(int marker, final String identifier) { + this(marker, identifier, null); + } + + InputStream data() { + int offset = identifier.length() + 1; + return new ByteArrayInputStream(data, offset, data.length - offset); + } + + public static AppSegment read(final int marker, final String identifier, final DataInput data, final int length) throws IOException { + switch (marker) { + case JPEG.APP0: + // JFIF + if ("JFIF".equals(identifier)) { + return JFIF.read(data, length); + } + case JPEG.APP1: + // JFXX + if ("JFXX".equals(identifier)) { + return JFXX.read(data, length); + } + // TODO: Exif? + case JPEG.APP2: + // ICC_PROFILE + if ("ICC_PROFILE".equals(identifier)) { + return ICCProfile.read(data, length); + } + case JPEG.APP14: + // Adobe + if ("Adobe".equals(identifier)) { + return AdobeDCT.read(data, length); + } + + default: + // Generic APPn segment + byte[] bytes = new byte[length - 2]; + data.readFully(bytes); + return new AppSegment(marker, identifier, bytes); + } + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Comment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Comment.java new file mode 100644 index 00000000..1b4c5c04 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Comment.java @@ -0,0 +1,30 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import java.io.DataInput; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * Comment. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: Comment.java,v 1.0 23/08/16 harald.kuhr Exp$ + */ +class Comment extends Segment { + final String comment; + + private Comment(final String comment) { + super(JPEG.COM); + this.comment = comment; + } + + public static Segment read(final DataInput data, final int length) throws IOException { + byte[] ascii = new byte[length]; + data.readFully(ascii); + + return new Comment(new String(ascii, StandardCharsets.UTF_8)); + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Frame.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Frame.java new file mode 100644 index 00000000..b3788669 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Frame.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 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.plugins.jpeg; + +import com.twelvemonkeys.imageio.stream.SubImageInputStream; + +import javax.imageio.IIOException; +import javax.imageio.stream.ImageInputStream; +import java.io.DataInput; +import java.io.IOException; +import java.io.Serializable; +import java.util.Arrays; + +/** + * Frame + * + * @author Harald Kuhr + * @author last modified by $Author: haraldk$ + * @version $Id: SOFSegment.java,v 1.0 22.04.13 16:40 haraldk Exp$ + */ +final class Frame extends Segment { + final int samplePrecision; // Sample precision + final int lines; // Height + final int samplesPerLine; // Width + + final Component[] components; // Components specifications + + Frame(final int marker, final int samplePrecision, final int lines, final int samplesPerLine, final Component[] components) { + super(marker); + + this.samplePrecision = samplePrecision; + this.lines = lines; + this.samplesPerLine = samplesPerLine; + this.components = components; + } + + int process() { + return marker & 0xff - 0xc0; + } + + int componentsInFrame() { + return components.length; + } + + Component getComponent(final int id) { + for (Component component : components) { + if (component.id == id) { + return component; + } + } + + throw new IllegalArgumentException(String.format("No such component id: %d", id)); + } + + @Override + public String toString() { + return String.format( + "SOF%d[%04x, precision: %d, lines: %d, samples/line: %d, components: %s]", + process(), marker, samplePrecision, lines, samplesPerLine, Arrays.toString(components) + ); + } + + static Frame read(final int marker, final DataInput data, final int length) throws IOException { + int samplePrecision = data.readUnsignedByte(); + int lines = data.readUnsignedShort(); + int samplesPerLine = data.readUnsignedShort(); + int componentsInFrame = data.readUnsignedByte(); + + int expected = 8 + componentsInFrame * 3; + if (length != expected) { + throw new IIOException(String.format("Unexpected SOF length: %d != %d", length, expected)); + } + + Component[] components = new Component[componentsInFrame]; + + for (int i = 0; i < componentsInFrame; i++) { + int id = data.readUnsignedByte(); + int sub = data.readUnsignedByte(); + int qtSel = data.readUnsignedByte(); + + components[i] = new Component(id, ((sub & 0xF0) >> 4), (sub & 0xF), qtSel); + } + + return new Frame(marker, samplePrecision, lines, samplesPerLine, components); + } + + static Frame read(final int marker, final ImageInputStream data) throws IOException { + int length = data.readUnsignedShort(); + + return read(marker, new SubImageInputStream(data, length), length); + } + + static final class Component { + final int id; + final int hSub; // Horizontal sampling factor + final int vSub; // Vertical sampling factor + final int qtSel; // Quantization table destination selector + + Component(int id, int hSub, int vSub, int qtSel) { + this.id = id; + this.hSub = hSub; + this.vSub = vSub; + this.qtSel = qtSel; + } + + @Override + public String toString() { + // Use id either as component number or component name, based on value + Serializable idStr = (id >= 'a' && id <= 'z' || id >= 'A' && id <= 'Z') ? "'" + (char) id + "'" : id; + return String.format("id: %s, sub: %d/%d, sel: %d", idStr, hSub, vSub, qtSel); + } + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/HuffmanTable.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/HuffmanTable.java new file mode 100644 index 00000000..8bd4b465 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/HuffmanTable.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2015 Michael Martinez + * Changes: Added support for selection values 2-7, fixed minor bugs & + * warnings, split into multiple class files, and general clean up. + * + * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT. + */ + +/* + * Copyright (C) Helmut Dersch + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import javax.imageio.stream.ImageInputStream; +import java.io.DataInput; +import java.io.IOException; + +final class HuffmanTable extends Segment { + + final int l[][][] = new int[4][2][16]; + final int th[] = new int[4]; // 1: this table is presented + final int v[][][][] = new int[4][2][16][200]; // tables + final int[][] tc = new int[4][2]; // 1: this table is presented + + public static final int MSB = 0x80000000; + + public HuffmanTable() { + super(JPEG.DHT); + + tc[0][0] = 0; + tc[1][0] = 0; + tc[2][0] = 0; + tc[3][0] = 0; + tc[0][1] = 0; + tc[1][1] = 0; + tc[2][1] = 0; + tc[3][1] = 0; + th[0] = 0; + th[1] = 0; + th[2] = 0; + th[3] = 0; + } + + protected void buildHuffTables(final int[][][] HuffTab) throws IOException { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 2; j++) { + if (tc[i][j] != 0) { + buildHuffTable(HuffTab[i][j], l[i][j], v[i][j]); + } + } + } + } + + // Build_HuffTab() + // Parameter: t table ID + // c table class ( 0 for DC, 1 for AC ) + // L[i] # of codewords which length is i + // V[i][j] Huffman Value (length=i) + // Effect: + // build up HuffTab[t][c] using L and V. + private void buildHuffTable(final int tab[], final int L[], final int V[][]) throws IOException { + int currentTable, temp; + int k; + temp = 256; + k = 0; + + for (int i = 0; i < 8; i++) { // i+1 is Code length + for (int j = 0; j < L[i]; j++) { + for (int n = 0; n < (temp >> (i + 1)); n++) { + tab[k] = V[i][j] | ((i + 1) << 8); + k++; + } + } + } + + for (int i = 1; k < 256; i++, k++) { + tab[k] = i | MSB; + } + + currentTable = 1; + k = 0; + + for (int i = 8; i < 16; i++) { // i+1 is Code length + for (int j = 0; j < L[i]; j++) { + for (int n = 0; n < (temp >> (i - 7)); n++) { + tab[(currentTable * 256) + k] = V[i][j] | ((i + 1) << 8); + k++; + } + if (k >= 256) { + if (k > 256) { + throw new IOException("Huffman table error"); + } + + k = 0; + currentTable++; + } + } + } + } + + public static Segment read(DataInput data, int length) throws IOException { + int count = 0; + count += 2; + + HuffmanTable table = new HuffmanTable(); + + while (count < length) { + int temp = data.readUnsignedByte(); + count++; + int t = temp & 0x0F; + if (t > 3) { + throw new IOException("Huffman table Id > 3:" + t); + } + + int c = temp >> 4; + if (c > 2) { + throw new IOException("Huffman table class > 2: " + c); + } + + table.th[t] = 1; + table.tc[t][c] = 1; + + for (int i = 0; i < 16; i++) { + table.l[t][c][i] = data.readUnsignedByte(); + count++; + } + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < table.l[t][c][i]; j++) { + if (count > length) { + throw new IOException("Huffman table format error [count>Lh]"); + } + table.v[t][c][i][j] = data.readUnsignedByte(); + count++; + } + } + } + + if (count != length) { + throw new IOException("Huffman table format error [count!=Lf]"); + } + +// for (int i = 0; i < 4; i++) { +// for (int j = 0; j < 2; j++) { +// if (tc[i][j] != 0) { +// buildHuffTable(HuffTab[i][j], l[i][j], v[i][j]); +// } +// } +// } +// +// return 1; + return table; + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ICCProfile.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ICCProfile.java new file mode 100644 index 00000000..bdea9621 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ICCProfile.java @@ -0,0 +1,28 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import java.io.DataInput; +import java.io.IOException; + +/** + * ICCProfile. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: ICCProfile.java,v 1.0 22/08/16 harald.kuhr Exp$ + */ +final class ICCProfile extends AppSegment { + protected ICCProfile(final byte[] data) { + super(JPEG.APP2, "ICC_PROFILE", data); + } + + // TODO: Create util method to concat all ICC segments to one and return ICC_Profile (move from JPEGImageReader) + + public static ICCProfile read(DataInput data, int length) throws IOException { + byte[] bytes = new byte[length - 2]; + data.readFully(bytes); + + return new ICCProfile(bytes); + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFSegment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java similarity index 64% rename from imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFSegment.java rename to imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java index 373e1476..832105f2 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFSegment.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java @@ -28,9 +28,11 @@ package com.twelvemonkeys.imageio.plugins.jpeg; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import java.io.*; +import java.nio.ByteBuffer; +import java.util.Arrays; /** * JFIFSegment @@ -39,7 +41,7 @@ import java.io.InputStream; * @author last modified by $Author: haraldk$ * @version $Id: JFIFSegment.java,v 1.0 23.04.12 16:52 haraldk Exp$ */ -class JFIFSegment { +final class JFIF extends AppSegment { final int majorVersion; final int minorVersion; final int units; @@ -49,7 +51,9 @@ class JFIFSegment { final int yThumbnail; final byte[] thumbnail; - private JFIFSegment(int majorVersion, int minorVersion, int units, int xDensity, int yDensity, int xThumbnail, int yThumbnail, byte[] thumbnail) { + private JFIF(int majorVersion, int minorVersion, int units, int xDensity, int yDensity, int xThumbnail, int yThumbnail, byte[] thumbnail, byte[] data) { + super(JPEG.APP0, "JFIF", data); + this.majorVersion = majorVersion; this.minorVersion = minorVersion; this.units = units; @@ -86,20 +90,51 @@ class JFIFSegment { return String.format("thumbnail: %dx%d", xThumbnail, yThumbnail); } - public static JFIFSegment read(final InputStream data) throws IOException { - DataInputStream stream = new DataInputStream(data); + public static JFIF read(final DataInput data, int length) throws IOException { + if (length < 2 + 5 + 9) { + throw new EOFException(); + } + + data.readFully(new byte[5]); + + byte[] bytes = new byte[length - 2 - 5]; + data.readFully(bytes); int x, y; - return new JFIFSegment( - stream.readUnsignedByte(), - stream.readUnsignedByte(), - stream.readUnsignedByte(), - stream.readUnsignedShort(), - stream.readUnsignedShort(), - x = stream.readUnsignedByte(), - y = stream.readUnsignedByte(), - JPEGImageReader.readFully(stream, x * y * 3) + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + return new JFIF( + buffer.get() & 0xff, + buffer.get() & 0xff, + buffer.get() & 0xff, + buffer.getShort() & 0xffff, + buffer.getShort() & 0xffff, + x = buffer.get() & 0xff, + y = buffer.get() & 0xff, + getBytes(buffer, x * y * 3), + bytes ); +// return new JFIF( +// data.readUnsignedByte(), +// data.readUnsignedByte(), +// data.readUnsignedByte(), +// data.readUnsignedShort(), +// data.readUnsignedShort(), +// x = data.readUnsignedByte(), +// y = data.readUnsignedByte(), +// JPEGImageReader.readFully(data, x * y * 3) +// ); + } + + private static byte[] getBytes(ByteBuffer buffer, int len) { + if (len == 0) { + return null; + } + + byte[] dst = new byte[len]; + buffer.get(dst); + + return dst; } } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReader.java index 71e25bb4..ef16d460 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReader.java @@ -39,9 +39,9 @@ import java.io.IOException; * @version $Id: JFIFThumbnailReader.java,v 1.0 18.04.12 12:19 haraldk Exp$ */ final class JFIFThumbnailReader extends ThumbnailReader { - private final JFIFSegment segment; + private final JFIF segment; - public JFIFThumbnailReader(ThumbnailReadProgressListener progressListener, int imageIndex, int thumbnailIndex, JFIFSegment segment) { + public JFIFThumbnailReader(ThumbnailReadProgressListener progressListener, int imageIndex, int thumbnailIndex, JFIF segment) { super(progressListener, imageIndex, thumbnailIndex); this.segment = segment; } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXSegment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXX.java similarity index 80% rename from imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXSegment.java rename to imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXX.java index 00d33534..01099fa7 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXSegment.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXX.java @@ -28,9 +28,11 @@ package com.twelvemonkeys.imageio.plugins.jpeg; +import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; /** * JFXXSegment @@ -39,7 +41,7 @@ import java.io.InputStream; * @author last modified by $Author: haraldk$ * @version $Id: JFXXSegment.java,v 1.0 23.04.12 16:54 haraldk Exp$ */ -class JFXXSegment { +final class JFXX extends AppSegment { public static final int JPEG = 0x10; public static final int INDEXED = 0x11; public static final int RGB = 0x13; @@ -47,7 +49,9 @@ class JFXXSegment { final int extensionCode; final byte[] thumbnail; - private JFXXSegment(int extensionCode, byte[] thumbnail) { + private JFXX(final int extensionCode, final byte[] thumbnail, final byte[] data) { + super(com.twelvemonkeys.imageio.metadata.jpeg.JPEG.APP0, "JFXX", data); + this.extensionCode = extensionCode; this.thumbnail = thumbnail; } @@ -70,12 +74,16 @@ class JFXXSegment { } } - public static JFXXSegment read(InputStream data, int length) throws IOException { - DataInputStream stream = new DataInputStream(data); + public static JFXX read(final DataInput data, final int length) throws IOException { + data.readFully(new byte[5]); - return new JFXXSegment( - stream.readUnsignedByte(), - JPEGImageReader.readFully(stream, length - 1) + byte[] bytes = new byte[length - 2 - 5]; + data.readFully(bytes); + + return new JFXX( + bytes[0] & 0xff, + bytes.length - 1 > 0 ? Arrays.copyOfRange(bytes, 1, bytes.length - 1) : null, + bytes ); } } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReader.java index 8de14dcb..0d47d1ca 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReader.java @@ -50,11 +50,11 @@ import java.lang.ref.SoftReference; final class JFXXThumbnailReader extends ThumbnailReader { private final ImageReader reader; - private final JFXXSegment segment; + private final JFXX segment; private transient SoftReference cachedThumbnail; - protected JFXXThumbnailReader(final ThumbnailReadProgressListener progressListener, ImageReader jpegReader, final int imageIndex, final int thumbnailIndex, final JFXXSegment segment) { + protected JFXXThumbnailReader(final ThumbnailReadProgressListener progressListener, ImageReader jpegReader, final int imageIndex, final int thumbnailIndex, final JFXX segment) { super(progressListener, imageIndex, thumbnailIndex); this.reader = Validate.notNull(jpegReader); this.segment = segment; @@ -66,13 +66,13 @@ final class JFXXThumbnailReader extends ThumbnailReader { BufferedImage thumbnail; switch (segment.extensionCode) { - case JFXXSegment.JPEG: + case JFXX.JPEG: thumbnail = readJPEGCached(true); break; - case JFXXSegment.INDEXED: + case JFXX.INDEXED: thumbnail = readIndexed(); break; - case JFXXSegment.RGB: + case JFXX.RGB: thumbnail = readRGB(); break; default: @@ -119,10 +119,10 @@ final class JFXXThumbnailReader extends ThumbnailReader { @Override public int getWidth() throws IOException { switch (segment.extensionCode) { - case JFXXSegment.RGB: - case JFXXSegment.INDEXED: + case JFXX.RGB: + case JFXX.INDEXED: return segment.thumbnail[0] & 0xff; - case JFXXSegment.JPEG: + case JFXX.JPEG: return readJPEGCached(false).getWidth(); default: throw new IIOException(String.format("Unsupported JFXX extension code: %d", segment.extensionCode)); @@ -132,10 +132,10 @@ final class JFXXThumbnailReader extends ThumbnailReader { @Override public int getHeight() throws IOException { switch (segment.extensionCode) { - case JFXXSegment.RGB: - case JFXXSegment.INDEXED: + case JFXX.RGB: + case JFXX.INDEXED: return segment.thumbnail[1] & 0xff; - case JFXXSegment.JPEG: + case JFXX.JPEG: return readJPEGCached(false).getHeight(); default: throw new IIOException(String.format("Unsupported JFXX extension code: %d", segment.extensionCode)); diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10Metadata.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10Metadata.java new file mode 100644 index 00000000..46ebb233 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10Metadata.java @@ -0,0 +1,215 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.AbstractMetadata; +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; +import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegment; +import org.w3c.dom.Node; + +import javax.imageio.metadata.IIOMetadataNode; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * JPEGImage10Metadata. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: JPEGImage10Metadata.java,v 1.0 10/08/16 harald.kuhr Exp$ + */ +class JPEGImage10Metadata extends AbstractMetadata { + + // TODO: Clean up. Consider just making the meta data classes we were trying to avoid in the first place.... + + private final List segments; + + JPEGImage10Metadata(List segments) { + super(true, JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0, null, null, null); + + this.segments = segments; + } + + @Override + protected Node getNativeTree() { + IIOMetadataNode root = new IIOMetadataNode(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0); + + IIOMetadataNode jpegVariety = new IIOMetadataNode("JPEGvariety"); + root.appendChild(jpegVariety); + // TODO: If we have JFIF, append in JPEGvariety, but can't happen for lossless + + IIOMetadataNode markerSequence = new IIOMetadataNode("markerSequence"); + root.appendChild(markerSequence); + + for (Segment segment : segments) + switch (segment.marker) { + // SOF3 is the only one supported by now + case JPEG.SOF3: + Frame sofSegment = (Frame) segment; + + IIOMetadataNode sof = new IIOMetadataNode("sof"); + sof.setAttribute("process", String.valueOf(sofSegment.marker & 0xf)); + sof.setAttribute("samplePrecision", String.valueOf(sofSegment.samplePrecision)); + sof.setAttribute("numLines", String.valueOf(sofSegment.lines)); + sof.setAttribute("samplesPerLine", String.valueOf(sofSegment.samplesPerLine)); + sof.setAttribute("numFrameComponents", String.valueOf(sofSegment.componentsInFrame())); + + for (Frame.Component component : sofSegment.components) { + IIOMetadataNode componentSpec = new IIOMetadataNode("componentSpec"); + componentSpec.setAttribute("componentId", String.valueOf(component.id)); + componentSpec.setAttribute("HsamplingFactor", String.valueOf(component.hSub)); + componentSpec.setAttribute("VsamplingFactor", String.valueOf(component.vSub)); + componentSpec.setAttribute("QtableSelector", String.valueOf(component.qtSel)); + + sof.appendChild(componentSpec); + } + + markerSequence.appendChild(sof); + break; + + case JPEG.DHT: + HuffmanTable huffmanTable = (HuffmanTable) segment; + IIOMetadataNode dht = new IIOMetadataNode("dht"); + + // Uses fixed tables... + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 2; j++) { + if (huffmanTable.tc[i][j] != 0) { + IIOMetadataNode dhtable = new IIOMetadataNode("dhtable"); + dhtable.setAttribute("class", String.valueOf(j)); + dhtable.setAttribute("htableId", String.valueOf(i)); + dht.appendChild(dhtable); + } + } + } + + markerSequence.appendChild(dht); + break; + + case JPEG.DQT: + markerSequence.appendChild(new IIOMetadataNode("dqt")); + // TODO: + break; + + case JPEG.SOS: + Scan scan = (Scan) segment; + IIOMetadataNode sos = new IIOMetadataNode("sos"); + sos.setAttribute("numScanComponents", String.valueOf(scan.components.length)); + sos.setAttribute("startSpectralSelection", String.valueOf(scan.selection)); + sos.setAttribute("endSpectralSelection", String.valueOf(scan.spectralEnd)); + sos.setAttribute("approxHigh", String.valueOf(scan.ah)); + sos.setAttribute("approxLow", String.valueOf(scan.al)); + + for (Scan.Component component : scan.components) { + IIOMetadataNode spec = new IIOMetadataNode("scanComponentSpec"); + spec.setAttribute("componentSelector", String.valueOf(component.scanCompSel)); + spec.setAttribute("dcHuffTable", String.valueOf(component.dcTabSel)); + spec.setAttribute("acHuffTable", String.valueOf(component.acTabSel)); + sos.appendChild(spec); + } + + markerSequence.appendChild(sos); + break; + + case JPEG.COM: + IIOMetadataNode com = new IIOMetadataNode("com"); + com.setAttribute("comment", ((Comment) segment).comment); + + markerSequence.appendChild(com); + + break; + + case JPEG.APP14: + if (segment instanceof AdobeDCT) { + AdobeDCT adobe = (AdobeDCT) segment; + IIOMetadataNode app14Adobe = new IIOMetadataNode("app14Adobe"); + app14Adobe.setAttribute("version", String.valueOf(adobe.version)); + app14Adobe.setAttribute("flags0", String.valueOf(adobe.flags0)); + app14Adobe.setAttribute("flags1", String.valueOf(adobe.flags1)); + app14Adobe.setAttribute("transform", String.valueOf(adobe.transform)); + markerSequence.appendChild(app14Adobe); + break; + } + // Else, fall through to unknown segment + + default: + IIOMetadataNode unknown = new IIOMetadataNode("unknown"); + unknown.setAttribute("MarkerTag", String.valueOf(segment.marker & 0xFF)); + unknown.setUserObject(((AppSegment) segment).data); + markerSequence.appendChild(unknown); + + break; + } + + return root; + } + + @Override + protected IIOMetadataNode getStandardChromaNode() { + IIOMetadataNode chroma = new IIOMetadataNode("Chroma"); + + for (Segment segment : segments) { + if (segment instanceof Frame) { + Frame sofSegment = (Frame) segment; + IIOMetadataNode colorSpaceType = new IIOMetadataNode("ColorSpaceType"); + colorSpaceType.setAttribute("name", sofSegment.componentsInFrame() == 1 ? "Gray" : "RGB"); // TODO YCC, YCCK, CMYK etc + chroma.appendChild(colorSpaceType); + + IIOMetadataNode numChannels = new IIOMetadataNode("NumChannels"); + numChannels.setAttribute("value", String.valueOf(sofSegment.componentsInFrame())); + chroma.appendChild(numChannels); + + break; + } + } + + return chroma; + } + + @Override + protected IIOMetadataNode getStandardCompressionNode() { + IIOMetadataNode compression = new IIOMetadataNode("Compression"); + + IIOMetadataNode compressionTypeName = new IIOMetadataNode("CompressionTypeName"); + compressionTypeName.setAttribute("value", "JPEG"); // ...or "JPEG-LOSSLESS" (which is the name used by the JAI JPEGImageWriter for it's compression name)? + compression.appendChild(compressionTypeName); + + IIOMetadataNode lossless = new IIOMetadataNode("Lossless"); + lossless.setAttribute("value", "TRUE"); // TODO: For lossless only + compression.appendChild(lossless); + + IIOMetadataNode numProgressiveScans = new IIOMetadataNode("NumProgressiveScans"); + numProgressiveScans.setAttribute("value", "1"); // TODO! + compression.appendChild(numProgressiveScans); + + return compression; + } + + @Override + protected IIOMetadataNode getStandardDimensionNode() { + IIOMetadataNode dimension = new IIOMetadataNode("Dimension"); + + IIOMetadataNode imageOrientation = new IIOMetadataNode("ImageOrientation"); + imageOrientation.setAttribute("value", "normal"); // TODO + dimension.appendChild(imageOrientation); + + return dimension; + } + + @Override + protected IIOMetadataNode getStandardTextNode() { + IIOMetadataNode text = new IIOMetadataNode("Text"); + + for (Segment segment : segments) { + if (segment instanceof Comment) { + IIOMetadataNode com = new IIOMetadataNode("TextEntry"); + com.setAttribute("keyword", "comment"); + com.setAttribute("value", ((Comment) segment).comment); + + text.appendChild(com); + } + } + + return text.hasChildNodes() ? text : null; + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java index d78e091d..ca2b3728 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java @@ -1,7 +1,6 @@ package com.twelvemonkeys.imageio.plugins.jpeg; import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; -import com.twelvemonkeys.imageio.metadata.jpeg.JPEGSegment; import com.twelvemonkeys.xml.XMLSerializer; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -11,6 +10,7 @@ import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import java.awt.color.ICC_Profile; +import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.nio.charset.Charset; @@ -39,7 +39,7 @@ final class JPEGImage10MetadataCleaner { IIOMetadata cleanMetadata(final IIOMetadata imageMetadata) throws IOException { // We filter out pretty much everything from the stream.. // Meaning we have to read get *all APP segments* and re-insert into metadata. - List appSegments = reader.getAppSegments(JPEGImageReader.ALL_APP_MARKERS, null); + List appSegments = reader.getAppSegments(JPEGImageReader.ALL_APP_MARKERS, null); // NOTE: There's a bug in the merging code in JPEGMetadata mergeUnknownNode that makes sure all "unknown" nodes are added twice in certain conditions.... ARGHBL... // DONE: 1: Work around @@ -70,11 +70,11 @@ final class JPEGImage10MetadataCleaner { IIOMetadataNode jpegVariety = (IIOMetadataNode) tree.getElementsByTagName("JPEGvariety").item(0); IIOMetadataNode markerSequence = (IIOMetadataNode) tree.getElementsByTagName("markerSequence").item(0); - JFIFSegment jfifSegment = reader.getJFIF(); - JFXXSegment jfxxSegment = reader.getJFXX(); - AdobeDCTSegment adobeDCT = reader.getAdobeDCT(); + JFIF jfifSegment = reader.getJFIF(); + JFXX jfxx = reader.getJFXX(); + AdobeDCT adobeDCT = reader.getAdobeDCT(); ICC_Profile embeddedICCProfile = reader.getEmbeddedICCProfile(true); - SOFSegment sof = reader.getSOF(); + Frame sof = reader.getSOF(); boolean hasRealJFIF = false; boolean hasRealJFXX = false; @@ -104,17 +104,17 @@ final class JPEGImage10MetadataCleaner { hasRealICC = true; } - if (jfxxSegment != null) { + if (jfxx != null) { IIOMetadataNode JFXX = new IIOMetadataNode("JFXX"); jfif.appendChild(JFXX); IIOMetadataNode app0JFXX = new IIOMetadataNode("app0JFXX"); - app0JFXX.setAttribute("extensionCode", String.valueOf(jfxxSegment.extensionCode)); + app0JFXX.setAttribute("extensionCode", String.valueOf(jfxx.extensionCode)); - JFXXThumbnailReader thumbnailReader = new JFXXThumbnailReader(null, reader.getThumbnailReader(), 0, 0, jfxxSegment); + JFXXThumbnailReader thumbnailReader = new JFXXThumbnailReader(null, reader.getThumbnailReader(), 0, 0, jfxx); IIOMetadataNode jfifThumb; - switch (jfxxSegment.extensionCode) { - case JFXXSegment.JPEG: + switch (jfxx.extensionCode) { + case com.twelvemonkeys.imageio.plugins.jpeg.JFXX.JPEG: jfifThumb = new IIOMetadataNode("JFIFthumbJPEG"); // Contains it's own "markerSequence" with full DHT, DQT, SOF etc... IIOMetadata thumbMeta = thumbnailReader.readMetadata(); @@ -123,14 +123,14 @@ final class JPEGImage10MetadataCleaner { app0JFXX.appendChild(jfifThumb); break; - case JFXXSegment.INDEXED: + case com.twelvemonkeys.imageio.plugins.jpeg.JFXX.INDEXED: jfifThumb = new IIOMetadataNode("JFIFthumbPalette"); jfifThumb.setAttribute("thumbWidth", String.valueOf(thumbnailReader.getWidth())); jfifThumb.setAttribute("thumbHeight", String.valueOf(thumbnailReader.getHeight())); app0JFXX.appendChild(jfifThumb); break; - case JFXXSegment.RGB: + case com.twelvemonkeys.imageio.plugins.jpeg.JFXX.RGB: jfifThumb = new IIOMetadataNode("JFIFthumbRGB"); jfifThumb.setAttribute("thumbWidth", String.valueOf(thumbnailReader.getWidth())); jfifThumb.setAttribute("thumbHeight", String.valueOf(thumbnailReader.getHeight())); @@ -138,7 +138,7 @@ final class JPEGImage10MetadataCleaner { break; default: - reader.processWarningOccurred(String.format("Unknown JFXX extension code: %d", jfxxSegment.extensionCode)); + reader.processWarningOccurred(String.format("Unknown JFXX extension code: %d", jfxx.extensionCode)); } JFXX.appendChild(app0JFXX); @@ -156,12 +156,12 @@ final class JPEGImage10MetadataCleaner { } // Special case: Broken AdobeDCT segment, inconsistent with SOF, use values from SOF - if (adobeDCT != null && (adobeDCT.getTransform() == AdobeDCTSegment.YCCK && sof.componentsInFrame() < 4 || - adobeDCT.getTransform() == AdobeDCTSegment.YCC && sof.componentsInFrame() < 3)) { + if (adobeDCT != null && (adobeDCT.transform == AdobeDCT.YCCK && sof.componentsInFrame() < 4 || + adobeDCT.transform == AdobeDCT.YCC && sof.componentsInFrame() < 3)) { reader.processWarningOccurred(String.format( "Invalid Adobe App14 marker. Indicates %s data, but SOF%d has %d color component(s). " + "Ignoring Adobe App14 marker.", - adobeDCT.getTransform() == AdobeDCTSegment.YCCK ? "YCCK/CMYK" : "YCC/RGB", + adobeDCT.transform == AdobeDCT.YCCK ? "YCCK/CMYK" : "YCC/RGB", sof.marker & 0xf, sof.componentsInFrame() )); @@ -176,41 +176,43 @@ final class JPEGImage10MetadataCleaner { } Node next = null; - for (JPEGSegment segment : appSegments) { + for (AppSegment segment : appSegments) { // Except real app0JFIF, app0JFXX, app2ICC and app14Adobe, add all the app segments that we filtered away as "unknown" markers - if (segment.marker() == JPEG.APP0 && "JFIF".equals(segment.identifier()) && hasRealJFIF) { + if (segment.marker == JPEG.APP0 && "JFIF".equals(segment.identifier) && hasRealJFIF) { continue; } - else if (segment.marker() == JPEG.APP0 && "JFXX".equals(segment.identifier()) && hasRealJFXX) { + else if (segment.marker == JPEG.APP0 && "JFXX".equals(segment.identifier) && hasRealJFXX) { continue; } - else if (segment.marker() == JPEG.APP1 && "Exif".equals(segment.identifier()) /* always inserted */) { + else if (segment.marker == JPEG.APP1 && "Exif".equals(segment.identifier) /* always inserted */) { continue; } - else if (segment.marker() == JPEG.APP2 && "ICC_PROFILE".equals(segment.identifier()) && hasRealICC) { + else if (segment.marker == JPEG.APP2 && "ICC_PROFILE".equals(segment.identifier) && hasRealICC) { continue; } - else if (segment.marker() == JPEG.APP14 && "Adobe".equals(segment.identifier()) /* always inserted */) { + else if (segment.marker == JPEG.APP14 && "Adobe".equals(segment.identifier) /* always inserted */) { continue; } IIOMetadataNode unknown = new IIOMetadataNode("unknown"); - unknown.setAttribute("MarkerTag", Integer.toString(segment.marker() & 0xff)); + unknown.setAttribute("MarkerTag", Integer.toString(segment.marker & 0xff)); - try (DataInputStream stream = new DataInputStream(segment.data())) { - String identifier = segment.identifier(); - int off = identifier != null ? identifier.length() + 1 : 0; + unknown.setUserObject(segment.data); - byte[] data = new byte[off + segment.length()]; - - if (identifier != null) { - System.arraycopy(identifier.getBytes(Charset.forName("ASCII")), 0, data, 0, identifier.length()); - } - - stream.readFully(data, off, segment.length()); - - unknown.setUserObject(data); - } +// try (DataInputStream stream = new DataInputStream(new ByteArrayInputStream(segment.data))) { +// String identifier = segment.identifier; +// int off = identifier != null ? identifier.length() + 1 : 0; +// +// byte[] data = new byte[off + segment.data.length]; +// +// if (identifier != null) { +// System.arraycopy(identifier.getBytes(Charset.forName("ASCII")), 0, data, 0, identifier.length()); +// } +// +// stream.readFully(data, off, segment.data.length); +// +// unknown.setUserObject(data); +// } if (next == null) { // To be semi-compatible with the functionality in mergeTree, 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 8335ee40..54a15409 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 @@ -28,7 +28,6 @@ package com.twelvemonkeys.imageio.plugins.jpeg; -import com.twelvemonkeys.imageio.AbstractMetadata; import com.twelvemonkeys.imageio.ImageReaderBase; import com.twelvemonkeys.imageio.color.ColorSpaces; import com.twelvemonkeys.imageio.color.YCbCrConverter; @@ -45,12 +44,10 @@ import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers; import com.twelvemonkeys.imageio.util.ProgressListenerBase; import com.twelvemonkeys.lang.Validate; import com.twelvemonkeys.xml.XMLSerializer; -import org.w3c.dom.Node; import javax.imageio.*; import javax.imageio.event.IIOReadUpdateListener; import javax.imageio.event.IIOReadWarningListener; -import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataFormatImpl; import javax.imageio.metadata.IIOMetadataNode; @@ -158,7 +155,7 @@ public class JPEGImageReader extends ImageReaderBase { private JPEGImage10MetadataCleaner metadataCleaner; /** Cached list of JPEG segments we filter from the underlying stream */ - private List segments; + private List segments; protected JPEGImageReader(final ImageReaderSpi provider, final ImageReader delegate) { super(provider); @@ -226,13 +223,16 @@ public class JPEGImageReader extends ImageReaderBase { assertInput(); try { - SOFSegment sof = getSOF(); + Frame sof = getSOF(); if (sof.marker == JPEG.SOF3) { return true; } } catch (IIOException ignore) { // May happen if no SOF is found, in case we'll just fall through + if (DEBUG) { + ignore.printStackTrace(); + } } return false; @@ -242,7 +242,7 @@ public class JPEGImageReader extends ImageReaderBase { public int getWidth(int imageIndex) throws IOException { checkBounds(imageIndex); - SOFSegment sof = getSOF(); + Frame sof = getSOF(); if (sof.marker == JPEG.SOF3) { return sof.samplesPerLine; } @@ -254,7 +254,7 @@ public class JPEGImageReader extends ImageReaderBase { public int getHeight(int imageIndex) throws IOException { checkBounds(imageIndex); - SOFSegment sof = getSOF(); + Frame sof = getSOF(); if (sof.marker == JPEG.SOF3) { return sof.lines; } @@ -362,17 +362,17 @@ public class JPEGImageReader extends ImageReaderBase { assertInput(); checkBounds(imageIndex); - SOFSegment sof = getSOF(); + Frame sof = getSOF(); ICC_Profile profile = getEmbeddedICCProfile(false); - AdobeDCTSegment adobeDCT = getAdobeDCT(); + AdobeDCT adobeDCT = getAdobeDCT(); boolean bogusAdobeDCT = false; - if (adobeDCT != null && (adobeDCT.getTransform() == AdobeDCTSegment.YCC && sof.componentsInFrame() != 3 || - adobeDCT.getTransform() == AdobeDCTSegment.YCCK && sof.componentsInFrame() != 4)) { + if (adobeDCT != null && (adobeDCT.transform == AdobeDCT.YCC && sof.componentsInFrame() != 3 || + adobeDCT.transform == AdobeDCT.YCCK && sof.componentsInFrame() != 4)) { processWarningOccurred(String.format( "Invalid Adobe App14 marker. Indicates %s data, but SOF%d has %d color component(s). " + "Ignoring Adobe App14 marker.", - adobeDCT.getTransform() == AdobeDCTSegment.YCCK ? "YCCK/CMYK" : "YCC/RGB", + adobeDCT.transform == AdobeDCT.YCCK ? "YCCK/CMYK" : "YCC/RGB", sof.marker & 0xf, sof.componentsInFrame() )); @@ -413,7 +413,7 @@ public class JPEGImageReader extends ImageReaderBase { return delegate.read(imageIndex, param); } - private BufferedImage readImageAsRasterAndReplaceColorProfile(int imageIndex, ImageReadParam param, SOFSegment startOfFrame, JPEGColorSpace csType, ICC_Profile profile) throws IOException { + private BufferedImage readImageAsRasterAndReplaceColorProfile(int imageIndex, ImageReadParam param, Frame startOfFrame, JPEGColorSpace csType, ICC_Profile profile) throws IOException { int origWidth = getWidth(imageIndex); int origHeight = getHeight(imageIndex); @@ -548,7 +548,7 @@ public class JPEGImageReader extends ImageReaderBase { return image; } - static JPEGColorSpace getSourceCSType(JFIFSegment jfif, AdobeDCTSegment adobeDCT, final SOFSegment startOfFrame) throws IIOException { + static JPEGColorSpace getSourceCSType(JFIF jfif, AdobeDCT adobeDCT, final Frame startOfFrame) throws IIOException { /* ADAPTED from http://download.oracle.com/javase/6/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html: @@ -590,20 +590,20 @@ public class JPEGImageReader extends ImageReaderBase { */ if (adobeDCT != null) { - switch (adobeDCT.getTransform()) { - case AdobeDCTSegment.YCC: + switch (adobeDCT.transform) { + case AdobeDCT.YCC: if (startOfFrame.components.length != 3) { // This probably means the Adobe marker is bogus break; } return JPEGColorSpace.YCbCr; - case AdobeDCTSegment.YCCK: + case AdobeDCT.YCCK: if (startOfFrame.components.length != 4) { // This probably means the Adobe marker is bogus break; } return JPEGColorSpace.YCCK; - case AdobeDCTSegment.Unknown: + case AdobeDCT.Unknown: if (startOfFrame.components.length == 1) { return JPEGColorSpace.Gray; } @@ -637,7 +637,7 @@ public class JPEGImageReader extends ImageReaderBase { } else { // If subsampled, YCbCr else RGB - for (SOFComponent component : startOfFrame.components) { + for (Frame.Component component : startOfFrame.components) { if (component.hSub != 1 || component.vSub != 1) { return JPEGColorSpace.YCbCr; } @@ -665,7 +665,7 @@ public class JPEGImageReader extends ImageReaderBase { else { // TODO: JPEGMetadata (standard format) will report YCbCrA for 4 channel subsampled... :-/ // If subsampled, YCCK else CMYK - for (SOFComponent component : startOfFrame.components) { + for (Frame.Component component : startOfFrame.components) { if (component.hSub != 1 || component.vSub != 1) { return JPEGColorSpace.YCCK; } @@ -712,7 +712,27 @@ public class JPEGImageReader extends ImageReaderBase { if (segments == null) { long start = DEBUG ? System.currentTimeMillis() : 0; - readSegments(); + // TODO: Consider just reading the segments here, for better performance... + List jpegSegments = readSegments(); + + List segments = new ArrayList<>(jpegSegments.size()); + + for (JPEGSegment segment : jpegSegments) { + try (DataInputStream data = new DataInputStream(segment.segmentData())) { + segments.add(Segment.read(segment.marker(), segment.identifier(), segment.segmentLength(), data)); + } + catch (IOException e) { + // TODO: Handle bad segments better, for now, just ignore any bad APP markers + if (segment.marker() >= JPEG.APP0 && JPEG.APP15 >= segment.marker()) { + processWarningOccurred("Bogus " +segment.identifier() + " segment, ignoring"); + continue; + } + + throw e; + } + } + + this.segments = segments; if (DEBUG) { System.out.println("Read metadata in " + (System.currentTimeMillis() - start) + " ms"); @@ -720,13 +740,13 @@ public class JPEGImageReader extends ImageReaderBase { } } - private void readSegments() throws IOException { + private List readSegments() throws IOException { imageInput.mark(); try { imageInput.seek(0); // TODO: Seek to wanted image, skip images on the way - segments = JPEGSegmentUtil.readSegments(imageInput, SEGMENT_IDENTIFIERS); + return JPEGSegmentUtil.readSegments(imageInput, SEGMENT_IDENTIFIERS); } catch (IIOException | IllegalArgumentException ignore) { if (DEBUG) { @@ -738,126 +758,62 @@ public class JPEGImageReader extends ImageReaderBase { } // In case of an exception, avoid NPE when referencing segments later - if (segments == null) { - segments = Collections.emptyList(); - } + return Collections.emptyList(); } - List getAppSegments(final int marker, final String identifier) throws IOException { + List getAppSegments(final int marker, final String identifier) throws IOException { initHeader(); - List appSegments = Collections.emptyList(); + List appSegments = Collections.emptyList(); - for (JPEGSegment segment : segments) { - if ((marker == ALL_APP_MARKERS && segment.marker() >= JPEG.APP0 && segment.marker() <= JPEG.APP15 || segment.marker() == marker) - && (identifier == null || identifier.equals(segment.identifier()))) { + for (Segment segment : segments) { + if (segment instanceof AppSegment + && (marker == ALL_APP_MARKERS || marker == segment.marker) + && (identifier == null || identifier.equals(((AppSegment) segment).identifier))) { if (appSegments == Collections.EMPTY_LIST) { appSegments = new ArrayList<>(segments.size()); } - appSegments.add(segment); + appSegments.add((AppSegment) segment); } } return appSegments; } - SOFSegment getSOF() throws IOException { + Frame getSOF() throws IOException { initHeader(); - for (JPEGSegment segment : segments) { - if (JPEG.SOF0 <= segment.marker() && segment.marker() <= JPEG.SOF3 || - JPEG.SOF5 <= segment.marker() && segment.marker() <= JPEG.SOF7 || - JPEG.SOF9 <= segment.marker() && segment.marker() <= JPEG.SOF11 || - JPEG.SOF13 <= segment.marker() && segment.marker() <= JPEG.SOF15) { - - try (DataInputStream data = new DataInputStream(segment.data())) { - return SOFSegment.read(segment.marker(), data); - } -// try { -// int samplePrecision = data.readUnsignedByte(); -// int lines = data.readUnsignedShort(); -// int samplesPerLine = data.readUnsignedShort(); -// int componentsInFrame = data.readUnsignedByte(); -// -// SOFComponent[] components = new SOFComponent[componentsInFrame]; -// -// for (int i = 0; i < componentsInFrame; i++) { -// int id = data.readUnsignedByte(); -// int sub = data.readUnsignedByte(); -// int qtSel = data.readUnsignedByte(); -// -// components[i] = new SOFComponent(id, ((sub & 0xF0) >> 4), (sub & 0xF), qtSel); -// } -// -// return new SOFSegment(segment.marker(), samplePrecision, lines, samplesPerLine, components); -// } -// finally { -// data.close(); -// } + for (Segment segment : segments) { + if (segment instanceof Frame) { + return (Frame) segment; } } throw new IIOException("No SOF segment in stream"); } - AdobeDCTSegment getAdobeDCT() throws IOException { - // TODO: Investigate http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6355567: 33/35 byte Adobe APP14 markers - List adobe = getAppSegments(JPEG.APP14, "Adobe"); - - if (!adobe.isEmpty()) { - // version (byte), flags (4bytes), color transform (byte: 0=unknown, 1=YCC, 2=YCCK) - DataInputStream stream = new DataInputStream(adobe.get(0).data()); - - return new AdobeDCTSegment( - stream.readUnsignedByte(), - stream.readUnsignedShort(), - stream.readUnsignedShort(), - stream.readUnsignedByte() - ); - } - - return null; + AdobeDCT getAdobeDCT() throws IOException { + List adobe = getAppSegments(JPEG.APP14, "Adobe"); + return adobe.isEmpty() ? null : (AdobeDCT) adobe.get(0); } - JFIFSegment getJFIF() throws IOException{ - List jfif = getAppSegments(JPEG.APP0, "JFIF"); + JFIF getJFIF() throws IOException{ + List jfif = getAppSegments(JPEG.APP0, "JFIF"); + return jfif.isEmpty() ? null : (JFIF) jfif.get(0); - if (!jfif.isEmpty()) { - JPEGSegment segment = jfif.get(0); - - if (segment.length() >= 9) { - return JFIFSegment.read(segment.data()); - } - else { - processWarningOccurred("Bogus JFIF segment, ignoring"); - } - } - - return null; } - JFXXSegment getJFXX() throws IOException { - List jfxx = getAppSegments(JPEG.APP0, "JFXX"); - - if (!jfxx.isEmpty()) { - JPEGSegment segment = jfxx.get(0); - if (segment.length() >= 1) { - return JFXXSegment.read(segment.data(), segment.length()); - } - else { - processWarningOccurred("Bogus JFXX segment, ignoring"); - } - } - - return null; + JFXX getJFXX() throws IOException { + List jfxx = getAppSegments(JPEG.APP0, "JFXX"); + return jfxx.isEmpty() ? null : (JFXX) jfxx.get(0); } private CompoundDirectory getExif() throws IOException { - List exifSegments = getAppSegments(JPEG.APP1, "Exif"); + List exifSegments = getAppSegments(JPEG.APP1, "Exif"); if (!exifSegments.isEmpty()) { - JPEGSegment exif = exifSegments.get(0); + AppSegment exif = exifSegments.get(0); InputStream data = exif.data(); if (data.read() == -1) { // Read pad @@ -893,11 +849,13 @@ public class JPEGImageReader extends ImageReaderBase { // TODO: Allow metadata to contain the wrongly indexed profiles, if readable // NOTE: We ignore any profile with wrong index for reading and image types, just to be on the safe side - List segments = getAppSegments(JPEG.APP2, "ICC_PROFILE"); + List segments = getAppSegments(JPEG.APP2, "ICC_PROFILE"); + + // TODO: Possibly move this logic to the ICCProfile class... if (segments.size() == 1) { // Faster code for the common case - JPEGSegment segment = segments.get(0); + AppSegment segment = segments.get(0); DataInputStream stream = new DataInputStream(segment.data()); int chunkNumber = stream.readUnsignedByte(); int chunkCount = stream.readUnsignedByte(); @@ -1023,18 +981,18 @@ public class JPEGImageReader extends ImageReaderBase { ThumbnailReadProgressListener thumbnailProgressDelegator = new ThumbnailProgressDelegate(); // Read JFIF thumbnails if present - JFIFSegment jfif = getJFIF(); + JFIF jfif = getJFIF(); if (jfif != null && jfif.thumbnail != null) { thumbnails.add(new JFIFThumbnailReader(thumbnailProgressDelegator, imageIndex, thumbnails.size(), jfif)); } // Read JFXX thumbnails if present - JFXXSegment jfxx = getJFXX(); + JFXX jfxx = getJFXX(); if (jfxx != null && jfxx.thumbnail != null) { switch (jfxx.extensionCode) { - case JFXXSegment.JPEG: - case JFXXSegment.INDEXED: - case JFXXSegment.RGB: + case JFXX.JPEG: + case JFXX.INDEXED: + case JFXX.RGB: thumbnails.add(new JFXXThumbnailReader(thumbnailProgressDelegator, getThumbnailReader(), imageIndex, thumbnails.size(), jfxx)); break; default: @@ -1043,9 +1001,9 @@ public class JPEGImageReader extends ImageReaderBase { } // Read Exif thumbnails if present - List exifSegments = getAppSegments(JPEG.APP1, "Exif"); + List exifSegments = getAppSegments(JPEG.APP1, "Exif"); if (!exifSegments.isEmpty()) { - JPEGSegment exif = exifSegments.get(0); + AppSegment exif = exifSegments.get(0); InputStream data = exif.data(); if (data.read() == -1) { @@ -1131,36 +1089,7 @@ public class JPEGImageReader extends ImageReaderBase { IIOMetadata imageMetadata; if (isLossless()) { - return new AbstractMetadata(true, JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0, null, null, null) { - @Override - protected Node getNativeTree() { - IIOMetadataNode root = new IIOMetadataNode(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0); - - root.appendChild(new IIOMetadataNode("JPEGvariety")); - IIOMetadataNode markerSequence = new IIOMetadataNode("markerSequence"); - root.appendChild(markerSequence); - - for (JPEGSegment segment : segments) { - switch (segment.marker()) { - // SOF3 is the only one supported by now - case JPEG.SOF3: - markerSequence.appendChild(new IIOMetadataNode("sof")); - break; - case JPEG.DHT: - markerSequence.appendChild(new IIOMetadataNode("dht")); - break; - case JPEG.DQT: - markerSequence.appendChild(new IIOMetadataNode("dqt")); - break; - case JPEG.SOS: - markerSequence.appendChild(new IIOMetadataNode("sos")); - break; - } - } - - return root; - } - }; + return new JPEGImage10Metadata(segments); } else { try { diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/QuantizationTable.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/QuantizationTable.java new file mode 100644 index 00000000..2d3a53d5 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/QuantizationTable.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2015 Michael Martinez + * Changes: Added support for selection values 2-7, fixed minor bugs & + * warnings, split into multiple class files, and general clean up. + * + * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT. + */ + +/* + * Copyright (C) Helmut Dersch + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; + +import javax.imageio.stream.ImageInputStream; +import java.io.DataInput; +import java.io.IOException; + +final class QuantizationTable extends Segment { + + private final int precision[] = new int[4]; // Quantization precision 8 or 16 + private final int[] tq = new int[4]; // 1: this table is presented + + protected final int quantTables[][] = new int[4][64]; // Tables + + QuantizationTable() { + super(JPEG.DQT); + + tq[0] = 0; + tq[1] = 0; + tq[2] = 0; + tq[3] = 0; + } + + // TODO: Get rid of table param, make it a member? + protected void enhanceTables(final int[] table) throws IOException { + for (int t = 0; t < 4; t++) { + if (tq[t] != 0) { + enhanceQuantizationTable(quantTables[t], table); + } + } + } + + private void enhanceQuantizationTable(final int qtab[], final int[] table) { + for (int i = 0; i < 8; i++) { + qtab[table[(0 * 8) + i]] *= 90; + qtab[table[(4 * 8) + i]] *= 90; + qtab[table[(2 * 8) + i]] *= 118; + qtab[table[(6 * 8) + i]] *= 49; + qtab[table[(5 * 8) + i]] *= 71; + qtab[table[(1 * 8) + i]] *= 126; + qtab[table[(7 * 8) + i]] *= 25; + qtab[table[(3 * 8) + i]] *= 106; + } + + for (int i = 0; i < 8; i++) { + qtab[table[0 + (8 * i)]] *= 90; + qtab[table[4 + (8 * i)]] *= 90; + qtab[table[2 + (8 * i)]] *= 118; + qtab[table[6 + (8 * i)]] *= 49; + qtab[table[5 + (8 * i)]] *= 71; + qtab[table[1 + (8 * i)]] *= 126; + qtab[table[7 + (8 * i)]] *= 25; + qtab[table[3 + (8 * i)]] *= 106; + } + + for (int i = 0; i < 64; i++) { + qtab[i] >>= 6; + } + } + + public static QuantizationTable read(final DataInput data, final int length) throws IOException { + int count = 0; // TODO: Could probably use data.getPosition for this + + QuantizationTable table = new QuantizationTable(); + while (count < length) { + final int temp = data.readUnsignedByte(); + count++; + final int t = temp & 0x0F; + + if (t > 3) { + throw new IOException("ERROR: Quantization table ID > 3"); + } + + table.precision[t] = temp >> 4; + + if (table.precision[t] == 0) { + table.precision[t] = 8; + } + else if (table.precision[t] == 1) { + table.precision[t] = 16; + } + else { + throw new IOException("ERROR: Quantization table precision error"); + } + + table.tq[t] = 1; + + if (table.precision[t] == 8) { + for (int i = 0; i < 64; i++) { + if (count > length) { + throw new IOException("ERROR: Quantization table format error"); + } + + table.quantTables[t][i] = data.readUnsignedByte(); + count++; + } + +// table.enhanceQuantizationTable(table.quantTables[t], table); + } + else { + for (int i = 0; i < 64; i++) { + if (count > length) { + throw new IOException("ERROR: Quantization table format error"); + } + + table.quantTables[t][i] = data.readUnsignedShort(); + count += 2; + } + +// table.enhanceQuantizationTable(table.quantTables[t], table); + } + } + + if (count != length) { + throw new IOException("ERROR: Quantization table error [count!=Lq]"); + } + + return table; + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFComponent.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFComponent.java deleted file mode 100644 index 3416aef8..00000000 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFComponent.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2013, 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.plugins.jpeg; - -import java.io.Serializable; - -/** -* SOFComponent -* -* @author Harald Kuhr -* @author last modified by $Author: haraldk$ -* @version $Id: SOFComponent.java,v 1.0 22.04.13 16:40 haraldk Exp$ -*/ -final class SOFComponent { - final int id; - final int hSub; - final int vSub; - final int qtSel; - - SOFComponent(int id, int hSub, int vSub, int qtSel) { - this.id = id; - this.hSub = hSub; - this.vSub = vSub; - this.qtSel = qtSel; - } - - @Override - public String toString() { - // Use id either as component number or component name, based on value - Serializable idStr = (id >= 'a' && id <= 'z' || id >= 'A' && id <= 'Z') ? "'" + (char) id + "'" : id; - return String.format("id: %s, sub: %d/%d, sel: %d", idStr, hSub, vSub, qtSel); - } -} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFSegment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFSegment.java deleted file mode 100644 index 31d5314e..00000000 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/SOFSegment.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2013, 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.plugins.jpeg; - -import java.io.DataInput; -import java.io.IOException; -import java.util.Arrays; - -/** -* SOFSegment -* -* @author Harald Kuhr -* @author last modified by $Author: haraldk$ -* @version $Id: SOFSegment.java,v 1.0 22.04.13 16:40 haraldk Exp$ -*/ -final class SOFSegment { - final int marker; - final int samplePrecision; - final int lines; // height - final int samplesPerLine; // width - final SOFComponent[] components; - - SOFSegment(int marker, int samplePrecision, int lines, int samplesPerLine, SOFComponent[] components) { - this.marker = marker; - this.samplePrecision = samplePrecision; - this.lines = lines; - this.samplesPerLine = samplesPerLine; - this.components = components; - } - - final int componentsInFrame() { - return components.length; - } - - @Override - public String toString() { - return String.format( - "SOF%d[%04x, precision: %d, lines: %d, samples/line: %d, components: %s]", - marker & 0xff - 0xc0, marker, samplePrecision, lines, samplesPerLine, Arrays.toString(components) - ); - } - - public static SOFSegment read(final int marker, final DataInput data) throws IOException { - int samplePrecision = data.readUnsignedByte(); - int lines = data.readUnsignedShort(); - int samplesPerLine = data.readUnsignedShort(); - int componentsInFrame = data.readUnsignedByte(); - - SOFComponent[] components = new SOFComponent[componentsInFrame]; - - for (int i = 0; i < componentsInFrame; i++) { - int id = data.readUnsignedByte(); - int sub = data.readUnsignedByte(); - int qtSel = data.readUnsignedByte(); - - components[i] = new SOFComponent(id, ((sub & 0xF0) >> 4), (sub & 0xF), qtSel); - } - - return new SOFSegment(marker, samplePrecision, lines, samplesPerLine, components); - } -} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Scan.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Scan.java new file mode 100644 index 00000000..5e3612e6 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Scan.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2013, 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.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; +import com.twelvemonkeys.imageio.stream.SubImageInputStream; + +import javax.imageio.IIOException; +import javax.imageio.stream.ImageInputStream; +import java.io.DataInput; +import java.io.IOException; +import java.util.Arrays; + +final class Scan extends Segment { + final int selection; // Start of spectral or predictor selection + final int spectralEnd; // End of spectral selection + final int ah; + final int al; + + final Component[] components; + + Scan(final Component[] components, final int selection, final int spectralEnd, final int ah, final int al) { + super(JPEG.SOS); + + this.components = components; + this.selection = selection; + this.spectralEnd = spectralEnd; + this.ah = ah; + this.al = al; + } + + @Override + public String toString() { + return String.format( + "SOS[selection: %d, spectralEnd: %d, ah: %d, al: %d, components: %s]", + selection, spectralEnd, ah, al, Arrays.toString(components) + ); + } + + public static Scan read(final ImageInputStream data) throws IOException { + int length = data.readUnsignedShort(); + + return read(new SubImageInputStream(data, length), length); + } + + public static Scan read(final DataInput data, final int length) throws IOException { + int numComp = data.readUnsignedByte(); + + int expected = 6 + numComp * 2; + if (expected != length) { + throw new IIOException(String.format("Unexpected SOS length: %d != %d", length, expected)); + } + + Component[] components = new Component[numComp]; + + for (int i = 0; i < numComp; i++) { + int scanCompSel = data.readUnsignedByte(); + final int temp = data.readUnsignedByte(); + + components[i] = new Component(scanCompSel, temp & 0x0F, temp >> 4); + } + + int selection = data.readUnsignedByte(); + int spectralEnd = data.readUnsignedByte(); + int temp = data.readUnsignedByte(); + + return new Scan(components, selection, spectralEnd, temp >> 4, temp & 0x0F); + } + + final static class Component { + final int scanCompSel; // Scan component selector + final int acTabSel; // AC table selector + final int dcTabSel; // DC table selector + + Component(final int scanCompSel, final int acTabSel, final int dcTabSel) { + this.scanCompSel = scanCompSel; + this.acTabSel = acTabSel; + this.dcTabSel = dcTabSel; + } + + @Override + public String toString() { + return String.format("scanCompSel: %d, acTabSel: %d, dcTabSel: %d", scanCompSel, acTabSel, dcTabSel); + } + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Segment.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Segment.java new file mode 100644 index 00000000..bb57b22d --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Segment.java @@ -0,0 +1,72 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; +import com.twelvemonkeys.lang.Validate; + +import java.io.DataInput; +import java.io.IOException; + +/** + * Segment. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: Segment.java,v 1.0 22/08/16 harald.kuhr Exp$ + */ +abstract class Segment { + final int marker; + + protected Segment(final int marker) { + this.marker = Validate.isTrue(marker >> 8 == 0xFF, marker, "Unknown JPEG marker: 0x%04x"); + } + + public static Segment read(int marker, String identifier, int length, DataInput data) throws IOException { + // TODO: Fix length inconsistencies... +// System.err.print("marker: " + marker); +// System.err.println(" length: " + length); + switch (marker) { + case JPEG.DHT: + return HuffmanTable.read(data, length); + case JPEG.DQT: + return QuantizationTable.read(data, length - 2); + case JPEG.SOF0: + case JPEG.SOF1: + case JPEG.SOF2: + case JPEG.SOF3: + case JPEG.SOF5: + case JPEG.SOF6: + case JPEG.SOF7: + case JPEG.SOF9: + case JPEG.SOF10: + case JPEG.SOF11: + case JPEG.SOF13: + case JPEG.SOF14: + case JPEG.SOF15: + return Frame.read(marker, data, length); + case JPEG.SOS: + return Scan.read(data, length); + case JPEG.COM: + return Comment.read(data, length); + case JPEG.APP0: + case JPEG.APP1: + case JPEG.APP2: + case JPEG.APP3: + case JPEG.APP4: + case JPEG.APP5: + case JPEG.APP6: + case JPEG.APP7: + case JPEG.APP8: + case JPEG.APP9: + case JPEG.APP10: + case JPEG.APP11: + case JPEG.APP12: + case JPEG.APP13: + case JPEG.APP14: + case JPEG.APP15: + return AppSegment.read(marker, identifier, data, length); + // TODO: JPEG.DRI? + default: + return Unknown.read(marker, length, data); + } + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java index 370022c6..be3e7b28 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java @@ -42,7 +42,6 @@ import java.io.IOException; * @author last modified by $Author: haraldk$ * @version $Id: ThumbnailReader.java,v 1.0 18.04.12 12:22 haraldk Exp$ */ -// TODO: Get rid of the com.sun import!! abstract class ThumbnailReader { private final ThumbnailReadProgressListener progressListener; @@ -68,19 +67,9 @@ abstract class ThumbnailReader { } static protected BufferedImage readJPEGThumbnail(final ImageReader reader, final ImageInputStream stream) throws IOException { -// try { -// try { - reader.setInput(stream); + reader.setInput(stream); - return reader.read(0); -// } -// finally { -// input.close(); -// } -// } -// finally { -// reader.dispose(); -// } + return reader.read(0); } static protected BufferedImage readRawThumbnail(final byte[] thumbnail, final int size, final int offset, int w, int h) { diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Unknown.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Unknown.java new file mode 100644 index 00000000..9c59e504 --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/Unknown.java @@ -0,0 +1,27 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +import java.io.DataInput; +import java.io.IOException; + +/** + * Unknown. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: Unknown.java,v 1.0 22/08/16 harald.kuhr Exp$ + */ +final class Unknown extends Segment { + final byte[] data; + + private Unknown(final int marker, final byte[] data) { + super(marker); + + this.data = data; + } + + public static Segment read(int marker, int length, DataInput data) throws IOException { + byte[] bytes = new byte[length - 2]; + data.readFully(bytes); + return new Unknown(marker, bytes); + } +} diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/ComponentSpec.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/ComponentSpec.java index a22a4fac..3df58427 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/ComponentSpec.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/ComponentSpec.java @@ -32,6 +32,7 @@ package com.twelvemonkeys.imageio.plugins.jpeg.lossless; public class ComponentSpec { + protected int id; protected int hSamp; // Horizontal sampling factor protected int quantTableSel; // Quantization table destination selector protected int vSamp; // Vertical diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/FrameHeader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/FrameHeader.java index 6bf554f8..2443426b 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/FrameHeader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/FrameHeader.java @@ -64,7 +64,7 @@ public class FrameHeader { protected int read(final ImageInputStream data) throws IOException { int count = 0; - final int length = data.readUnsignedShort(); + int length = data.readUnsignedShort(); count += 2; precision = data.readUnsignedByte(); @@ -79,31 +79,31 @@ public class FrameHeader { numComp = data.readUnsignedByte(); count++; - //components = new ComponentSpec[numComp]; // some image exceed this range... - components = new ComponentSpec[256]; // setting to 256 -- not sure what it should be. + components = new ComponentSpec[numComp]; - for (int i = 1; i <= numComp; i++) { + for (int i = 0; i < numComp; i++) { if (count > length) { throw new IOException("ERROR: frame format error"); } - final int c = data.readUnsignedByte(); + int cid = data.readUnsignedByte(); count++; if (count >= length) { throw new IOException("ERROR: frame format error [c>=Lf]"); } - final int temp = data.readUnsignedByte(); + int temp = data.readUnsignedByte(); count++; - if (components[c] == null) { - components[c] = new ComponentSpec(); + if (components[i] == null) { + components[i] = new ComponentSpec(); } - components[c].hSamp = temp >> 4; - components[c].vSamp = temp & 0x0F; - components[c].quantTableSel = data.readUnsignedByte(); + components[i].id = cid; + components[i].hSamp = temp >> 4; + components[i].vSamp = temp & 0x0F; + components[i].quantTableSel = data.readUnsignedByte(); count++; } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoder.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoder.java index 2a93766f..2fe8d16e 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoder.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoder.java @@ -38,10 +38,14 @@ import java.io.IOException; public class JPEGLosslessDecoder { private final ImageInputStream input; + + // TODO: Merge these classes with similar classes from the main package + // (FrameHeader == Frame, ComponentSpec == Frame.Component, ScanHeader == Scan etc) private final FrameHeader frame; private final HuffmanTable huffTable; private final QuantizationTable quantTable; private final ScanHeader scan; + private final int HuffTab[][][] = new int[4][2][MAX_HUFFMAN_SUBTREE * 256]; private final int IDCT_Source[] = new int[64]; private final int nBlock[] = new int[10]; // number of blocks in the i-th Comp in a scan @@ -224,9 +228,9 @@ public class JPEGLosslessDecoder { final int[][] quantTables = quantTable.quantTables; for (int i = 0; i < numComp; i++) { - final int compN = scanComps[i].getScanCompSel(); - qTab[i] = quantTables[components[compN].quantTableSel]; - nBlock[i] = components[compN].vSamp * components[compN].hSamp; + ComponentSpec component = getComponentSpec(components, scanComps[i].getScanCompSel()); + qTab[i] = quantTables[component.quantTableSel]; + nBlock[i] = component.vSamp * component.hSamp; dcTab[i] = HuffTab[scanComps[i].getDcTabSel()][0]; acTab[i] = HuffTab[scanComps[i].getAcTabSel()][1]; } @@ -310,6 +314,16 @@ public class JPEGLosslessDecoder { return outputRef; } + private ComponentSpec getComponentSpec(ComponentSpec[] components, int sel) { + for (ComponentSpec component : components) { + if (component.id == sel) { + return component; + } + } + + throw new IllegalArgumentException("No such component id: " + sel); + } + private int readScan() throws IOException { return scan.read(input); } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoderWrapper.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoderWrapper.java index 13061b51..2a554fdd 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoderWrapper.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/lossless/JPEGLosslessDecoderWrapper.java @@ -1,18 +1,17 @@ package com.twelvemonkeys.imageio.plugins.jpeg.lossless; import javax.imageio.stream.ImageInputStream; -import java.awt.image.*; -import java.io.ByteArrayOutputStream; -import java.io.DataInput; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.awt.image.DataBufferUShort; +import java.awt.image.Raster; import java.io.IOException; /** - * This class provides the conversion of a byte buffer - * containing a JPEGLossless to an BufferedImage. - * Therefore it uses the rii-mango JPEGLosslessDecoder - * Library ( https://github.com/rii-mango/JPEGLosslessDecoder ) + * This class provides the conversion of input data + * containing a JPEG Lossless to an BufferedImage. *

- * Take care, that only the following lossless formats are supported + * Take care, that only the following lossless formats are supported: * 1.2.840.10008.1.2.4.57 JPEG Lossless, Nonhierarchical (Processes 14) * 1.2.840.10008.1.2.4.70 JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1]) *

@@ -26,10 +25,9 @@ import java.io.IOException; public class JPEGLosslessDecoderWrapper { /** - * Converts a byte buffer (containing a jpeg lossless) - * to an Java BufferedImage - * Currently the following conversions are supported - * - 24Bit, RGB -> BufferedImage.TYPE_INT_RGB + * Decodes a JPEG Lossless stream to a {@code BufferedImage}. + * Currently the following conversions are supported: + * - 24Bit, RGB -> BufferedImage.TYPE_3BYTE_BGR * - 8Bit, Grayscale -> BufferedImage.TYPE_BYTE_GRAY * - 16Bit, Grayscale -> BufferedImage.TYPE_USHORT_GRAY * @@ -47,9 +45,9 @@ public class JPEGLosslessDecoderWrapper { if (decoder.getNumComponents() == 1) { switch (decoder.getPrecision()) { case 8: - return read8Bit1ComponentGrayScale(decoded, width, height); + return to8Bit1ComponentGrayScale(decoded, width, height); case 16: - return read16Bit1ComponentGrayScale(decoded, width, height); + return to16Bit1ComponentGrayScale(decoded, width, height); default: throw new IOException("JPEG Lossless with " + decoder.getPrecision() + " bit precision and 1 component cannot be decoded"); } @@ -58,7 +56,7 @@ public class JPEGLosslessDecoderWrapper { if (decoder.getNumComponents() == 3) { switch (decoder.getPrecision()) { case 8: - return read24Bit3ComponentRGB(decoded, width, height); + return to24Bit3ComponentRGB(decoded, width, height); default: throw new IOException("JPEG Lossless with " + decoder.getPrecision() + " bit precision and 3 components cannot be decoded"); @@ -66,15 +64,15 @@ public class JPEGLosslessDecoderWrapper { } throw new IOException("JPEG Lossless with " + decoder.getPrecision() + " bit precision and " + decoder.getNumComponents() + " component(s) cannot be decoded"); - } public Raster readRaster(final ImageInputStream input) throws IOException { + // TODO: Can perhaps be implemented faster return readImage(input).getRaster(); } /** - * converts the decoded buffer into a BufferedImage + * Converts the decoded buffer into a BufferedImage. * precision: 16 bit, componentCount = 1 * * @param decoded data buffer @@ -82,18 +80,19 @@ public class JPEGLosslessDecoderWrapper { * @param height of the image * @return a BufferedImage.TYPE_USHORT_GRAY */ - private BufferedImage read16Bit1ComponentGrayScale(int[][] decoded, int width, int height) { + private BufferedImage to16Bit1ComponentGrayScale(int[][] decoded, int width, int height) { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY); short[] imageBuffer = ((DataBufferUShort) image.getRaster().getDataBuffer()).getData(); for (int i = 0; i < imageBuffer.length; i++) { imageBuffer[i] = (short) decoded[0][i]; } + return image; } /** - * converts the decoded buffer into a BufferedImage + * Converts the decoded buffer into a BufferedImage. * precision: 8 bit, componentCount = 1 * * @param decoded data buffer @@ -101,34 +100,37 @@ public class JPEGLosslessDecoderWrapper { * @param height of the image * @return a BufferedImage.TYPE_BYTE_GRAY */ - private BufferedImage read8Bit1ComponentGrayScale(int[][] decoded, int width, int height) { + private BufferedImage to8Bit1ComponentGrayScale(int[][] decoded, int width, int height) { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); byte[] imageBuffer = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); for (int i = 0; i < imageBuffer.length; i++) { imageBuffer[i] = (byte) decoded[0][i]; } + return image; } /** - * converts the decoded buffer into a BufferedImage - * precision: 24 bit, componentCount = 3 + * Converts the decoded buffer into a BufferedImage. + * precision: 8 bit, componentCount = 3 * * @param decoded data buffer * @param width of the image * @param height of the image - * @return a BufferedImage.TYPE_INT_RGB + * @return a BufferedImage.TYPE_3BYTE_RGB */ - private BufferedImage read24Bit3ComponentRGB(int[][] decoded, int width, int height) { - // TODO: Consider 3_BYTE_BGR as this is more common? - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - int[] imageBuffer = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); + private BufferedImage to24Bit3ComponentRGB(int[][] decoded, int width, int height) { + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + byte[] imageBuffer = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); - for (int i = 0; i < imageBuffer.length; i++) { - //convert to RGB - imageBuffer[i] = (decoded[0][i] << 16) | (decoded[1][i] << 8) | (decoded[2][i]); + for (int i = 0; i < imageBuffer.length / 3; i++) { + // Convert to RGB (BGR) + imageBuffer[i * 3 + 2] = (byte) decoded[0][i]; + imageBuffer[i * 3 + 1] = (byte) decoded[1][i]; + imageBuffer[i * 3] = (byte) decoded[2][i]; } + return image; } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java index 77b69653..4adf6fea 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java @@ -36,6 +36,7 @@ import org.mockito.InOrder; import javax.imageio.stream.ImageInputStream; import java.awt.image.BufferedImage; +import java.io.DataInputStream; import java.io.IOException; import java.util.List; @@ -60,7 +61,8 @@ public class JFIFThumbnailReaderTest extends AbstractThumbnailReaderTest { assertNotNull(segments); assertFalse(segments.isEmpty()); - return new JFIFThumbnailReader(progressListener, imageIndex, thumbnailIndex, JFIFSegment.read(segments.get(0).data())); + JPEGSegment segment = segments.get(0); + return new JFIFThumbnailReader(progressListener, imageIndex, thumbnailIndex, JFIF.read(new DataInputStream(segment.segmentData()), segment.segmentLength())); } @Test diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReaderTest.java index 0b8a6402..9b88bb9b 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFXXThumbnailReaderTest.java @@ -37,6 +37,7 @@ import org.mockito.InOrder; import javax.imageio.ImageIO; import javax.imageio.stream.ImageInputStream; import java.awt.image.BufferedImage; +import java.io.DataInputStream; import java.io.IOException; import java.util.List; @@ -64,7 +65,7 @@ public class JFXXThumbnailReaderTest extends AbstractThumbnailReaderTest { assertFalse(segments.isEmpty()); JPEGSegment jfxx = segments.get(0); - return new JFXXThumbnailReader(progressListener, ImageIO.getImageReadersByFormatName("jpeg").next(), imageIndex, thumbnailIndex, JFXXSegment.read(jfxx.data(), jfxx.length())); + return new JFXXThumbnailReader(progressListener, ImageIO.getImageReadersByFormatName("jpeg").next(), imageIndex, thumbnailIndex, JFXX.read(new DataInputStream(jfxx.data()), jfxx.length())); } @Test diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index 2156710b..4db02c31 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -95,7 +95,8 @@ public class JPEGImageReaderTest extends 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 literal 0 HcmV?d00001 diff --git a/imageio/imageio-jpeg/src/test/resources/jpeg-lossless/testimg_rgb.jpg b/imageio/imageio-jpeg/src/test/resources/jpeg-lossless/testimg_rgb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82b6b0366c9ca609563631a322d874736e116a51 GIT binary patch literal 38374 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 literal 0 HcmV?d00001 diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegment.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegment.java index 1a72dfa4..229a7985 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegment.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegment.java @@ -53,11 +53,15 @@ public final class JPEGSegment implements Serializable { this.length = length; } - int segmentLength() { + public int segmentLength() { // This is the length field as read from the stream return length; } + public InputStream segmentData() { + return data != null ? new ByteArrayInputStream(data) : null; + } + public int marker() { return marker; } diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java index a5a46cfd..da6e08b5 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java @@ -106,7 +106,7 @@ public final class JPEGSegmentUtil { if (isRequested(segment, segmentIdentifiers)) { if (segments == Collections.EMPTY_LIST) { - segments = new ArrayList(); + segments = new ArrayList<>(); } segments.add(segment);