Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #15653

Re: Image Thinning using JAVA

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar | Unroll thread


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