Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4326510

AffineTransformOp produces incorrect results for USHORT_GRAY images

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 1.3.0
    • client-libs
    • 2d
    • x86
    • windows_nt



      Name: rlT66838 Date: 03/30/2000


      java version "1.3.0rc1-T"

      When operating on source and destination BufferedImages of type
      TYPE_USHORT_GRAY, AffineTransformOp.filter produces a completely incorrect
      output, with severely distorted image data.

      The problem is reproduced every time this operation is invoked.
      The problem is generic for the Windows NT platform, and seems independent of
      hardware and graphics mode.
      I have not tested this on other platforms.
      No error message, or trace info.

      Source code:

      Example.java: reproduces a simple example of the bug.

      import java.awt.image.*;
      import java.awt.geom.*;
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;

      public class Example extends JPanel {

          private static int imageType = BufferedImage.TYPE_USHORT_GRAY;

          private BufferedImage src;
          private BufferedImage dst;

          public static void main(String argv[]) {
      JFrame f = new JFrame();
      Example ex = new Example();

      ex.setPreferredSize(new Dimension(450, 300));
      f.getContentPane().add(ex);
      f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
      System.exit(0);
      }
      });
      f.pack();
      f.setVisible(true);
          }

          public void paintComponent(Graphics g) {
      AffineTransform at = AffineTransform.getScaleInstance(2.0, 2.0);
      AffineTransformOp atop =
      new AffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

      if(src == null) {
      src = createSourceImage(128, 128);
      dst = new BufferedImage(256, 256, imageType);
      atop.filter(src, dst);
      }

      g.drawImage(dst, 0, 0, null);
      g.drawImage(src, 300, 0, null);
          }

          private BufferedImage createSourceImage(int w, int h) {
      BufferedImage bi = new BufferedImage(w, h, imageType);
      WritableRaster wr = bi.getRaster();
      short[] rampdata = new short[w];
      int i;

      for(i=0; i<w; i++) {
      rampdata[i] = (short)(256*i);
      }

      for(i=0; i<h; i++) {
      wr.setDataElements(0, i, w, 1, rampdata);
      }
      return(bi);
          }
      }


      Example2.java: essentially the same program, but with images of
      type TYPE_BYTE_GRAY. It runs CORRECTLY.

      import java.awt.image.*;
      import java.awt.geom.*;
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;

      public class Example2 extends JPanel {

          private static int imageType = BufferedImage.TYPE_BYTE_GRAY;

          private BufferedImage src;
          private BufferedImage dst;

          public static void main(String argv[]) {
      JFrame f = new JFrame();
      Example2 ex = new Example2();

      ex.setPreferredSize(new Dimension(450, 300));
      f.getContentPane().add(ex);
      f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
      System.exit(0);
      }
      });
      f.pack();
      f.setVisible(true);
          }

          public void paintComponent(Graphics g) {
      AffineTransform at = AffineTransform.getScaleInstance(2.0, 2.0);
      AffineTransformOp atop =
      new AffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

      if(src == null) {
      src = createSourceImage(128, 128);
      dst = new BufferedImage(256, 256, imageType);
      atop.filter(src, dst);
      }

      g.drawImage(dst, 0, 0, null);
      g.drawImage(src, 300, 0, null);
          }

          private BufferedImage createSourceImage(int w, int h) {
      BufferedImage bi = new BufferedImage(w, h, imageType);
      WritableRaster wr = bi.getRaster();
      byte[] rampdata = new byte[w];
      int i;

      for(i=0; i<w; i++) {
      rampdata[i] = (byte)i;
      }

      for(i=0; i<h; i++) {
      wr.setDataElements(0, i, w, 1, rampdata);
      }
      return(bi);
          }
      }
      (Review ID: 101415)
      ======================================================================

            jehung Jeannette Hung (Inactive)
            rlewis Roger Lewis (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: