热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Java利用AlphaComposite类合并图像

这篇文章主要介绍了Java利用AlphaComposite类合并图像,帮助大家更好的利用Java处理图像,感兴趣的朋友可以了解下
package com.hdwang.test;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
 * Created by hdwang on 2018/10/11.
 */
public class TestDrawing {

  public static void main(String[] args) {
    testComposite();
  }

  /**
   * 合成测试
   */
  public static void testComposite() {
    //创建背景图片(带透明分量的)
    BufferedImage bg = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
    Graphics2D bgGraphics = (Graphics2D) bg.getGraphics();
    bgGraphics.setColor(Color.yellow); //设置颜色
    bgGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //边缘抗锯齿
    bgGraphics.fillRect(0, 0, bg.getWidth(), bg.getHeight()); //填充矩形
    bgGraphics.setColor(Color.BLACK);
    bgGraphics.setFont(new Font("楷体", Font.ITALIC, 50));
    bgGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); //文本抗锯齿
    bgGraphics.drawString("背景黄色", 50, 150); //画文本
    bgGraphics.dispose();

    //创建第二张图片
    BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
    Graphics2D imageGraphics = (Graphics2D) image.getGraphics();
    imageGraphics.setColor(Color.GREEN);
    imageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    imageGraphics.fillRoundRect(0, 0, image.getWidth(), image.getHeight(), image.getWidth(), image.getHeight());
    imageGraphics.setColor(Color.BLACK);
    imageGraphics.setFont(new Font("楷体", Font.ITALIC, 50));
    imageGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    imageGraphics.drawString("前景绿色", 50, 200);
    imageGraphics.dispose();

