gpt4 book ai didi

java - 具有半透明/抗锯齿功能的光标

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:59 24 4
gpt4 key购买 nike

我正在尝试使用以下代码创建自定义光标:

BufferedImage cursor = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) cursor.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.drawOval(0, 0, 26, 26);
jframe.getContentPane().setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
cursor, new Point(13, 13), "cursor"));

如果没有抗锯齿,这看起来真的很糟糕,但是一旦我尝试激活抗锯齿,应该是半透明的像素似乎变得完全实心 - 就好像 JFrame 光标不能处理半透明。

我试过从 .png 文件加载 BufferedImage,但结果是一样的。

我不想在我的 Canvas 上手动绘制光标,因为与此方法相比,它有轻微的输入延迟

我想要做的就是有一个可以支持半透明的 Cursor。关于如何实现这一目标的任何想法?

提前致谢。

最佳答案

这个很微妙(我已经被困了好几年了:)但我今天破解了它。

光标似乎只支持打开/关闭透明度,因此先绘制到 TYPE_INT_RGB 图像然后将其复制到 TYPE_INT_ARGB(然后修复透明度)即可。

不确定它是否是最佳的,但对于像这样的小图像来说,这并不重要。

        int size = 32;

/*
* we need two buffered images as the cursor only supports on/off for alpha
*
* so we need to draw to an image without alpha support
* then draw that to one with alpha support
* then make "white" transparent
*/
BufferedImage image = new BufferedImage(size, size,
BufferedImage.TYPE_INT_RGB);
BufferedImage image2 = new BufferedImage(size, size,
BufferedImage.TYPE_INT_ARGB);

Graphics2D g = image.createGraphics();
Graphics2D g2 = image2.createGraphics();

g.setColor(Color.white);
g.fillRect(0, 0, size, size);


// turn on anti-aliasing.
g.setStroke(new BasicStroke(4.0f)); // 4-pixel lines
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(new Color(0.5f, 0f, 0f));
g.drawOval(3, 3, size-7, size-7);

g2.drawImage(image, 0, 0, null, null);


for (int y = 0 ; y < size ; y++) {
for (int x = 0 ; x < size ; x++) {

int rgb = image.getRGB(x, y);

int blue = rgb & 0xff;
int green = (rgb & 0xff00) >> 8;
int red = (rgb & 0xff0000) >> 16;
//int alpha = (rgb & 0xff000000) >> 24;

if (red == 255 && green == 255 && blue == 255) {
// make white transparent
image2.setRGB(x, y, 0);
}

}
}

eraserCursor = Toolkit.getDefaultToolkit().createCustomCursor(
image2, new Point(size / 2, size / 2), "eraserCursor");

关于java - 具有半透明/抗锯齿功能的光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8310346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com