/** * Gets the icon that corresponds to a given icon handler. * * @param hIcon * Handler to the icon to get * @return The icon that corresponds to a given icon handler */ public static BufferedImage getIcon(final HICON hIcon) { final int width = ICON_SIZE; final int height = ICON_SIZE; final short depth = ICON_DEPTH; final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); final Memory lpBitsColor = new Memory(width * height * depth / ICON_BYTE_SIZE); final Memory lpBitsMask = new Memory(width * height * depth / ICON_BYTE_SIZE); final BITMAPINFO info = new BITMAPINFO(); final BITMAPINFOHEADER hdr = new BITMAPINFOHEADER(); info.bmiHeader = hdr; hdr.biWidth = width; hdr.biHeight = height; hdr.biPlanes = 1; hdr.biBitCount = depth; hdr.biCompression = WinGDI.BI_RGB; final HDC hDC = User32.INSTANCE.GetDC(null); final ICONINFO piconinfo = new ICONINFO(); User32.INSTANCE.GetIconInfo(hIcon, piconinfo); GDI32.INSTANCE.GetDIBits(hDC, piconinfo.hbmColor, 0, height, lpBitsColor, info, WinGDI.DIB_RGB_COLORS); GDI32.INSTANCE.GetDIBits(hDC, piconinfo.hbmMask, 0, height, lpBitsMask, info, WinGDI.DIB_RGB_COLORS); int r, g, b, a, argb; int x = 0, y = height - 1; for (int i = 0; i < lpBitsColor.size(); i = i + 3) { b = lpBitsColor.getByte(i) & 0xFF; g = lpBitsColor.getByte(i + 1) & 0xFF; r = lpBitsColor.getByte(i + 2) & 0xFF; a = 0xFF - lpBitsMask.getByte(i) & 0xFF; argb = a << 24 | r << 16 | g << 8 | b; image.setRGB(x, y, argb); x = (x + 1) % width; if (x == 0) { y--; } } User32.INSTANCE.ReleaseDC(null, hDC); GDI32.INSTANCE.DeleteObject(piconinfo.hbmColor); GDI32.INSTANCE.DeleteObject(piconinfo.hbmMask); return image; }
public static BufferedImage getImageByHICON(final int width, final int height, final HANDLE hicon, final BITMAPINFOHEADER info) { final IconInfo iconinfo = new org.appwork.jna.winapi.structs.IconInfo(); try { // GDI32 g32 = GDI32.INSTANCE; // get icon information if (!User.I.GetIconInfo(new HICON(hicon.getPointer()), iconinfo)) { return null; } final HWND hwdn = new HWND(); final HDC dc = User32.INSTANCE.GetDC(hwdn); if (dc == null) { return null; } try { final int nBits = width * height * 4; // final BitmapInfo bmi = new BitmapInfo(1); final Memory colorBitsMem = new Memory(nBits); // // Extract the color bitmap final BITMAPINFO bmi = new WinGDI.BITMAPINFO(); bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = -height; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = WinGDI.BI_RGB; GDI32.INSTANCE.GetDIBits(dc, iconinfo.hbmColor, 0, height, colorBitsMem, bmi, WinGDI.DIB_RGB_COLORS); // g32.GetDIBits(dc, iconinfo.hbmColor, 0, size, colorBitsMem, // bmi, // GDI32.DIB_RGB_COLORS); final int[] colorBits = colorBitsMem.getIntArray(0, width * height); if (info.biBitCount < 32) { final Memory maskBitsMem = new Memory(nBits); // // Extract the mask bitmap GDI32.INSTANCE.GetDIBits(dc, iconinfo.hbmMask, 0, height, maskBitsMem, bmi, WinGDI.DIB_PAL_COLORS); // g32.GetDIBits(dc, iconinfo.hbmMask, 0, size, // maskBitsMem, // bmi, // // GDI32.DIB_RGB_COLORS); final int[] maskBits = maskBitsMem.getIntArray(0, width * height); // // // Copy the mask alphas into the color bits for (int i = 0; i < colorBits.length; i++) { colorBits[i] = colorBits[i] | (maskBits[i] != 0 ? 0 : 0xFF000000); } } final BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); bi.setRGB(0, 0, width, height, colorBits, 0, height); return bi; } finally { com.sun.jna.platform.win32.User32.INSTANCE.ReleaseDC(hwdn, dc); } } finally { User32.INSTANCE.DestroyIcon(new HICON(hicon.getPointer())); GDI32.INSTANCE.DeleteObject(iconinfo.hbmColor); GDI32.INSTANCE.DeleteObject(iconinfo.hbmMask); } }
public static BufferedImage getImageByHICON(final int width, final int height, final HANDLE hicon) { final IconInfo iconinfo = new org.appwork.jna.winapi.structs.IconInfo(); try { // GDI32 g32 = GDI32.INSTANCE; // get icon information if (!org.appwork.jna.winapi.user32.User.I.GetIconInfo(new HICON(hicon.getPointer()), iconinfo)) { return null; } final HWND hwdn = new HWND(); final HDC dc = User32.INSTANCE.GetDC(hwdn); if (dc == null) { return null; } try { final int nBits = width * height * 4; // final BitmapInfo bmi = new BitmapInfo(1); final Memory colorBitsMem = new Memory(nBits); // // Extract the color bitmap final BITMAPINFO bmi = new WinGDI.BITMAPINFO(); bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = -height; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = WinGDI.BI_RGB; GDI32.INSTANCE.GetDIBits(dc, iconinfo.hbmColor, 0, height, colorBitsMem, bmi, WinGDI.DIB_RGB_COLORS); // g32.GetDIBits(dc, iconinfo.hbmColor, 0, size, colorBitsMem, // bmi, // GDI32.DIB_RGB_COLORS); final int[] colorBits = colorBitsMem.getIntArray(0, width * height); // final Memory maskBitsMem = new Memory(nBits); // // // Extract the mask bitmap // GDI32.INSTANCE.GetDIBits(dc, iconinfo.hbmMask, 0, height, // maskBitsMem, bmi, WinGDI.DIB_PAL_COLORS); // // g32.GetDIBits(dc, iconinfo.hbmMask, 0, size, maskBitsMem, // bmi, // // GDI32.DIB_RGB_COLORS); // final int[] maskBits = maskBitsMem.getIntArray(0, width * // height); // // // Copy the mask alphas into the color bits // for (int i = 0; i < colorBits.length; i++) { // colorBits[i] = colorBits[i] | (maskBits[i] != 0 ? 0 : // 0xFF000000); // } // // Release DC // Main.u32.ReleaseDC(0, dc); // // // Release bitmap handle in icon info // g32.DeleteObject(iconinfo.hbmColor); // add // g32.DeleteObject(iconinfo.hbmMask); // add final BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); bi.setRGB(0, 0, width, height, colorBits, 0, height); return bi; } finally { com.sun.jna.platform.win32.User32.INSTANCE.ReleaseDC(hwdn, dc); } } finally { User32.INSTANCE.DestroyIcon(new HICON(hicon.getPointer())); GDI32.INSTANCE.DeleteObject(iconinfo.hbmColor); GDI32.INSTANCE.DeleteObject(iconinfo.hbmMask); } }
/** * http://msdn.microsoft.com/en-us/library/ms648070(v=VS.85).aspx * * @param hIcon * @param iconinfo * @return */ boolean GetIconInfo(HICON hIcon, IconInfo iconinfo);
public short ExtractIconEx(String path, int index, HICON[] large, HICON[] small, short nIcons);
HICON CreateIconFromResourceEx(Pointer pIcon, int dwBytesInRes, boolean b, int j, int bWidth, int bHeight, int k);