• Swing 根据图片设置不规则窗体


      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  
  • 相关阅读:
    Linux内核TSS的使用
    DPL, CPL及RPL之间的关系
    Linux内存管理(深入理解Linux内核)
    Windows下安装PIL进行图像处理
    内存Zone中的pageset成员分析
    导出符号的意义
    GDI及Windows的消息机制
    kmalloc vs vmalloc
    Linux Kernel Development有关内存管理
    STL sort
  • 原文地址:https://www.cnblogs.com/aloneblog/p/9644317.html
Copyright © 2020-2023  润新知