image - java.lang.IllegalArgumentException: Number of scaling constants does not equal the number of of color or color/alpha components -


i writing aplha composite test app based on example

/* create argb bufferedimage */    bufferedimage img = (bufferedimage)image;//imageio.read(imagesrc);    int w = img.getwidth(null);    int h = img.getheight(null);    bufferedimage bi = new bufferedimage(w, h, bufferedimage.type_4byte_abgr_pre);    graphics g = bi.getgraphics();    g.drawimage(img, 0, 0, null);     /* create rescale filter op makes image 50% opaque */    float[] scales = { 1f, 1f, 1f, 1f };    float[] offsets = new float[4];    rescaleop rop = new rescaleop(scales, offsets, null);     /* draw image, applying filter */    g2d.drawimage(bi, rop, 0, 0); 

source link: http://download.oracle.com/javase/tutorial/2d/images/drawimage.html

it works fine simple images photos (jpg etc) exception like:

java.lang.illegalargumentexception: number of scaling constants not equal number of of color or color/alpha components

to more clear... here adapted test code class. code style throws exception...

public class imagetest extends jlabel {      public image image;     private bufferedimage bimage;     imageobserver imageobserver;     float[] scales = {1f, 1f, 1f, 1f};     float[] offsets = new float[4];     rescaleop rop;     int width;     int height;      public imagetest(imageicon icon) {          width = icon.geticonwidth();         height = icon.geticonheight();          this.image = icon.getimage();         this.imageobserver = icon.getimageobserver();          //this.bimage=(bufferedimage)image; //previous version (makes exception?)...          this.bimage = new bufferedimage(             width, height, bufferedimage.type_int_argb);         this.bimage.creategraphics().drawimage(             this.image, 0, 0, width, height, imageobserver);          rop = new rescaleop(scales, offsets, null);         this.repaint();     }      public void paintcomponent(graphics g) {         super.paintcomponent(g);          graphics2d g2d = (graphics2d) g;         g2d.drawimage(this.bimage, rop, 0, 0);     }      public void setrescaleop(rescaleop rop) {         this.rop = rop;     } }//class end 

i not pretty sure exception comes need advice at?

p.s. suppose indexcolormodel problem if not sure how fix it...

any useful comment appreciated :)

andrew

using example below , image provided, unable reproduce effect describe.

i puzzled bufferedimage of type_4byte_abgr_pre has componentcolormodel, in contrast more familiar directcolormodel, it's indexcolormodel cannot rescaled.

addendum: updated code use filter(), previous version incorrectly reusing bufferedimage.

addendum: in answer, said,

i don't want create new bufferedimage each time. want filter image on fly using jslider.

the example cited creating bufferedimage once in seethroughcomponent constructor , adjusting rescaleop in slider's change handler. seems quite responsive.

addendum: in edit question, mention illegalargumentexception may arise when encountering image having indexcolormodel. able reproduce using, e.g. type_byte_indexed. may able work around such images trapping exception , rendering them separately shown here.

enter image description here

import java.awt.eventqueue; import java.awt.graphics2d; import java.awt.gridlayout; import java.awt.image; import java.awt.image.bufferedimage; import java.awt.image.rescaleop; import java.io.file; import java.io.ioexception; import java.net.url; import javax.imageio.imageio; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel;  /** @see https://stackoverflow.com/questions/5838842 */ public class rescaleoptest extends jpanel {      public static final string link =         "http://www.freeimagehosting.net/uploads/576c64ef7b.png";      public rescaleoptest() {         this.setlayout(new gridlayout(1, 0));         image img = null;         try {             img = imageio.read(new url(link)); //            img = imageio.read(new file("image.jpg"));         } catch (ioexception ex) {             ex.printstacktrace(system.err);         }         int w = img.getwidth(null);         int h = img.getheight(null);         bufferedimage bi = new bufferedimage(             w, h, bufferedimage.type_4byte_abgr_pre);         graphics2d g = bi.creategraphics();         g.drawimage(img, 0, 0, null);         g.dispose();          /* create rescale filter op makes image 75% opaque */         float[] scales = {1f, 1f, 1f, 0.75f};         float[] offsets = new float[4];         rescaleop rop = new rescaleop(scales, offsets, null);         bi = rop.filter(bi, null);         this.add(new jlabel(new imageicon(img)));         this.add(new jlabel(new imageicon(bi)));     }      private void display() {         jframe f = new jframe("rescaleoptest");         f.setdefaultcloseoperation(jframe.exit_on_close);         f.add(this);         f.pack();         f.setlocationrelativeto(null);         f.setvisible(true);     }      public static void main(string[] args) {         eventqueue.invokelater(new runnable() {              @override             public void run() {                 new rescaleoptest().display();             }         });     } } 

Comments