1

我有一个带有 IndexColorModel 的 BufferedImage。然后我希望使用 AffineTransformOP 应用 AffineTransform 以创建 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替代文字

这是我看到的效果AffineTransformOp.TYPE_NEAREST_NEIGHBOR替代文字

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

4

1 回答 1

1

我不确定您要达到什么效果,但是当我在转换之前和/或之后调整 alpha 时,我得到了预期的结果。通常,我setComposite(AlphaComposite.Clear)fillRect(). 如果所有其他方法都失败了,您可以filter()使用WritableRaster, 并暴力破解您想要的结果。此外,您可能会查看RenderingHintsKEY_ALPHA_INTERPOLATION. 这是我用来试验 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;
}
于 2009-12-15T03:47:31.133 回答