zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    《SQL初学者指南》——第1章 关系型数据库和SQL
    《SQL初学者指南》——第1章 关系型数据库和SQL
    快讯:Oracle自治事务处理数据库发布和19c路线图
    NoReverseMatch: u'polls' is not a registered namespace
    Tomcat配置图片保存路径,图片不保存在项目路径下
    请慎用java的File#renameTo(File)方法
    sentinel monitor mymaster 10.10.17.200 6379 1 1个哨兵同意就切换
    静默错误:Oracle 数据库是如何应对和处理的 ?
    如何对Node.js默认下载路径进行修改
    “我卖一个群可以赚2万,但这个项目,死了!”
  • 原文地址:https://www.cnblogs.com/aloneblog/p/9644317.html
Copyright © 2011-2022 走看看