我正在尝试使用BufferedImage
类实现用于反转BufferedImageOp
中每个像素的蓝色部分的算法,如here所述。我的尝试导致了这种方法的创建:
private BufferedImage getInvertedVersion(BufferedImage source) {
short[] invert = new short[256];
short[] straight = new short[256];
for (int i = 0; i < 256; i++) {
invert[i] = (short)(255 - i);
straight[i] = (short)i;
}
short[][] blueInvert = new short[][] { straight, straight, invert }; //Red stays the same, Green stays the same, Blue is inverted
BufferedImageOp blueInvertOp = new LookupOp(new ShortLookupTable(0, blueInvert), null);
//This produces error #1 when uncommented
/*blueInvertOp.filter(source, source);
return source;*/
//This produces error #2 instead when uncommented
/*return blueInvertOp.filter(source, null);*/
}
但是,当我调用BufferedImageOp
类的.filter方法时,我收到与通道数或字节数相关的错误。上面代码的注释部分产生了这些错误:
错误#1:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Number of channels in the src (4) does not match number of channels in the destination (2)
at java.awt.image.LookupOp.filter(LookupOp.java:273)
at java.awt.image.LookupOp.filter(LookupOp.java:221)
错误#2:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Number of color/alpha components should be 4 but length of bits array is 2
at java.awt.image.ColorModel.<init>(ColorModel.java:336)
at java.awt.image.ComponentColorModel.<init>(ComponentColorModel.java:273)
at java.awt.image.LookupOp.createCompatibleDestImage(LookupOp.java:413)
链接中的代码非常旧,(它是在1998年写的!)所以我假设从那时起一些事情发生了变化,这就是代码不再有效的原因。但是,我一直无法找到解释这个概念的其他来源,这是我的主要关注点。
任何人都可以解释这些错误的含义以及如何修复它们吗?或者更好的是,请指出一个关于如何操作图像的更新,但仍然彻底的教程?
答案 0 :(得分:6)
我遇到了同样的事情......答案是使用您正在寻找的颜色模型创建目标图像。此外,short [] []数据也需要包含alpha通道的维度。这是我通过反复试验偶然发现的工作代码示例:
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
short[] alpha = new short[256];
for (short i = 0; i < 256; i++) {
green[i] = blue[i] = 0;
alpha[i] = red[i] = i;
}
short[][] data = new short[][] {
red, green, blue, alpha
};
LookupTable lookupTable = new ShortLookupTable(0, data);
LookupOp op = new LookupOp(lookupTable, null);
BufferedImage destinationImage = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB);
destinationImage = op.filter(sourceImage, destinationImage);
这对我有用。