处理alpha时,Java DirectColorModel与IndexColorModel

时间:2009-12-14 23:58:26

标签: java colors lookup-tables

我有一个BufferedImage,我得到它有一个IndexColorModel。然后,我希望将AffineTransform应用于AffineTransformOP,以便创建displayImage的转换版本。

以下是代码段:

int type = isRGB() ? AffineTransformOp.TYPE_BILINEAR : AffineTransformOp.TYPE_NEAREST_NEIGHBOR;
AffineTransformOp op = new AffineTransformOp(atx, type);
displayImage = op.filter(displayImage, null);

我正在使用许多图像运行它,并且从之前的帖子中我发现,如果我将转换类型设置为双线性,那么我的内存不足,因为我使用DirectColorModel获取图像。但是,这个DirectColorModel有一个正确的alpha通道(当我在翻译后将图像绘制成绿色背景时,我可以在整个图像周围看到绿色)。当我将插值类型设置为最近邻居时,无论背景如何,图像上方和左侧的像素都显示为黑色。我假设这意味着alpha没有设置。

有人能告诉我如何使用IndexColorModel正确设置alpha通道,或更改AffineTransformOP参数,以便获得具有正确alpha的IndexColorModel?

谢谢!

编辑: 这是AffineTransformOp.TYPE_BINLINEAR所需的效果: alt text

以下是我在AffineTransformOp.TYPE_NEAREST_NEIGHBOR看到的效果: alt text

整个背景最初被涂成绿色以表示效果,在这两种情况下,图像都是在位置(0,0)处绘制的。

1 个答案:

答案 0 :(得分:1)

我不确定你想要达到什么效果,但是当我在变换之前和/或之后调整alpha时,我得到预期的结果。通常,我从setComposite(AlphaComposite.Clear)开始,然后是fillRect()。如果所有其他方法都失败了,您可以filter()WritableRaster,并强制执行您想要的结果。另外,您可能会查看与RenderingHints相关的KEY_ALPHA_INTERPOLATION。这是toy我用来试验alpha,模式和颜色的各种组合。

我似乎记得看到你的图像显示的效果。回想AffineTransformOp可能会返回一个具有不同坐标的图像,尤其是旋转,我猜测添加的“空”空间未正确初始化。您可以使用下面的代码获得透明边框,这也使得围绕中心的旋转更加对称:

private BufferedImage getSquareImage(BufferedImage image) {
    int w = image.getWidth();
    int h = image.getHeight();
    int max = Math.max(w, h);
    BufferedImage square = new BufferedImage(
            max, max, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = square.createGraphics();
    g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setComposite(AlphaComposite.Clear);
    g2d.fillRect(0, 0, max, max);
    g2d.setComposite(AlphaComposite.Src);
    g2d.drawImage(image, (max - w) / 2, (max - h) / 2, null);
    g2d.dispose();
    return square;
}