加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

用Java提取光标图像

发布时间:2020-12-15 03:00:57 所属栏目:Java 来源:网络整理
导读:我想知道是否有办法从 Java中的Cursor对象中提取Image对象. 例如:用于此目的: Image img = extractCursorImage(Cursor.getDefaultCursor()); 然后,您可以在工具栏按钮上绘制(这是我想要的目的). 解决方法 Cursor类非常抽象 – 所有重要的东西都被委托给本
我想知道是否有办法从 Java中的Cursor对象中提取Image对象.

例如:用于此目的:

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

然后,您可以在工具栏按钮上绘制(这是我想要的目的).

解决方法

Cursor类非常抽象 – 所有重要的东西都被委托给本机代码,所以你不能只在 graphics上下文中绘制一个.没有一种直接明显的方法来满足预定义图标或在本机代码中执行此操作的需要.

could you help me use that function you mentioned?

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

我可能会拨打太多原生电话,但是对于一次性图标生成而言,成本并不高.

hand cursor drawn in 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,hIcon,height,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,BufferedImage.TYPE_INT_ARGB);
    draw(image,User32.IDC_HAND,User32.DI_NORMAL);
    BufferedImage mask = new BufferedImage(width,BufferedImage.TYPE_INT_RGB);
    draw(mask,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,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,Pointer,int) */
  public static final int DI_COMPAT = 4;
  /** @see #DrawIconEx(Pointer,int) */
  public static final int DI_DEFAULTSIZE = 8;
  /** @see #DrawIconEx(Pointer,int) */
  public static final int DI_IMAGE = 2;
  /** @see #DrawIconEx(Pointer,int) */
  public static final int DI_MASK = 1;
  /** @see #DrawIconEx(Pointer,int) */
  public static final int DI_NORMAL = 3;
  /** @see #DrawIconEx(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);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读