处理 Alpha 时的 Java DirectColorModel 与 IndexColorModel

标签 java colors lookup-tables

我有一个 BufferedImage,它有一个 IndexColorModel。然后,我希望将 AffineTransform 与 A​​ffineTransformOP 一起应用,以创建 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 channel (当我在翻译图像后将图像绘制为绿色背景时,我可以在整个图像周围看到绿色)。当我将插值类型设置为最近邻时,无论背景是什么,图像上方和左侧的像素都会显示为黑色。我假设这意味着 alpha 尚未设置。

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

谢谢!!

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

这是我使用 AffineTransformOp.TYPE_NEAREST_NEIGHBOR 看到的效果: alt text

整个背景最初被涂成绿色以获得效果,并且在这两种情况下图像都绘制在位置 (0, 0)。

最佳答案

我不确定您想要达到什么效果,但是当我在转换之前和/或之后调整 Alpha 时,我得到了预期的结果。通常,我从 setComposite(AlphaComposite.Clear) 开始,然后是 fillRect()。如果所有其他方法都失败,您可以 filter()WritableRaster,并暴力破解您想要的结果。另外,您还可以查看与 KEY_ALPHA_INTERPOLATION 相关的 RenderingHints。这是 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;
}

关于处理 Alpha 时的 Java DirectColorModel 与 IndexColorModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1904384/

相关文章:

java - getResourceAsStream 返回 null,尽管被调用的文件与类 getResourceAsStream 位于同一目录中

Java捕获图像未找到异常

java - 复选框节点树

javascript - 将 RGB 转换为十六进制颜色

r 通过查找表替换字符串中的文本

java - Java中如何实现栈的反转?

Python:将0到1之间的值转换为红色到蓝色的颜色范围

Java:使用 If-Else 语句为网格列着色

html - 为什么将查找值(组合框值)存储在数据库中而不是将它们放在 html 页面上?

math - FPGA:使用查找表将范围除以固定数字