首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >半透明/反混叠光标

半透明/反混叠光标
EN

Stack Overflow用户
提问于 2011-11-29 12:00:42
回答 2查看 822关注 0票数 3

我试图用以下代码创建一个自定义游标:

代码语言:javascript
复制
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光标无法处理半透明。

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

我不想手动在画布上绘制光标,因为与此方法相比,它的输入滞后很小。

我想做的就是有一个光标可以支持半透明。知道我怎么能做到这一点吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-07-11 13:20:21

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

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

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

代码语言:javascript
复制
        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");
票数 1
EN

Stack Overflow用户

发布于 2011-11-29 13:34:49

在我的代码中,为了实现半透明的图像,我使用以下代码片段:

代码语言:javascript
复制
g.setComposite(AlphaComposite.SrcOver.derive(0.8f));
g.drawImage(image, 0, 0, null);
g.setComposite(AlphaComposite.SrcOver);

看看它是否对你有用..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8310346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档