`
longhua2003
  • 浏览: 13839 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java图片透明-很有意思

    博客分类:
  • Java
阅读更多
   先声明一下,以下的代码不是我本人写的,我只是在这个基础上小修了一把:
package com.dlh;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Area;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JFrame;

//import com.sun.awt.AWTUtilities;
import com.sun.jna.platform.*;
import com.sun.jna.win32.*;


public class IrregularFormSample extends JFrame {

  private static final long serialVersionUID = 1L;
  private Point origin;
  private Image img;

  public IrregularFormSample() {
    super();
    MediaTracker mt=new MediaTracker(this); //dog.png,Image0.jpg
    img=Toolkit.getDefaultToolkit().createImage("image//dog.png");
    mt.addImage(img, 0);
    try {
      mt.waitForAll();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
   
    try {
      initialize();
    } catch (IOException e) {
      e.printStackTrace();
    }   
  }

 
  private void initialize() throws IOException {
    this.setSize(img.getWidth(null), img.getHeight(null));
    this.setUndecorated(true);
    this.origin=new Point();
   

    WindowUtils.setWindowMask(this, getImageShape(img));
    //AWTUtilities.setWindowShape (this, getImageShape(img));
    //AWTUtilities.setWindowOpacity(this, 0.8f);
   
    this.setLocationRelativeTo(null);
    addMouseListener(
        new MouseAdapter(){
          public void mousePressed(MouseEvent e){
            origin.x = e.getX();
            origin.y = e.getY();
          }
         
          public void mouseClicked(MouseEvent e) {
            if(e.getButton()==MouseEvent.BUTTON3)
              System.exit(0);
          }
          public void mouseReleased(MouseEvent e) {
            super.mouseReleased(e);
          }
          @Override
          public void mouseEntered(MouseEvent e) {
            repaint();             
          }           
        }
    );

    addMouseMotionListener(
        new MouseMotionAdapter(){
          public void mouseDragged(MouseEvent e){
            Point p =    getLocation();
            setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y );
          }         
        }
    );   
  }

 

  public Shape getImageShape(Image img) {
    ArrayList<Integer> x=new ArrayList<Integer>();
    ArrayList<Integer> y=new ArrayList<Integer>();   
    int width=img.getWidth(null);
    int height=img.getHeight(null);


    PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
    try {
      pgr.grabPixels();
    } catch (InterruptedException ex) {
      ex.getStackTrace();
    }
    int pixels[] = (int[]) pgr.getPixels();
   

    for (int i = 0; i < pixels.length; i++) {
    
      int alpha = getAlpha(pixels[i]);
      if (alpha == 0){
        continue;       
      }else{
        x.add(i%width>0 ? i%width-1:0);
        y.add(i%width==0 ? (i==0 ? 0:i/width-1):i/width);
      }     
    }
   
  
    int[][] matrix=new int[height][width];   
    for(int i=0;i<height;i++){
      for(int j=0;j<width;j++){
        matrix[i][j]=0;
      }
    }
   
 
    for(int c=0;c<x.size();c++){
      matrix[y.get(c)][x.get(c)]=1;
    }
   

    Area rec=new Area();
    int temp=0;
   
    for(int i=0;i<height;i++){
      for(int j=0;j<width;j++){
        if(matrix[i][j]==1){
          if(temp==0)
            temp=j; 
          else if(j==width){
            if(temp==0){
              Rectangle rectemp=new Rectangle(j,i,1,1);
              rec.add(new Area(rectemp));
            }else{
              Rectangle rectemp=new Rectangle(temp,i,j-temp,1);
              rec.add(new Area(rectemp));
              temp=0;
            }
          }
        }else{
          if(temp!=0){
            Rectangle rectemp=new Rectangle(temp,i,j-temp,1);
            rec.add(new Area(rectemp));
            temp=0;
          }
        }
      }
      temp=0;
    }
    return rec;
  }

 
  private int getAlpha(int pixel) {
    return (pixel >> 24) & 0xff;
  }
 
 

  @Override
  public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(img, 0, 0, null);
  }
 
  public static void main(String[] args) {
        IrregularFormSample sample = new IrregularFormSample();
        sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sample.setVisible(true);
  } 
}

要引入附件两个包,这个就可以跨平台了(我也只是听说,你可以验证一下),如果用jdk中com.sun.awt.AWTUtilities,在linux下是不行的。

看一下,这个狗有趣吧



  • 大小: 182.3 KB
  • 大小: 171.6 KB
分享到:
评论

相关推荐

    Java开发案例-springboot-57-metadata-extractor读取图片信息-源代码+文档.rar

    Java开发案例-springboot-57-metadata-extractor读取图片信息-源代码+文档.rar Java开发案例-springboot-57-metadata-extractor读取图片信息-源代码+文档.rar Java开发案例-springboot-57-metadata-extractor读取...

    java图片处理工具类JAR包 java-image-scalingjar

    java图片处理工具类JAR包 java-image-scalingjar

    mysql驱动包mysql-connector-java-5.1.7-bin.jar

    mysql-connector-java-5.1.7-bin.jar

    mysql-connector-java-5.1.40-bin.jar连接器

    在这个特定的版本——mysql-connector-java-5.1.40-bin.jar中,我们找到了这个连接器的5.1系列的一个稳定版本。 首先,让我们了解JDBC的作用。JDBC是Sun Microsystems(现为Oracle公司)为Java编程语言设计的一套...

    ckeditor-java-core-3.5.3

    此版本是"ckeditor-java-core-3.5.3",专门针对Java平台进行了优化,允许开发者在Java应用程序中集成CKEditor的功能。 1. **CKEditor简介** CKEditor是一款基于JavaScript的WYSIWYG(所见即所得)文本编辑器,最初...

    mysql-connector-java-5.1.45-bin.jar

    这个"mysql-connector-java-5.1.45-bin.jar"文件是该驱动的一个特定版本,即5.1.45版。这个版本是纯净且正版的,适合于Java开发者在他们的项目中直接集成使用。 在Java编程中,为了连接到MySQL数据库,我们需要一个...

    mysql-connector-java-gpl-5.1.36

    "mysql-connector-java-gpl-5.1.36"是MySQL Connector/J的一个特定版本,发布于GPL(GNU General Public License)许可下,意味着它是开源且可自由分发的。 MySQL Connector/J 5.1.36是针对MySQL 5.1系列数据库...

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。

    aliyun-java-sdk-dysmsapi-1.0.0

    最新下载的 阿里云短信服务器所需jar包之一,... &lt;artifactId&gt;aliyun-java-sdk-core &lt;version&gt;3.2.2 如此引用即可,更多关于阿里云短信发送相关请参考http://blog.csdn.net/niaoer2010/article/details/78036664

    mysql-connector-java-5.1.15-bin.jar

    "mysql-connector-java-5.1.15-bin.jar"是这个驱动程序的一个特定版本,版本号为5.1.15。 在Java编程环境中,当你需要连接到MySQL数据库时,你需要在类路径中包含这个JAR文件。JDBC驱动程序主要分为四种类型:Type ...

    aliyun-java-sdk-core包和alicom-dysms-api包

    SDK工具包中一共包含了2个类库,一个aliyun-java-sdk-core包,另外一个是alicom-dysms-api包

    mysql链接数据库jar驱动包(mysql-connector-java-5.0.4-bin.jar)

    用于连接mysql数据库. mysql-connector-java-5.0.4-bin.jar

    eclipse-java-indigo-SR2-win32

    "eclipse-java-indigo-SR2-win32" 版本是针对Windows 32位系统的Eclipse IDE的一个特定构建,它属于Eclipse Indigo Service Release 2(SR2)。Indigo是Eclipse的第3.7版本,发布于2011年,它带来了许多新特性和改进...

    java解压rar 包含java-unrar-0.3.jar

    `java-unrar-0.3.jar`是一个库,它允许Java开发者处理RAR文件,无需依赖外部命令行工具,如WinRAR。这个库为Java提供了一个简单易用的API,可以方便地实现RAR文件的解压功能。 `java-unrar-0.3.jar`库是由Andrei ...

    java 写的游戏 很有意思

    在这个"java 写的游戏 很有意思"的项目中,我们可以看到一个游戏爱好者利用Java编程语言创作出的一款有趣的游戏。对于想要学习游戏开发或者提升Java技能的人来说,这是一个很好的参考资源。 Java作为一种面向对象的...

    mysql-connector-java-5.1.31-bin

    mysql-connector-java-5.1.31-bin

    mariadb-java-client-1.1.7.jar

    mariadb-java-client-1.1.7.jar

    java基础教程----精华版

    Java是一种广泛使用的面向对象的编程语言,以其平台独立性、安全性、健壮性和高性能而闻名。这个"java基础教程----精华版"显然是一份精心整理的资料,旨在帮助初学者快速掌握Java编程的基础知识。下面将详细介绍Java...

    很棒的毕业设计、课程设计、练手的java项目-仓库商品管理系统(文档+视频+源码).rar

    很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库...

    java指纹识别-图片识别技术

    在这个名为"java指纹识别-图片识别技术"的项目工程中,开发者可能利用Java语言实现了指纹图像的处理和比对功能。下面将详细阐述这两个技术以及它们在Java环境中的应用。 首先,我们来看指纹识别技术。指纹是人类...

Global site tag (gtag.js) - Google Analytics