title: In java, how do you write a java.awt.image.BufferedImage to an 8-bit png file?
body: <p>I am trying to write out a png file from a java.awt.image.BufferedImage.  Everything works fine but the resulting png is a 32-bit file.</p>
  
  <p>Is there a way to make the png file be 8-bit?  The image is grayscale, but I do need transparency as this is an overlay image.  I am using java 6, and I would prefer to return an OutputStream so that I can have the calling class deal with writing out the file to disk/db.</p>
  
  <p>Here is the relevant portion of the code:</p>
  
  <pre><code> public static ByteArrayOutputStream createImage(InputStream originalStream)
              throws IOException {
  
          ByteArrayOutputStream oStream = null;
  
          java.awt.Image newImg = javax.imageio.ImageIO.read(originalStream);
          int imgWidth = newImg.getWidth(null);
          int imgHeight = newImg.getHeight(null);
          java.awt.image.BufferedImage bim = new java.awt.image.BufferedImage(imgWidth,
                  imgHeight, java.awt.image.BufferedImage.TYPE_INT_ARGB);
  
          Color bckgrndColor = new Color(0x80, 0x80, 0x80);
  
          Graphics2D gf = (Graphics2D)bim.getGraphics();
  
          // set transparency for fill image
          gf.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
          gf.setColor(bckgrndColor);
          gf.fillRect(0, 0, imgWidth, imgHeight);
  
          oStream = new ByteArrayOutputStream();
          javax.imageio.ImageIO.write(bim, "png", oStream);
          oStream.close();
  
          return oStream;
      }
  </code></pre>