mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-04 20:15:28 -04:00
#815: Filter metadata and thumbnails before passing to JPEG delegate.
This commit is contained in:
parent
4513b0c166
commit
e3cb923d37
@ -250,7 +250,7 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
ListenerDelegate listener = new ListenerDelegate(imageIndex);
|
ListenerDelegate listener = new ListenerDelegate(imageIndex);
|
||||||
jpegWriter.addIIOWriteProgressListener(listener);
|
jpegWriter.addIIOWriteProgressListener(listener);
|
||||||
jpegWriter.addIIOWriteWarningListener(listener);
|
jpegWriter.addIIOWriteWarningListener(listener);
|
||||||
jpegWriter.write(null, image, copyParams(param, jpegWriter));
|
jpegWriter.write(null, imageOnly(image), copyParams(param, jpegWriter));
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
jpegWriter.dispose();
|
jpegWriter.dispose();
|
||||||
@ -285,6 +285,17 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
return nextIFDPointerOffset;
|
return nextIFDPointerOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IIOImage imageOnly(final IIOImage image) {
|
||||||
|
if (image.getMetadata() == null && image.getNumThumbnails() == 0) {
|
||||||
|
// Just image data here, no need to copy
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
return image.hasRaster()
|
||||||
|
? new IIOImage(image.getRaster(), null, null)
|
||||||
|
: new IIOImage(image.getRenderedImage(), null, null);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Candidate util method
|
// TODO: Candidate util method
|
||||||
private ImageWriteParam copyParams(final ImageWriteParam param, final ImageWriter writer) {
|
private ImageWriteParam copyParams(final ImageWriteParam param, final ImageWriter writer) {
|
||||||
if (param == null) {
|
if (param == null) {
|
||||||
|
@ -34,6 +34,7 @@ import com.twelvemonkeys.imageio.metadata.Directory;
|
|||||||
import com.twelvemonkeys.imageio.metadata.Entry;
|
import com.twelvemonkeys.imageio.metadata.Entry;
|
||||||
import com.twelvemonkeys.imageio.metadata.tiff.Rational;
|
import com.twelvemonkeys.imageio.metadata.tiff.Rational;
|
||||||
import com.twelvemonkeys.imageio.metadata.tiff.TIFF;
|
import com.twelvemonkeys.imageio.metadata.tiff.TIFF;
|
||||||
|
import com.twelvemonkeys.imageio.metadata.tiff.TIFFEntry;
|
||||||
import com.twelvemonkeys.imageio.metadata.tiff.TIFFReader;
|
import com.twelvemonkeys.imageio.metadata.tiff.TIFFReader;
|
||||||
import com.twelvemonkeys.imageio.stream.ByteArrayImageInputStream;
|
import com.twelvemonkeys.imageio.stream.ByteArrayImageInputStream;
|
||||||
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
import com.twelvemonkeys.imageio.util.ImageTypeSpecifiers;
|
||||||
@ -73,6 +74,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.twelvemonkeys.imageio.metadata.tiff.TIFF.TAG_X_RESOLUTION;
|
||||||
|
import static com.twelvemonkeys.imageio.metadata.tiff.TIFF.TAG_Y_RESOLUTION;
|
||||||
import static com.twelvemonkeys.imageio.plugins.tiff.TIFFImageMetadataFormat.SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME;
|
import static com.twelvemonkeys.imageio.plugins.tiff.TIFFImageMetadataFormat.SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME;
|
||||||
import static com.twelvemonkeys.imageio.plugins.tiff.TIFFImageMetadataTest.createTIFFFieldNode;
|
import static com.twelvemonkeys.imageio.plugins.tiff.TIFFImageMetadataTest.createTIFFFieldNode;
|
||||||
import static com.twelvemonkeys.imageio.util.ImageReaderAbstractTest.assertRGBEquals;
|
import static com.twelvemonkeys.imageio.util.ImageReaderAbstractTest.assertRGBEquals;
|
||||||
@ -133,8 +136,8 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest<TIFFImageWriter
|
|||||||
customMeta.appendChild(ifd);
|
customMeta.appendChild(ifd);
|
||||||
|
|
||||||
createTIFFFieldNode(ifd, TIFF.TAG_RESOLUTION_UNIT, TIFF.TYPE_SHORT, resolutionUnitValue);
|
createTIFFFieldNode(ifd, TIFF.TAG_RESOLUTION_UNIT, TIFF.TYPE_SHORT, resolutionUnitValue);
|
||||||
createTIFFFieldNode(ifd, TIFF.TAG_X_RESOLUTION, TIFF.TYPE_RATIONAL, resolutionValue);
|
createTIFFFieldNode(ifd, TAG_X_RESOLUTION, TIFF.TYPE_RATIONAL, resolutionValue);
|
||||||
createTIFFFieldNode(ifd, TIFF.TAG_Y_RESOLUTION, TIFF.TYPE_RATIONAL, resolutionValue);
|
createTIFFFieldNode(ifd, TAG_Y_RESOLUTION, TIFF.TYPE_RATIONAL, resolutionValue);
|
||||||
|
|
||||||
metadata.mergeTree(nativeFormat, customMeta);
|
metadata.mergeTree(nativeFormat, customMeta);
|
||||||
|
|
||||||
@ -153,11 +156,11 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest<TIFFImageWriter
|
|||||||
assertNotNull(resolutionUnit);
|
assertNotNull(resolutionUnit);
|
||||||
assertEquals(resolutionUnitValue, ((Number) resolutionUnit.getValue()).intValue());
|
assertEquals(resolutionUnitValue, ((Number) resolutionUnit.getValue()).intValue());
|
||||||
|
|
||||||
Entry xResolution = ifds.getEntryById(TIFF.TAG_X_RESOLUTION);
|
Entry xResolution = ifds.getEntryById(TAG_X_RESOLUTION);
|
||||||
assertNotNull(xResolution);
|
assertNotNull(xResolution);
|
||||||
assertEquals(resolutionValue, xResolution.getValue());
|
assertEquals(resolutionValue, xResolution.getValue());
|
||||||
|
|
||||||
Entry yResolution = ifds.getEntryById(TIFF.TAG_Y_RESOLUTION);
|
Entry yResolution = ifds.getEntryById(TAG_Y_RESOLUTION);
|
||||||
assertNotNull(yResolution);
|
assertNotNull(yResolution);
|
||||||
assertEquals(resolutionValue, yResolution.getValue());
|
assertEquals(resolutionValue, yResolution.getValue());
|
||||||
}
|
}
|
||||||
@ -272,11 +275,11 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest<TIFFImageWriter
|
|||||||
assertNotNull(resolutionUnit);
|
assertNotNull(resolutionUnit);
|
||||||
assertEquals(resolutionUnitValue, ((Number) resolutionUnit.getValue()).intValue());
|
assertEquals(resolutionUnitValue, ((Number) resolutionUnit.getValue()).intValue());
|
||||||
|
|
||||||
Entry xResolution = ifds.getEntryById(TIFF.TAG_X_RESOLUTION);
|
Entry xResolution = ifds.getEntryById(TAG_X_RESOLUTION);
|
||||||
assertNotNull(xResolution);
|
assertNotNull(xResolution);
|
||||||
assertEquals(expectedResolutionValue, xResolution.getValue());
|
assertEquals(expectedResolutionValue, xResolution.getValue());
|
||||||
|
|
||||||
Entry yResolution = ifds.getEntryById(TIFF.TAG_Y_RESOLUTION);
|
Entry yResolution = ifds.getEntryById(TAG_Y_RESOLUTION);
|
||||||
assertNotNull(yResolution);
|
assertNotNull(yResolution);
|
||||||
assertEquals(expectedResolutionValue, yResolution.getValue());
|
assertEquals(expectedResolutionValue, yResolution.getValue());
|
||||||
}
|
}
|
||||||
@ -1358,6 +1361,25 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest<TIFFImageWriter
|
|||||||
assertEquals(TIFFBaseline.PHOTOMETRIC_PALETTE, directory.getEntryById(TIFF.TAG_PHOTOMETRIC_INTERPRETATION).getValue());
|
assertEquals(TIFFBaseline.PHOTOMETRIC_PALETTE, directory.getEntryById(TIFF.TAG_PHOTOMETRIC_INTERPRETATION).getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteJPEGCompressedShouldNotPassMetadata() throws IOException {
|
||||||
|
BufferedImage image = new BufferedImage(10, 10, BufferedImage.TYPE_3BYTE_BGR);
|
||||||
|
|
||||||
|
try (ImageOutputStream output = new NullImageOutputStream()) {
|
||||||
|
ImageWriter imageWriter = createWriter();
|
||||||
|
imageWriter.setOutput(output);
|
||||||
|
|
||||||
|
ImageWriteParam param = imageWriter.getDefaultWriteParam();
|
||||||
|
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||||
|
param.setCompressionType("JPEG");
|
||||||
|
|
||||||
|
// From #815
|
||||||
|
// Prior to fix, this would throw IIOException: Metadata components != number of destination bands
|
||||||
|
// (empty metadata defaults to 1 channel gray, while image data is 3 channel BGR)
|
||||||
|
imageWriter.write(null, new IIOImage(image, null, new TIFFImageMetadata()), param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShortOverflowHuge() throws IOException {
|
public void testShortOverflowHuge() throws IOException {
|
||||||
int width = 34769;
|
int width = 34769;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user