当前位置: 首页 > 面试题库 >

用Java提取光标图像

熊嘉茂
2023-03-14
问题内容

我想知道是否有一种方法可以从Java中的Cursor对象中提取Image对象。

为此,例如:

Image img = extractCursorImage(Cursor.getDefaultCursor());

然后可以在工具栏按钮上进行绘制(这就是我想要的目的)。


问题答案:

将光标类是相当抽象的-
所有重要的东西委托给本机代码,所以你不能只画上一个在图形上下文。尚无立即显而易见的方法来绕过预定义图标或在本机代码中进行操作的需要。

您能帮我使用您提到的功能吗?

以下是一些使用JNA库绘制内置Windows光标的代码。如果可以使用JNA,则可以避免使用C
++编译器。

我可能打了太多本地电话,但是对于一次生成图标来说,花费并不大。

用Java
http://f.imagehost.org/0709/hand.png绘制的手形光标

将光标显示为Java图像的代码:

public class LoadCursor {

  public static void draw(BufferedImage image, int cursor,
      int diFlags) {
    int width = image.getWidth();
    int height = image.getHeight();

    User32 user32 = User32.INSTANCE;
    Gdi32 gdi32 = Gdi32.INSTANCE;

    Pointer hIcon = user32
        .LoadCursorW(Pointer.NULL, cursor);
    Pointer hdc = gdi32.CreateCompatibleDC(Pointer.NULL);
    Pointer bitmap = gdi32.CreateCompatibleBitmap(hdc,
        width, height);

    gdi32.SelectObject(hdc, bitmap);
    user32.DrawIconEx(hdc, 0, 0, hIcon, width, height, 0,
        Pointer.NULL, diFlags);

    for (int x = 0; x < width; x++) {
      for (int y = 0; y < width; y++) {
        int rgb = gdi32.GetPixel(hdc, x, y);
        image.setRGB(x, y, rgb);
      }
    }

    gdi32.DeleteObject(bitmap);
    gdi32.DeleteDC(hdc);
  }

  public static void main(String[] args) {
    final int width = 128;
    final int height = 128;

    BufferedImage image = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_ARGB);
    draw(image, User32.IDC_HAND, User32.DI_NORMAL);
    BufferedImage mask = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_RGB);
    draw(mask, User32.IDC_HAND, User32.DI_MASK);
    applyMask(image, mask);

    JLabel icon = new JLabel();
    icon.setIcon(new ImageIcon(image));

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(icon);
    frame.pack();
    frame.setVisible(true);
  }

  private static void applyMask(BufferedImage image,
      BufferedImage mask) {
    int width = image.getWidth();
    int height = image.getHeight();
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        int masked = mask.getRGB(x, y);
        if ((masked & 0x00FFFFFF) == 0) {
          int rgb = image.getRGB(x, y);
          rgb = 0xFF000000 | rgb;
          image.setRGB(x, y, rgb);
        }
      }
    }
  }

}

User32.dll接口:

public interface User32 extends Library {

  public static User32 INSTANCE = (User32) Native
      .loadLibrary("User32", User32.class);

  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_ARROW = 32512;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_IBEAM = 32513;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_WAIT = 32514;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_CROSS = 32515;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_UPARROW = 32516;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZENWSE = 32642;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZENESW = 32643;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZEWE = 32644;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZENS = 32645;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZEALL = 32646;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_NO = 32648;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_HAND = 32649;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_APPSTARTING = 32650;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_HELP = 32651;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_ICON = 32641;
  /** @see #LoadCursorW(Pointer, int) */
  public static final int IDC_SIZE = 32640;

  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_COMPAT = 4;
  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_DEFAULTSIZE = 8;
  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_IMAGE = 2;
  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_MASK = 1;
  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_NORMAL = 3;
  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
  public static final int DI_APPBANDING = 1;

  /** http://msdn.microsoft.com/en-us/library/ms648391(VS.85).aspx */
  public Pointer LoadCursorW(Pointer hInstance,
      int lpCursorName);

