1 /*
   2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug     6574555
  27  * @summary Test verifies that PNGImageWriter encodes the R, G, B
  28  *          values of bKGD chunk properly.
  29  * @run     main VerifyRGBValuesFromBKGDChunk
  30  */
  31 
  32 import java.awt.image.BufferedImage;
  33 import java.io.IOException;
  34 import java.util.Iterator;
  35 import javax.imageio.ImageTypeSpecifier;
  36 import javax.imageio.ImageWriter;
  37 import javax.imageio.ImageReader;
  38 import javax.imageio.ImageIO;
  39 import javax.imageio.ImageWriteParam;
  40 import javax.imageio.metadata.IIOMetadata;
  41 import javax.imageio.metadata.IIOMetadataNode;
  42 import javax.imageio.IIOImage;
  43 import javax.imageio.stream.ImageInputStream;
  44 import javax.imageio.stream.ImageOutputStream;
  45 import java.io.ByteArrayInputStream;
  46 import java.io.ByteArrayOutputStream;
  47 import java.io.InputStream;
  48 
  49 public class VerifyRGBValuesFromBKGDChunk {
  50 
  51     public static void main(String[] args) throws IOException {
  52         int width = 1;
  53         int height = 1;
  54         BufferedImage img = new
  55             BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
  56         Iterator<ImageWriter> iterWriter =
  57             ImageIO.getImageWritersBySuffix("png");
  58         ImageWriter writer = iterWriter.next();
  59 
  60         ImageWriteParam param = writer.getDefaultWriteParam();
  61         ImageTypeSpecifier specifier =
  62             ImageTypeSpecifier.
  63                 createFromBufferedImageType(BufferedImage.TYPE_INT_BGR);
  64         IIOMetadata encodeMetadata =
  65             writer.getDefaultImageMetadata(specifier, param);
  66 
  67         // Write png image with bKGD chunk
  68         IIOMetadataNode bKGD_rgb = new IIOMetadataNode("bKGD_RGB");
  69         String red = "100";
  70         String green = "150";
  71         String blue = "200";
  72         bKGD_rgb.setAttribute("red", red);
  73         bKGD_rgb.setAttribute("green", green);
  74         bKGD_rgb.setAttribute("blue", blue);
  75 
  76         IIOMetadataNode bKGD = new IIOMetadataNode("bKGD");
  77         bKGD.appendChild(bKGD_rgb);
  78         IIOMetadataNode encodeRoot =
  79             new IIOMetadataNode("javax_imageio_png_1.0");
  80         encodeRoot.appendChild(bKGD);
  81 
  82         encodeMetadata.mergeTree("javax_imageio_png_1.0", encodeRoot);
  83 
  84         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  85         ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
  86         writer.setOutput(ios);
  87 
  88         writer.write(encodeMetadata,
  89                      new IIOImage(img, null, encodeMetadata), param);
  90         writer.dispose();
  91 
  92         baos.flush();
  93         byte[] imageByteArray = baos.toByteArray();
  94         baos.close();
  95 
  96         // Get bKGD chunk from image and verify the values
  97         InputStream input= new ByteArrayInputStream(imageByteArray);
  98         ImageInputStream iis = ImageIO.createImageInputStream(input);
  99         Iterator<ImageReader> iterReader =
 100             ImageIO.getImageReadersBySuffix("png");
 101         ImageReader reader = iterReader.next();
 102         reader.setInput(iis, false, false);
 103 
 104         IIOMetadata decodeMetadata = reader.getImageMetadata(0);
 105         IIOMetadataNode decodeRoot =
 106             (IIOMetadataNode) decodeMetadata.
 107                 getAsTree("javax_imageio_png_1.0");
 108         bKGD_rgb = (IIOMetadataNode)
 109             decodeRoot.getElementsByTagName("bKGD_RGB").item(0);
 110 
 111         if (!(red.equals(bKGD_rgb.getAttribute("red")) &&
 112               green.equals(bKGD_rgb.getAttribute("green")) &&
 113               blue.equals(bKGD_rgb.getAttribute("blue")))) {
 114             throw new RuntimeException("bKGD RGB values are not stored" +
 115             " properly");
 116         }
 117     }
 118 }
 119