I got this to work using both the JPEGEncoder classes, as well as ImageIO.
Man, it's several of orders of magnitude-more-work to do it with ImageIO. If
anyone has any comments about how I implemented it using ImageIO please feel
free to chime in!!

Thanks to everyone who helped me out.

Rob

-------------

Here's the easy solution:

    public void saveBufferedImageAsJPEG(BufferedImage bi, int dpi, String
fileName)
    {
        // save image as Jpeg
        FileOutputStream out = null;
        try
        {
            out = new FileOutputStream(fileName+".jpg");
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
            param.setQuality(1f, false);
            param.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
            param.setXDensity(dpi);
            param.setYDensity(dpi);
            encoder.setJPEGEncodeParam(param);
            try
            {
                encoder.encode(bi);
                out.close();
            }
            catch (IOException io)
            {
                System.out.println(io);
            }
        }
        catch (FileNotFoundException fnf)
        {
            System.out.println("File Not Found");
        }
    } //end     public void saveBufferedImageAsJPEG(int dpi, String
fileName)

----------------------------------------------------------
Of course, this isn't portable, that's the downside.

Here's the ImageIO method:
-----------------------------------------------------------

    //      Here is a function to save a jpeg using ImageIO:
    public static void saveImageToDisk(BufferedImage bi, int dpi, String
fileName)
    {

        Iterator i = ImageIO.getImageWritersByFormatName("jpeg");
        //are there any jpeg encoders available?

        if (i.hasNext()) //there's at least one ImageWriter, just use the
first one
        {
            ImageWriter imageWriter = (ImageWriter) i.next();
            //get the param
            ImageWriteParam param = imageWriter.getDefaultWriteParam();
            ImageTypeSpecifier its = new
ImageTypeSpecifier(bi.getColorModel(), bi.getSampleModel());

            //get metadata
            IIOMetadata iomd = imageWriter.getDefaultImageMetadata(its,
param);

            String formatName = "javax_imageio_jpeg_image_1.0";//this is the
DOCTYPE of the metadata we need

            Node node = iomd.getAsTree(formatName);
            //what are child nodes?
            NodeList nl = node.getChildNodes();
            for (int j = 0; j < nl.getLength(); j++)
            {
                Node n = nl.item(j);
                System.out.println("node from IOMetadata is : " +
n.getNodeName());

                if (n.getNodeName().equals("JPEGvariety"))
                {
                    NodeList childNodes = n.getChildNodes();

                    for (int k = 0; k < childNodes.getLength(); k++)
                    {
                        System.out.println("node #" + k + " is " +
childNodes.item(k).getNodeName());
                        if
(childNodes.item(k).getNodeName().equals("app0JFIF"))
                        {
                            NamedNodeMap nnm =
childNodes.item(k).getAttributes();
                            //get the resUnits, Xdensity, and Ydensity
attribuutes
                            Node resUnitsNode =
getAttributeByName(childNodes.item(k), "resUnits");
                            Node XdensityNode =
getAttributeByName(childNodes.item(k), "Xdensity");
                            Node YdensityNode =
getAttributeByName(childNodes.item(k), "Ydensity");

                            //reset values for nodes
                            resUnitsNode.setNodeValue("1"); //indicate DPI
mode
                            XdensityNode.setNodeValue(String.valueOf(dpi));
                            YdensityNode.setNodeValue(String.valueOf(dpi));

                            System.out.println("name=" +
resUnitsNode.getNodeName() + ", value=" + resUnitsNode.getNodeValue());
                            System.out.println("name=" +
XdensityNode.getNodeName() + ", value=" + XdensityNode.getNodeValue());
                            System.out.println("name=" +
YdensityNode.getNodeName() + ", value=" + YdensityNode.getNodeValue());


                        }    //end  if
(childNodes.item(k).getNodeName().equals("app0JFIF"))
                    } //end if (n.getNodeName().equals("JPEGvariety")
                    break; //we don't care about the rest of the children
                } //end if (n.getNodeName().equals("JPEGvariety"))

            } //end  for (int j = 0; j < nl.getLength(); j++)

            try
            {
                iomd.setFromTree(formatName,node);
            }
            catch (IIOInvalidTreeException e)
            {
                e.printStackTrace();  //To change body of catch statement
use Options | File Templates.
            }
            //attach the metadata to an image
            IIOImage iioimage = new IIOImage(bi, null, iomd);
            try
            {
                imageWriter.setOutput(new FileImageOutputStream(new
File(fileName+".jpg")));
                imageWriter.write(iioimage);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }  //end if (i.hasNext()) //there's at least one ImageWriter, just
use the first one
    }  //end public static void saveImageToDisk(BufferedImage bi, int dpi,
String fileName)

    /**
     * @param node
     * @param attributeName - name of child node to return
     * @return
     */
    static Node getAttributeByName(Node node, String attributeName)
    {
        if (node == null) return null;
        NamedNodeMap nnm = node.getAttributes();
        for (int i = 0; i < nnm.getLength(); i++)
        {
            Node n = nnm.item(i);
            if (n.getNodeName().equals(attributeName))
            {
                return n;
            }
        }
        return null; // no such attribute was found
    } //end Node getAttributeByName(Node node, String attributeName)

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to