The main idea is to apply a mask AlphaCompositeto the original image that was filled withLinearGradientPaint
So, we start by loading the original image ...
BufferedImage original = ImageIO.read(new File("/an/image/somewhere"));
Then we create a masking image of the same size ...
BufferedImage alphaMask = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_ARGB);
Then we fill in the masking image with LinearGradientPaint...
Graphics2D g2d = alphaMask.createGraphics();
LinearGradientPaint lgp = new LinearGradientPaint(
new Point(0, 0),
new Point(alphaMask.getWidth(), 0),
new float[]{0, 1},
new Color[]{new Color(0, 0, 0, 255), new Color(0, 0, 0 , 0)});
g2d.setPaint(lgp);
g2d.fillRect(0, 0, alphaMask.getWidth(), alphaMask.getHeight());
g2d.dispose();
What is important here, we do not really care about physical color, only its alpha property, as this will determine how both images are masked together ...
Then we apply the mask ...
BufferedImage faded = applyMask(original, alphaMask, AlphaComposite.DST_IN);
What actually calls this utility method ...
public static BufferedImage applyMask(BufferedImage sourceImage, BufferedImage maskImage, int method) {
BufferedImage maskedImage = null;
if (sourceImage != null) {
int width = maskImage.getWidth();
int height = maskImage.getHeight();
maskedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D mg = maskedImage.createGraphics();
int x = (width - sourceImage.getWidth()) / 2;
int y = (height - sourceImage.getHeight()) / 2;
mg.drawImage(sourceImage, x, y, null);
mg.setComposite(AlphaComposite.getInstance(method));
mg.drawImage(maskImage, 0, 0, null);
mg.dispose();
}
return maskedImage;
}
" " AlphaComposite , ...
( , )

RED