    JFrame jf = new JFrame(); //窗体
    JPanel cOntentPanel= new JPanel(); //内容面板
    contentPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); //设置边框
    //contentPanel.setLayout(new BorderLayout());

    //添加标签
    JLabel label = new JLabel();
    label.setText("组合模式:");
    contentPanel.add(label);

    //添加下拉框
    JComboBox comboBox = new JComboBox();
    comboBox.addItem("默认");
    comboBox.addItem("CLEAR");
    comboBox.addItem("SRC");
    comboBox.addItem("DST");
    comboBox.addItem("SRC_OVER");
    comboBox.addItem("DST_OVER");
    comboBox.addItem("SRC_IN");
    comboBox.addItem("DST_IN");
    comboBox.addItem("SRC_OUT");
    comboBox.addItem("DST_OUT");
    comboBox.addItem("SRC_ATOP");
    comboBox.addItem("DST_ATOP");
    comboBox.addItem("XOR");
    contentPanel.add(comboBox);

    JLabel label2 = new JLabel();
    label2.setText("源图非透明度:");
    contentPanel.add(label2);

    //添加滑动条([0-10]=>[0,0.1,0.2,.... 1.0])
    JSlider jSlider = new JSlider(0,10,10);
    jSlider.setMajorTickSpacing(5); // 设置主刻度间隔
    jSlider.setMinorTickSpacing(1); // 设置次刻度间隔
    jSlider.setPaintTicks(true); // 绘制刻度
    jSlider.setPaintLabels(true); // 绘制标签
    jSlider.setSnapToTicks(true); // 对其到刻度取值
     /*
     * 给指定的刻度值显示自定义标签
     */
    Hashtable hashtable = new Hashtable();
    hashtable.put(0, new JLabel("0"));   // 0 刻度位置,显示 "0"
    hashtable.put(5, new JLabel("0.5"));  // 5 刻度位置,显示 "0.5"
    hashtable.put(10, new JLabel("1"));    // 10 刻度位置,显示 "1"
    jSlider.setLabelTable(hashtable); //将刻度值和自定义标签的对应关系设置到滑块(设置后不再显示默认的刻度值)

    contentPanel.add(jSlider);


    jf.setContentPane(contentPanel); //窗体设置内容面板为jp
    jf.setBounds(200, 200, 500, 500);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true); //窗体可见


    DrawingPanel drawPanel = new DrawingPanel();
    drawPanel.setBounds(0,60,500,415);
    drawPanel.setPreferredSize(new Dimension(500,415));
    drawPanel.setBorder(BorderFactory.createLineBorder(Color.red)); //设置边框
    drawPanel.setBg(bg);
    drawPanel.setImage(image);
    // drawPanel.setAlphaComposite(AlphaComposite.SrcAtop);
    contentPanel.add(drawPanel);

    Map compositeMap = new HashMap<>();
    compositeMap.put("CLEAR",AlphaComposite.Clear);
    compositeMap.put("SRC",AlphaComposite.Src);
    compositeMap.put("DST",AlphaComposite.Dst);
    compositeMap.put("SRC_OVER",AlphaComposite.SrcOver);
    compositeMap.put("DST_OVER",AlphaComposite.DstOver);
    compositeMap.put("SRC_IN",AlphaComposite.SrcIn);
    compositeMap.put("DST_IN",AlphaComposite.DstIn);
    compositeMap.put("SRC_OUT",AlphaComposite.SrcOut);
    compositeMap.put("DST_OUT",AlphaComposite.DstOut);
    compositeMap.put("SRC_ATOP",AlphaComposite.SrcAtop);
    compositeMap.put("DST_ATOP",AlphaComposite.DstAtop);
    compositeMap.put("XOR",AlphaComposite.Xor);
    //下拉框选中事件
    comboBox.addItemListener(new ItemListener() {
      @Override
      public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED){
          String selected = e.getItem().toString();
          System.out.println(selected);
          drawPanel.setAlphaComposite(compositeMap.get(selected));
          drawPanel.repaint(); //重画
        }
      }
    });

    //滑动条改变事件
    jSlider.addChangeListener(new ChangeListener() {
      @Override
      public void stateChanged(ChangeEvent e) {
        int val = jSlider.getValue();
        float alpha = (float) (val / 10.0);
        System.out.println("alpha:"+alpha);
        drawPanel.setAlpha(alpha);
        drawPanel.repaint(); //重画
      }
    });

    //窗体改变事件
    jf.addWindowStateListener(new WindowStateListener() {

      @Override
      public void windowStateChanged(WindowEvent e) {
        System.out.println("window state:"+e.paramString());
      }
    });
  }


  static class DrawingPanel extends JPanel{

    BufferedImage bg;
    BufferedImage image;
    AlphaComposite alphaComposite;
    float alpha = 1.0f; //源图非透明度(新加的图)

    public BufferedImage getBg() {
      return bg;
    }

    public void setBg(BufferedImage bg) {
      this.bg = bg;
    }

    public BufferedImage getImage() {
      return image;
    }

    public void setImage(BufferedImage image) {
      this.image = image;
    }

    public AlphaComposite getAlphaComposite() {
      return alphaComposite;
    }

    public void setAlphaComposite(AlphaComposite alphaComposite) {
      this.alphaComposite = alphaComposite;
    }

    public float getAlpha() {
      return alpha;
    }

    public void setAlpha(float alpha) {
      this.alpha = alpha;
    }

    /**
     * 重写paint方法
     * @param g
     */
    @Override
    public void paint(Graphics g){
      //调用的super.paint(g),让父类做一些事前的工作,如刷新屏幕
      super.paint(g);

      //在面板上画画
      Graphics2D g2d = (Graphics2D)g;
      g2d.setComposite(AlphaComposite.Src);
      g2d.drawImage(bg,100,100,null); //背景图
      if(alphaComposite!=null) {
        g2d.setComposite(alphaComposite.derive(alpha));
      }else{
        //默认SrcOver
        g2d.setComposite(AlphaComposite.SrcOver.derive(alpha));
      }
      g2d.drawImage(image,100,100,null); //叠加图

      //g2d.setColor(Color.GREEN);
      //g2d.fillRoundRect(100,100,image.getWidth(),image.getHeight(),image.getWidth(),image.getHeight()); //叠加图层
      g2d.dispose();
    }
  }
}

以上就是Java利用AlphaComposite类合并图像的详细内容,更多关于Java 合并图像的资料请关注其它相关文章!


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • win10系统搭建Java开发环境的操作方法
    本文介绍了win10系统搭建Java开发环境的详细操作方法,包括下载Windows10系统和Java SE,安装Java开发环境,设置变量等步骤。操作简单,只需按照指导进行即可。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
author-avatar
昔日重来r_510
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有