用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上下文中绘制一个.没有一种直接明显的方法来满足预定义图标或在本机代码中执行此操作的需要.
下面是使用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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何修复CrudRepository.save(java.lang.Object)是springbo
- Hibernate close方法:关闭SessionFactory对象
- java – org.testng.TestNGException尝试访问PoolingHttpCl
- java – Hibernate批量删除vs单删除
- 详解Java多态对象的类型转换与动态绑定
- 如何将两个Java序列化对象链接在一起?
- java – Eclipse RCP产品中的自定义config.ini
- java – 使JInternalFrame不动
- Struts2实现文件上传功能实例解析
- Java的带GUI界面猜数字游戏的实现示例