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 usingjslider
.
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.
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
Post a Comment