public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); // Determine if the image has transparent pixels boolean hasAlpha = hasAlpha(image); // Create a buffered image using the default color model int type = hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB; BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; }
/** * This method should take BufferedImage argument, but takes just Image for backward compatibility (so that the * client code can stay intact). Normally anyway a BufferedImage instance will be provided and the image will be * directly processed without transforming it to BufferedImage first. * * @param imageToScale image to scale (BufferedImage is welcome, other image types will be transformed to * BufferedImage first) * @param newDimensions desired max. dimensions * @return scaled image */ public BufferedImage scaleImage(Image imageToScale, ThumbnailDimension newDimensions) { final BufferedImage sourceImage = Pictures.toBufferedImage(imageToScale); final Image scaledInstance = sourceImage.getScaledInstance(newDimensions.getWidth(), newDimensions.getHeight(), Image.SCALE_SMOOTH); final BufferedImage bufferedScaledImage = new BufferedImage(newDimensions.getWidth(), newDimensions.getHeight(), Pictures.hasAlpha(imageToScale) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB); final Graphics graphics = bufferedScaledImage.getGraphics(); try { graphics.drawImage(scaledInstance, 0, 0, null); } finally { graphics.dispose(); } return bufferedScaledImage; }