1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class TestImage {
private static final int SIZE = 400;
private static final Color COLOR = new Color(241,207,14);
private static final Color TRANSPARENT_COLOR = new Color(241,207,14, 127);
private static final Color INVISIBLE_COLOR = new Color(241,207,14, 0);
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.setUndecorated(true);
frame.setBackground(new Color(0,0,0,0));
final JLabel label = new JLabel(new ImageIcon(createImage()));
label.setBackground(Color.BLACK);
label.setOpaque(true); // ligne à commenter pour le second test
frame.add(label);
frame.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
frame.dispose();
}
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static Image createImage() {
final BufferedImage image = new BufferedImage(SIZE*2, SIZE*2, BufferedImage.TYPE_INT_ARGB);
final Graphics2D graphics2d = image.createGraphics();
final Shape smiley = createSmiley();
try {
graphics2d.setColor(COLOR);
graphics2d.fill(smiley);
graphics2d.setColor(TRANSPARENT_COLOR);
graphics2d.translate(SIZE, 0);
graphics2d.fill(smiley);
graphics2d.translate(-SIZE, SIZE);
graphics2d.setColor(COLOR);
graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f));
graphics2d.fill(smiley);
graphics2d.translate(SIZE, 0);
graphics2d.setPaint(new GradientPaint(new Point(0,0), INVISIBLE_COLOR, new Point(SIZE+SIZE/2,0), COLOR));
graphics2d.fill(smiley);
}
finally {
graphics2d.dispose();
}
return image;
}
private static Shape createSmiley() {
final Area area = new Area(new Ellipse2D.Double(0, 0, SIZE, SIZE));
final double y = SIZE/4d;
{
final double w=SIZE/5d;
final double x = y - w/2;
area.subtract(new Area(new Ellipse2D.Double(x,y,w,w)));
}
{
final double w=SIZE/5d;
final double x = SIZE - y - w/2;
area.subtract(new Area(new Ellipse2D.Double(x,y,w,w)));
}
{
final Area smile = new Area(new Ellipse2D.Double(y/2, 0, SIZE-y, SIZE-y));
smile.subtract(new Area(new Ellipse2D.Double(y/4,-y/6, SIZE-y/2, SIZE-y)));
area.subtract(smile.createTransformedArea(AffineTransform.getTranslateInstance(0, 2*y/3)));
}
return area;
}
} |