我有一个 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 channel (当我在翻译图像后将图像绘制为绿色背景时,我可以在整个图像周围看到绿色)。当我将插值类型设置为最近邻时,无论背景是什么,图像上方和左侧的像素都会显示为黑色。我假设这意味着 alpha 尚未设置。
谁能告诉我如何使用 IndexColorModel 正确设置 alpha channel ,或者更改 AffineTransformOP 参数,以便获得具有正确 alpha 的 IndexColorModel?
谢谢!!
编辑:
这是所需的效果,使用 AffineTransformOp.TYPE_BINLINEAR
:
这是我使用 AffineTransformOp.TYPE_NEAREST_NEIGHBOR
看到的效果:
整个背景最初被涂成绿色以获得效果,并且在这两种情况下图像都绘制在位置 (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/