mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-05 04:25:29 -04:00
#276 Fix DHT inconsistency
This commit is contained in:
parent
c7208c2c97
commit
13bea23550
@ -197,9 +197,7 @@ final class JPEGImage10MetadataCleaner {
|
||||
IIOMetadataNode unknown = new IIOMetadataNode("unknown");
|
||||
unknown.setAttribute("MarkerTag", Integer.toString(segment.marker() & 0xff));
|
||||
|
||||
DataInputStream stream = new DataInputStream(segment.data());
|
||||
|
||||
try {
|
||||
try (DataInputStream stream = new DataInputStream(segment.data())) {
|
||||
String identifier = segment.identifier();
|
||||
int off = identifier != null ? identifier.length() + 1 : 0;
|
||||
|
||||
@ -213,9 +211,6 @@ final class JPEGImage10MetadataCleaner {
|
||||
|
||||
unknown.setUserObject(data);
|
||||
}
|
||||
finally {
|
||||
stream.close();
|
||||
}
|
||||
|
||||
if (next == null) {
|
||||
// To be semi-compatible with the functionality in mergeTree,
|
||||
@ -271,12 +266,12 @@ final class JPEGImage10MetadataCleaner {
|
||||
dht.getParentNode().insertBefore(acTables, dht.getNextSibling());
|
||||
|
||||
// Split into 2 dht nodes, one for AC and one for DC
|
||||
for (int i = 0; i < dhtables.getLength(); i++) {
|
||||
for (int i = dhtables.getLength() - 1; i >= 0 ; i--) {
|
||||
Element dhtable = (Element) dhtables.item(i);
|
||||
String tableClass = dhtable.getAttribute("class");
|
||||
if ("1".equals(tableClass)) {
|
||||
dht.removeChild(dhtable);
|
||||
acTables.appendChild(dhtable);
|
||||
acTables.insertBefore(dhtable, acTables.getFirstChild());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,96 @@
|
||||
package com.twelvemonkeys.imageio.plugins.jpeg;
|
||||
|
||||
import com.twelvemonkeys.imageio.stream.URLImageInputStreamSpi;
|
||||
import org.junit.Test;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.ImageReader;
|
||||
import javax.imageio.metadata.IIOMetadata;
|
||||
import javax.imageio.metadata.IIOMetadataNode;
|
||||
import javax.imageio.spi.IIORegistry;
|
||||
import javax.imageio.spi.ImageReaderSpi;
|
||||
import javax.imageio.stream.ImageInputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* JPEGImage10MetadataCleanerTest.
|
||||
*
|
||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||
* @author last modified by $Author: harald.kuhr$
|
||||
* @version $Id: JPEGImage10MetadataCleanerTest.java,v 1.0 08/08/16 harald.kuhr Exp$
|
||||
*/
|
||||
public class JPEGImage10MetadataCleanerTest {
|
||||
|
||||
static {
|
||||
IIORegistry.getDefaultInstance().registerServiceProvider(new URLImageInputStreamSpi());
|
||||
ImageIO.setUseCache(false);
|
||||
}
|
||||
|
||||
protected static final JPEGImageReaderSpi SPI = new JPEGImageReaderSpi(lookupDelegateProvider());
|
||||
|
||||
protected static ImageReaderSpi lookupDelegateProvider() {
|
||||
return JPEGImageReaderSpi.lookupDelegateProvider(IIORegistry.getDefaultInstance());
|
||||
}
|
||||
|
||||
// Unit/regression test for #276
|
||||
@Test
|
||||
public void cleanMetadataMoreThan4DHTSegments() throws Exception {
|
||||
List<String> testData = Arrays.asList("/jpeg/5dhtsegments.jpg", "/jpeg/6dhtsegments.jpg");
|
||||
|
||||
for (String data : testData) {
|
||||
try (ImageInputStream origInput = ImageIO.createImageInputStream(getClass().getResource(data));
|
||||
ImageInputStream input = ImageIO.createImageInputStream(getClass().getResource(data))) {
|
||||
|
||||
ImageReader origReader = SPI.delegateProvider.createReaderInstance();
|
||||
origReader.setInput(origInput);
|
||||
|
||||
ImageReader reader = SPI.createReaderInstance();
|
||||
reader.setInput(input);
|
||||
|
||||
IIOMetadata original = origReader.getImageMetadata(0);
|
||||
IIOMetadataNode origTree = (IIOMetadataNode) original.getAsTree(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0);
|
||||
|
||||
JPEGImage10MetadataCleaner cleaner = new JPEGImage10MetadataCleaner((JPEGImageReader) reader);
|
||||
IIOMetadata cleaned = cleaner.cleanMetadata(origReader.getImageMetadata(0));
|
||||
|
||||
IIOMetadataNode cleanTree = (IIOMetadataNode) cleaned.getAsTree(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0);
|
||||
|
||||
NodeList origDHT = origTree.getElementsByTagName("dht");
|
||||
assertEquals(1, origDHT.getLength());
|
||||
|
||||
NodeList cleanDHT = cleanTree.getElementsByTagName("dht");
|
||||
assertEquals(2, cleanDHT.getLength());
|
||||
|
||||
NodeList cleanDHTable = cleanTree.getElementsByTagName("dhtable");
|
||||
NodeList origDHTable = origTree.getElementsByTagName("dhtable");
|
||||
|
||||
assertEquals(origDHTable.getLength(), cleanDHTable.getLength());
|
||||
|
||||
// Note: This also tests that the order of the htables are the same,
|
||||
// but that will only hold if they are already sorted by class.
|
||||
// Luckily, they are in these cases...
|
||||
for (int i = 0; i < origDHTable.getLength(); i++) {
|
||||
Element cleanDHTableElem = (Element) cleanDHTable.item(i);
|
||||
Element origDHTableElem = (Element) origDHTable.item(i);
|
||||
|
||||
assertNotNull(cleanDHTableElem);
|
||||
|
||||
assertNotNull(cleanDHTableElem.getAttribute("class"));
|
||||
assertEquals(origDHTableElem.getAttribute("class"), cleanDHTableElem.getAttribute("class"));
|
||||
|
||||
assertNotNull(cleanDHTableElem.getAttribute("htableId"));
|
||||
assertEquals(origDHTableElem.getAttribute("htableId"), cleanDHTableElem.getAttribute("htableId"));
|
||||
}
|
||||
|
||||
reader.dispose();
|
||||
origReader.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
BIN
imageio/imageio-jpeg/src/test/resources/jpeg/5dhtsegments.jpg
Normal file
BIN
imageio/imageio-jpeg/src/test/resources/jpeg/5dhtsegments.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
BIN
imageio/imageio-jpeg/src/test/resources/jpeg/6dhtsegments.jpg
Normal file
BIN
imageio/imageio-jpeg/src/test/resources/jpeg/6dhtsegments.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
Loading…
x
Reference in New Issue
Block a user