You got me interested on that one. I made a really simple test program
because of time constraints.
What I found was that if you just did a ColorConvertOP to a PNG or a
JPEG image, the image was in fact fairly dark. But if you then convert
that image to a compatible image it looks really good in gray scale.
Here's the simple code.
package com.knutejohnson.test;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import com.knutejohnson.classes.ImageUtilities;
public class PNGtoGray extends JPanel implements ActionListener {
private BufferedImage bi;
public PNGtoGray(BufferedImage bi) {
this.bi = bi;
setPreferredSize(new Dimension(bi.getWidth(),bi.getHeight()));
}
public void actionPerformed(ActionEvent ae) {
bi = ImageUtilities.convertToGray(bi);
bi = ImageUtilities.convertToCompatible(bi);
repaint();
}
public void paintComponent(Graphics g) {
g.drawImage(bi,0,0,null);
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BufferedImage bi = ImageIO.read(new File(args[0]));
JFrame f = new JFrame("PNGtoGray");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
PNGtoGray ptg = new PNGtoGray(bi);
f.add(ptg,BorderLayout.CENTER);
JButton b = new JButton("Conver to Gray");
b.addActionListener(ptg);
f.add(b,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
} catch (IOException ioe) {
System.out.println(ioe);
}
}
});
}
}
package com.knutejohnson.classes;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.imageio.plugins.jpeg.*;
public class ImageUtilities {
public static void writeJPEG(RenderedImage image, float quality,
File file)
throws IOException {
if (quality < 0.0f || quality > 1.0f)
throw new IllegalArgumentException("0.0 < Quality < 1.0");
ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("JPEG");
if (!iter.hasNext())
throw new IOException("No Writers Available");
writer = (ImageWriter)iter.next();
if (file.exists())
file.delete();
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
writer.setOutput(ios);
JPEGImageWriteParam iwp = new JPEGImageWriteParam(null);
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(quality);
writer.write(null,new IIOImage(image,null,null),iwp);
ios.flush();
writer.dispose();
ios.close();
}
public static BufferedImage convertToGray(BufferedImage image) {
BufferedImage gray = new BufferedImage(image.getWidth(),
image.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
ColorConvertOp op = new ColorConvertOp(
image.getColorModel().getColorSpace(),
gray.getColorModel().getColorSpace(),null);
op.filter(image,gray);
return gray;
}
public static BufferedImage scaleImage(BufferedImage src, double sx,
double sy, int interpolationType) {
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(sx,sy),interpolationType);
return op.filter(src,null);
}
public static BufferedImage scaleImage(BufferedImage src, double sx,
double sy, RenderingHints hints) {
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(sx,sy),hints);
return op.filter(src,null);
}
public static BufferedImage convertToCompatible(BufferedImage image) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage compatible =
gc.createCompatibleImage(image.getWidth(),
image.getHeight());
if (compatible.getType() == image.getType())
return image;
ColorConvertOp op = new ColorConvertOp(
image.getColorModel().getColorSpace(),
compatible.getColorModel().getColorSpace(),null);
return op.filter(image,compatible);
}
}
--
Knute Johnson