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

RescaleOp generates incompatible destination Raster

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • 9
    • 6u24, 7u4
    • client-libs
    • 2d
    • x86
    • os_x, windows_xp

      FULL PRODUCT VERSION :
      Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
      Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)

      ADDITIONAL OS VERSION INFORMATION :
      Windows XP

      A DESCRIPTION OF THE PROBLEM :
      Hi!
      I was trying to render a BufferedImage to another BufferedImage using RescaleOp. This results in the following exception:

      Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Number of bands in src 4 does not equal number of bands in dest 2
      at java.awt.image.RescaleOp.filter(RescaleOp.java:465)
      at java.awt.image.RescaleOp.filter(RescaleOp.java:415)
      at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:1076)
      at sun.java2d.pipe.ValidatePipe.transformImage(ValidatePipe.java:220)
      at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3125)
      at ...

      This is unexpected, as as far as i can see, RescaleOp creates the destination raster to write to by itself. This should not produce a Raster with less bands than the source raster. Even more weird: The Destination Image created HAS enough bands, but somewhere here:

      public class RescaleOp implements BufferedImageOp, RasterOp {
      [...]
          public final BufferedImage filter (BufferedImage src, BufferedImage dst) {
      [...]
                  if (dstCM.hasAlpha()) {
                      int dstNumBands = dstRaster.getNumBands();
                      if (dstNumBands-1 == length || length == 1) {
                          int minx = dstRaster.getMinX();
                          int miny = dstRaster.getMinY();
                          int[] bands = new int[numBands-1];
                          for (int i=0; i < numBands-1; i++) {
                              bands[i] = i;
                          }
                          dstRaster =
                              dstRaster.createWritableChild(minx, miny,
                                                            dstRaster.getWidth(),
                                                            dstRaster.getHeight(),
                                                            minx, miny,
                                                            bands);
                      }
                  }
      [...]
          }

      It creates the Raster with 2 instead of four bands. I can reproduce this with TYPE_4BYTE_ABGR and TYPE_INT_ARGB (and their _PRE companions). The problem vanishes when i use TYPE_INT_BGR.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      (1) create a buffered Image (color model does not matter)
      (2) draw another BufferedImage with a color model including alpha onto it using RescaleOp

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Image should be drawn properly
      ACTUAL -
      IllegalArgumentsException gets thrown

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Number of bands in src 4 does not equal number of bands in dest 2
      at java.awt.image.RescaleOp.filter(RescaleOp.java:465)
      at java.awt.image.RescaleOp.filter(RescaleOp.java:415)
      at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:1076)
      at sun.java2d.pipe.ValidatePipe.transformImage(ValidatePipe.java:220)
      at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3125)
      at ...

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.awt.Dimension;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.image.BufferedImage;
      import java.awt.image.RescaleOp;

      import javax.swing.JFrame;
      import javax.swing.JPanel;

      public class ImageRenderTest {

      public static class IPanel extends JPanel{

      BufferedImage buffer;
      BufferedImage buffer2;

      @Override
      protected void paintComponent(Graphics g) {
      if(buffer == null) buffer = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_BGR);
      if(buffer2 == null){
      buffer2 = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_4BYTE_ABGR);
      Graphics2D g1 = buffer2.createGraphics();
      g1.clearRect(0, 0, buffer2.getWidth(), buffer2.getHeight());
      g1.drawRect(10, 10, 10, 10);
      g1.dispose();
      }
      Graphics2D g2 = buffer.createGraphics();
      g2.drawImage(buffer2, new RescaleOp(new float[]{1.0f,1.0f,1.0f},new float[]{0,0,0}, null), 0, 0);
      g2.dispose();

      g.drawImage(buffer, 0, 0, null);


      }

      @Override
      public Dimension getPreferredSize() {
      return new Dimension(400,400);
      }



      }

      /**
      * @param args
      */
      public static void main(String[] args) {
      JFrame frame = new JFrame("Test");
      frame.add(new IPanel());
      frame.pack();

      frame.setVisible(true);

      }

      }
      ---------- END SOURCE ----------

            psadhukhan Prasanta Sadhukhan
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: