Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8071707

Saving image with metadata turn image to pink

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • tbd
    • 7u51, 8, 9
    • client-libs

      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 ----------

        1. PinkBug.jpg
          3.53 MB
          Alexey Ivanov
        2. PinkBug.java
          3 kB
          Alexey Ivanov

            prr Philip Race
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: