Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #15653
| From | Knute Johnson <nospam@knutejohnson.com> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Image Thinning using JAVA |
| Date | 2012-06-26 22:04 -0700 |
| Organization | A noiseless patient Spider |
| Message-ID | <jse48p$pku$1@dont-email.me> (permalink) |
| References | <csqdnUsK6PaldXTSnZ2dnUVZ_vednZ2d@giganews.com> <jsd9em$hur$1@dont-email.me> <nospam-D8169E.23155626062012@news.aioe.org> |
On 6/26/2012 8:15 PM, John B. Matthews wrote:
> In article <jsd9em$hur$1@dont-email.me>,
> Knute Johnson <nospam@knutejohnson.com> wrote:
>
>> 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;
>> }
>
> Thanks for weighing in on this. Your approach has always worked
> flawlessly on JPG images, but I had trouble with a PNG file: the result
> was unusually dark, and a subsequent call to gray.getGrapics() failed.
> I'd welcome any insight you can offer.
>
>> You can use the same technique as above with an AffineTransformOp, as
>> John Matthews mentioned, to scale an image.
>
> I had good results with AffineTransformOp.TYPE_NEAREST_NEIGHBOR for
> down sampling:
>
> <https://sites.google.com/site/trashgod/scaled>
>
> As recently suggested by BGB:
>
> <https://groups.google.com/d/msg/comp.lang.java.programmer/zH_xK85o2mA/V--P6ruObwUJ>
>
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
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Image Thinning using JAVA sumera <kanwal.sumera@yahoo.com> - 2012-06-26 11:50 -0500
Re: Image Thinning using JAVA markspace <-@.> - 2012-06-26 10:21 -0700
Re: Image Thinning using JAVA "John B. Matthews" <nospam@nospam.invalid> - 2012-06-26 14:39 -0400
Re: Image Thinning using JAVA Knute Johnson <nospam@knutejohnson.com> - 2012-06-26 14:26 -0700
Re: Image Thinning using JAVA "John B. Matthews" <nospam@nospam.invalid> - 2012-06-26 23:15 -0400
Re: Image Thinning using JAVA Knute Johnson <nospam@knutejohnson.com> - 2012-06-26 22:04 -0700
Re: Image Thinning using JAVA "John B. Matthews" <nospam@nospam.invalid> - 2012-06-27 21:35 -0400
Re: Image Thinning using JAVA Roedy Green <see_website@mindprod.com.invalid> - 2012-06-27 07:01 -0700
csiph-web