-
Bug
-
Resolution: Duplicate
-
P4
-
6u24, 7u4
-
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 ----------
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 ----------
- duplicates
-
JDK-7178382 [macosx] RescaleOp computes wrong number of bands, causing IllegalArgumentException
-
- Closed
-