-
Bug
-
Resolution: Duplicate
-
P4
-
7u51, 8, 9
-
x86_64
-
windows_7
FULL PRODUCT VERSION :
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
Reading a jpg image and writing it to disk results in in "pink" image if it is saved with its original metadata.
Saving it the same way without metadata results in a good image.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Get the sample image from http://www.cuillerdier.net/PinkBug.JPG
Copy the picture and the test case in the same directory
Compile and run
Check the resulting images "PinkBug WithMetadata.jpg" and "PinkBug NoMetadata.jpg"
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
"PinkBug WithMetadata.jpg" looks pink but "PinkBug NoMetadata.jpg" look like the original file.
REPRODUCIBILITY :
This bug can be reproduced rarely.
---------- BEGIN SOURCE ----------
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.bmp.BMPImageWriteParam;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageInputStream;
import boobaky.annotation.nulls.NonNull;
public class PinkBug {
/**
* Demonstrate the pink bug
*/
public static void main(final String[] argv) throws Exception {
File imageFile = new File(PinkBug.class.getClassLoader()
.getResource("PinkBug.jpg").getPath().replace("%20", " "));
// Read Image
final BufferedImage original = ImageIO.read(imageFile);
// Get metadata
IIOMetadata metadata = null;
final ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
final Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
while (readers.hasNext()) {
ImageReader reader = null;
// pick the first available ImageReader
reader = readers.next();
// attach source to the reader
reader.setInput(iis, true);
// read metadata of first image
metadata = reader.getImageMetadata(0);
reader.dispose();
}
// Write image with metadata
ImageWriter imgWriter;
FileImageOutputStream output;
IIOImage image;
imageFile = new File(imageFile.getParent(), "PinkBug WithMetadata.jpg");
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
output = new FileImageOutputStream(imageFile);
imgWriter.setOutput(output);
image = new IIOImage(original, null, metadata);
imgWriter.write(null, image, getWriteParams(imgWriter));
imgWriter.dispose();
// Write image without metadata
imageFile = new File(imageFile.getParent(), "PinkBug NoMetadata.jpg");
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
output = new FileImageOutputStream(imageFile);
imgWriter.setOutput(output);
image = new IIOImage(original, null, null);
imgWriter.write(null, image, getWriteParams(imgWriter));
imgWriter.dispose();
}
private static final ImageWriteParam getWriteParams(
@NonNull final ImageWriter imgWriter) {
final ImageWriteParam iwParams = imgWriter.getDefaultWriteParam();
if (iwParams.canWriteCompressed()) {
iwParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
if (iwParams instanceof BMPImageWriteParam) {
iwParams.setCompressionType("BI_BITFIELDS"); //$NON-NLS-1$
} else {
iwParams.setCompressionType(iwParams.getCompressionTypes()[0]);
}
iwParams.setCompressionQuality(0.9f);
}
// fix "Missing Huffman code table entry" bug
if (iwParams instanceof JPEGImageWriteParam) {
((JPEGImageWriteParam) iwParams).setOptimizeHuffmanTables(true);
}
return iwParams;
}
}
---------- END SOURCE ----------
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
Reading a jpg image and writing it to disk results in in "pink" image if it is saved with its original metadata.
Saving it the same way without metadata results in a good image.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Get the sample image from http://www.cuillerdier.net/PinkBug.JPG
Copy the picture and the test case in the same directory
Compile and run
Check the resulting images "PinkBug WithMetadata.jpg" and "PinkBug NoMetadata.jpg"
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
"PinkBug WithMetadata.jpg" looks pink but "PinkBug NoMetadata.jpg" look like the original file.
REPRODUCIBILITY :
This bug can be reproduced rarely.
---------- BEGIN SOURCE ----------
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.bmp.BMPImageWriteParam;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageInputStream;
import boobaky.annotation.nulls.NonNull;
public class PinkBug {
/**
* Demonstrate the pink bug
*/
public static void main(final String[] argv) throws Exception {
File imageFile = new File(PinkBug.class.getClassLoader()
.getResource("PinkBug.jpg").getPath().replace("%20", " "));
// Read Image
final BufferedImage original = ImageIO.read(imageFile);
// Get metadata
IIOMetadata metadata = null;
final ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
final Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
while (readers.hasNext()) {
ImageReader reader = null;
// pick the first available ImageReader
reader = readers.next();
// attach source to the reader
reader.setInput(iis, true);
// read metadata of first image
metadata = reader.getImageMetadata(0);
reader.dispose();
}
// Write image with metadata
ImageWriter imgWriter;
FileImageOutputStream output;
IIOImage image;
imageFile = new File(imageFile.getParent(), "PinkBug WithMetadata.jpg");
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
output = new FileImageOutputStream(imageFile);
imgWriter.setOutput(output);
image = new IIOImage(original, null, metadata);
imgWriter.write(null, image, getWriteParams(imgWriter));
imgWriter.dispose();
// Write image without metadata
imageFile = new File(imageFile.getParent(), "PinkBug NoMetadata.jpg");
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
output = new FileImageOutputStream(imageFile);
imgWriter.setOutput(output);
image = new IIOImage(original, null, null);
imgWriter.write(null, image, getWriteParams(imgWriter));
imgWriter.dispose();
}
private static final ImageWriteParam getWriteParams(
@NonNull final ImageWriter imgWriter) {
final ImageWriteParam iwParams = imgWriter.getDefaultWriteParam();
if (iwParams.canWriteCompressed()) {
iwParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
if (iwParams instanceof BMPImageWriteParam) {
iwParams.setCompressionType("BI_BITFIELDS"); //$NON-NLS-1$
} else {
iwParams.setCompressionType(iwParams.getCompressionTypes()[0]);
}
iwParams.setCompressionQuality(0.9f);
}
// fix "Missing Huffman code table entry" bug
if (iwParams instanceof JPEGImageWriteParam) {
((JPEGImageWriteParam) iwParams).setOptimizeHuffmanTables(true);
}
return iwParams;
}
}
---------- END SOURCE ----------
- duplicates
-
JDK-6243376 JPEGImageWriter corrupts color for non-JFIF images with differing sample factors
-
- Resolved
-