Java BuffereImage操作:创建兼容的RGBA输出?

Java BuffereImage操作:创建兼容的RGBA输出?,java,image,colors,Java,Image,Colors,此代码段稍长一些: public LookupOp maketable(Color target) { short[] red = new short[256]; short[] green = new short[256]; short[] blue = new short[256]; short[] alpha = new short[256]; for (int i = 0; i < 256; i++) { alpha[i] = (short) i; red[i] =

此代码段稍长一些:

public LookupOp maketable(Color target) {
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
short[] alpha = new short[256];
for (int i = 0; i < 256; i++) {
    alpha[i] = (short) i;
    red[i] = (short) ((double) target.getRed() * i / 256);
    green[i] = (short) ((double) target.getGreen() * i / 256);
    blue[i] = (short) ((double) target.getBlue() * i / 256);
}
short[][] data = { red, green, blue };
LookupTable lookupTable = new ShortLookupTable(0, data);
return new LookupOp(lookupTable, null);
}

public class GameArea extends JPanel {
public Color colour = new Color(0,0,0);
BufferedImage image = null;
BufferedImage outimage = null;
AffineTransform trans = new AffineTransform();
ColorConvertOp conv = null;

public GameArea() {
    setPreferredSize(new Dimension(600, 600));
    setBackground(new Color(0, 0, 5));
    try {
    image = ImageIO.read(new File("transTest.png"));
    } catch (Exception e) {
    e.printStackTrace();
    }
}

@Override
public void paintComponent(Graphics g) {
    try {
    BufferedImageOp filter = maketable(colour);
    outimage = filter.createCompatibleDestImage(image, ColorModel.getRGBdefault());
    filter.filter(image, outimage);
    trans.setToScale((double) getWidth() / (double) image.getWidth(),
        (double) getHeight() / (double) image.getHeight());

    ((Graphics2D) g).drawRenderedImage(outimage, trans);
    } catch (Exception e) {
    e.printStackTrace();
    }
}

}

class Refresher extends Thread {
//refreshes thread and changes the colour in the gamearea to make a fade between filters    
}
public LookupOp生成表(颜色目标){
short[]红色=新的short[256];
short[]绿色=新的short[256];
short[]蓝色=新的short[256];
short[]alpha=新的short[256];
对于(int i=0;i<256;i++){
α[i]=(短)i;
红色[i]=(短)((双)target.getRed()*i/256);
绿色[i]=(短)((双)target.getGreen()*i/256);
蓝色[i]=(短)((双)target.getBlue()*i/256);
}
短[][]数据={红、绿、蓝};
LookupTable LookupTable=新的ShortLookupTable(0,数据);
返回新的LookupOp(lookupTable,null);
}
公共类游戏区扩展JPanel{
公共颜色=新颜色(0,0,0);
BuffereImage图像=空;
BuffereImage outimage=null;
AffineTransform trans=新的AffineTransform();
ColorConvertOp conv=null;
公共游戏区(){
setPreferredSize(新尺寸(600600));
挫折背景(新颜色(0,0,5));
试一试{
image=ImageIO.read(新文件(“transTest.png”);
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
公共组件(图形g){
试一试{
BufferedImageOp过滤器=制作表(颜色);
outimage=filter.createCompatibleDestImage(image,ColorModel.getRGBdefault());
filter.filter(image,outimage);
trans.setToScale((双精度)getWidth()/(双精度)image.getWidth(),
(double)getHeight()/(double)image.getHeight());
((Graphics2D)g).DrawRenderImage(outimage,trans);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类刷新器扩展线程{
//刷新线程并更改游戏区域的颜色,以在过滤器之间进行淡入
}
我正在做一些测试,为更大的主题做准备,并熟悉图像、颜色和滤镜

上面的示例以一个简单的图像为例,通过各种颜色将其淡入淡出,并将其缩放以适应窗口的大小。在我取出LookupOp上的alpha通道(使用jpgs时)后,它对某些文件有效,但对于其他文件,我得到以下例外:

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(Unknown Source) at java.awt.image.LookupOp.filter(Unknown Source) at objects.MainWindow$GameArea.paintComponent(MainWindow.java:72) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) java.lang.IllegalArgumentException:src(4)中的通道数与目标(2)中的通道数不匹配 位于java.awt.image.LookupOp.filter(未知源) 位于java.awt.image.LookupOp.filter(未知源) 位于objects.MainWindow$GameArea.paintComponent(MainWindow.java:72) 位于javax.swing.JComponent.paint(未知源代码) 位于javax.swing.JComponent.paintooffscreen(未知源) 我怀疑问题在于源图像中的通道数与我的查找表(我想成为标准的RGBA 32位系统)不兼容。我通过使dest colorModel与源colorModel匹配,成功地使其适用于平面JPG,但这不适用于我正在测试的PNG(透明度对我的项目很重要)

处理不同图像颜色模型的常用方法是什么?是否有合理的方法将图像转换为兼容的RGBA模型

编辑:我可以为.png解决这个问题,方法是将alpha通道重新添加到make表中(因此它是4个通道。但是,对于JPG,这会再次中断它。如何检测colorModel中通道的数量(和类型)


K.Barad

“这段代码稍微长一点:”为了更快地获得更好的帮助,发布一个SSCCE()。它是3个类的组合。我能做的最好的事情就是省去着色部分,但我怀疑这是“这段代码稍微长一点:”为了更快地获得更好的帮助,发布一个SSCCE().这是一个三门课的组合。我能做的最好的就是省去着色部分,但我怀疑这是部分原因