1 import com.sun.awt.AWTUtilities;
2 import java.awt.Image;
3 import java.awt.MediaTracker;
4 import java.awt.Point;
5 import java.awt.Rectangle;
6 import java.awt.Shape;
7 import java.awt.Toolkit;
8 import java.awt.event.MouseAdapter;
9 import java.awt.event.MouseEvent;
10 import java.awt.event.MouseMotionAdapter;
11 import java.awt.geom.Area;
12 import java.awt.image.PixelGrabber;
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import javax.swing.*;
16 /**
17 *
18 * @author 19 */
20 public class CreateShape {
21 private Image img;
22 private JFrame jf;
23 private Point origin;
24 public CreateShape( JFrame jf) throws InterruptedException, IOException {
25 this.jf = jf;
26 MediaTracker mt = new MediaTracker(jf);
27 //获取指定图片
28 img = new ImageIcon("src/main/images/bg.png").getImage();
29 mt.addImage(img, 0);
30 //等待就绪
31 mt.waitForAll();
32 initialize(); //窗体初始化
33 }
34 private void initialize() throws IOException {
35 //设定窗体大小和图片一样大
36 jf.setSize(img.getWidth(null), img.getHeight(null));
37 //设定禁用窗体装饰,这样就取消了默认的窗体结构
38 jf.setUndecorated(true);
39 //初始化用于移动窗体的原点
40 origin = new Point();
41 //调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
42 AWTUtilities.setWindowShape(jf, getImageShape(img));
43 //设定窗体可见度
44 AWTUtilities.setWindowOpacity(jf, 0.9f);
45 jf.setLocationRelativeTo(null);
46 }
47
48 public Shape getImageShape(Image img) {
49 ArrayList<Integer> x = new ArrayList<Integer>();
50 ArrayList<Integer> y = new ArrayList<Integer>();
51 int width = img.getWidth(null);//图像宽度
52 int height = img.getHeight(null);//图像高度
53 //筛选像素
54 //首先获取图像所有的像素信息
55 PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
56 try {
57 pgr.grabPixels();
58 } catch (InterruptedException ex) {
59 ex.getStackTrace();
60 }
61 int pixels[] = (int[]) pgr.getPixels();
62 for (int i = 0; i < pixels.length; i++) {
63 //筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
64 int alpha = getAlpha(pixels[i]);
65 if (alpha == 0) {
66 continue;
67 } else {
68 x.add(i % width > 0 ? i % width - 1 : 0);
69 y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width);
70 }
71 }
72 int[][] matrix = new int[height][width];
73 for (int i = 0; i < height; i++) {
74 for (int j = 0; j < width; j++) {
75 matrix[i][j] = 0;
76 }
77 }
78 //导入坐标ArrayList中的不透明坐标信息
79 for (int c = 0; c < x.size(); c++) {
80 matrix[y.get(c)][x.get(c)] = 1;
81 }
82 Area rec = new Area();
83 int temp = 0;
84 for (int i = 0; i < height; i++) {
85 for (int j = 0; j < width; j++) {
86 if (matrix[i][j] == 1) {
87 if (temp == 0) {
88 temp = j;
89 } else if (j == width) {
90 if (temp == 0) {
91 Rectangle rectemp = new Rectangle(j, i, 1, 1);
92 rec.add(new Area(rectemp));
93 } else {
94 Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
95 rec.add(new Area(rectemp));
96 temp = 0;
97 }
98 }
99 } else {
100 if (temp != 0) {
101 Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
102 rec.add(new Area(rectemp));
103 temp = 0;
104 }
105 }
106 }
107 temp = 0;
108 }
109 return rec;
110 }
111 private int getAlpha(int pixel) {
112 return (pixel >> 24) & 0xff;
113 }
114 public static void main(String[] args) {
115 try {
116 JFrame jf = new JFrame();
117 CreateShape c = new CreateShape(jf);
118 jf.setVisible(true);
119 } catch (InterruptedException e) {
120 e.printStackTrace();
121 } catch (IOException e) {
122 e.printStackTrace();
123 }
124 }
125 }
126