  /** http://msdn.microsoft.com/en-us/library/ms648065(VS.85).aspx */
  public boolean DrawIconEx(Pointer hdc, int xLeft,
      int yTop, Pointer hIcon, int cxWidth, int cyWidth,
      int istepIfAniCur, Pointer hbrFlickerFreeDraw,
      int diFlags);

}

Gdi32.dll接口:

public interface Gdi32 extends Library {

  public static Gdi32 INSTANCE = (Gdi32) Native
      .loadLibrary("Gdi32", Gdi32.class);

  /** http://msdn.microsoft.com/en-us/library/dd183489(VS.85).aspx */
  public Pointer CreateCompatibleDC(Pointer hdc);

  /** http://msdn.microsoft.com/en-us/library/dd183488(VS.85).aspx */
  public Pointer CreateCompatibleBitmap(Pointer hdc,
      int nWidth, int nHeight);

  /** http://msdn.microsoft.com/en-us/library/dd162957(VS.85).aspx */
  public Pointer SelectObject(Pointer hdc, Pointer hgdiobj);

  /** http://msdn.microsoft.com/en-us/library/dd145078(VS.85).aspx */
  public int SetPixel(Pointer hdc, int X, int Y, int crColor);

  /** http://msdn.microsoft.com/en-us/library/dd144909(VS.85).aspx */
  public int GetPixel(Pointer hdc, int nXPos, int nYPos);

  /** http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx */
  public boolean DeleteObject(Pointer hObject);

  /** http://msdn.microsoft.com/en-us/library/dd183533(VS.85).aspx */
  public boolean DeleteDC(Pointer hdc);

}


 类似资料:
  • 有可能吗?如果是,那么它可以怎么做。

  • 问题内容: 当用户将鼠标悬停在可以单击以获取上下文相关帮助的对象上时,我想通过用问号“标记”内置默认鼠标光标来创建自定义帮助光标。我希望它可以跨平台/外观很好地工作(例如,看起来与白色的Windows鼠标和黑色的Mac鼠标一致。)是否有办法从当前工具包中获取光标图像,以便我可以生成一个组合图像设置为光标吗? 这个问题指出,无法从Cursor对象获取信息。那里还有一条评论建议在JRE中钓鱼,我也尝试

  • 问题内容: 我有许多heroshot图像,单击它们时会弹出模式弹出窗口。我试图使光标在图像上移动时变成放大镜。即使我的位置正确,以下CSS也似乎无法正常工作。 有没有人做过类似的事情?我不介意一个JavaScript解决方案(如果存在)。 编辑 :它可以在Safari中,但不能在Firefox中使用。 问题答案: 您的问题可能是光标URL在Mac的Firefox中不起作用。 通过使用关键字,可以在

  • 如果你标记了一个新名字并删除了原来的名字,docker是否可以从一个私有存储库中拉取? 例如, 这篇相关的帖子展示了如何更改docker映像名称,但没有说明从Harbor或私人回购中提取的内容:docker如何更改存储库名称或重命名映像?

  • 光标组件允许我们通过点击和凝视与实体交互。光标组件被用于 光线投射(raycaster)来实现: 监听鼠标点击事件和基于凝视的行为。 仅捕获第一个相交实体。 发出特殊的鼠标和悬停事件(例如,与鼠标向下/向上/进入/离开相关)。 有更多的悬停状态。 当鼠标单击时,与光标相交的最近可见实体(如果有)将发出 单击事件。注意光标组件只是应用了光线投射行为。要为光标提供形状或外观,可以应用 geometry

  • 问题内容: 我正在尝试构建一个程序,该程序检测鼠标光标下的颜色,然后在屏幕上的窗口中显示颜色和RGB值。我对Java非常陌生,所以什么都不知道。在朋友的帮助下,我已经编写了两个代码,第一个代码获取缓冲图像的特定坐标的RGB值,另一个代码获取用户定义的RGB值并显示其中带有颜色的窗格。我的问题是“无论滚动到什么位置,如何获取程序来检测鼠标光标下的颜色? 问题答案: 正如@Hovercraft指出的那