java绘图合并图像AlphaComposite模式测试
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<Integer, JComponent> hashtable = new Hashtable<Integer, JComponent>();
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<String,AlphaComposite> 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语言实现事件委托模式
http://blog.csdn.net/yanshujun/article/details/6494447 用java语言实现事件委托模式 2010-04-27 00:04 2206人阅读 评论(1 ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java的三种代理模式
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- Java设计模式之《外观模式》及应用场景
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
随机推荐
- 20155302《网络对抗》Exp4 恶意代码分析
20155302<网络对抗>Exp4 恶意代码分析 实验要求 •是监控你自己系统的运行状态,看有没有可疑的程序在运行. •是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工 ...
- # 2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践
2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践 1.实验准备 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用s ...
- FAT32文件系统学习(1) —— BPB的理解
FAT 32 文件系统学习 1.本文的目标 本文将通过实际读取一个FAT32格式的U盘来简单了解和学习FAT32文件系统的格式.虽然目前windwos操作系统的主流文件系统格式是NTFS,但是FAT3 ...
- Selenium-ActionChainsApi接口详解
ActionChains 有时候我们在通过Selenium做UI自动化的时候,明明能够在DOM树内看到这个元素,但是我在通过driver click.sendkey的时候,就是点击不到或无法输入字符串 ...
- java File读取文件始终不存在的问题分析
先上图: 如图,f1 始终能读到该文件,使用的是绝对路径 f2 却是相对路径. 感觉很奇怪,明明一模一样的代码为什么会产生不同的结果呢? 首先想到的是是不是有什么特殊字符.. 拿到notepad++中 ...
- Egret(白鹭引擎)——“TypeError: Cannot read property 'asCom' of null”
前言 相信我,这个错误新手都不陌生:TypeError: Cannot read property 'asCom' of null 还有,一定要看我上一篇,哦不(人家应该是报了这个错,才找到看到这篇文 ...
- CSS快速入门-前端布局1(抽屉)
一.效果图 前面对CSS基础知识有了一定的了解,是时候开始实战了!以下我对抽屉(https://dig.chouti.com/)主页进行模拟布局. 官方网站效果图: 模拟网站图: 二.实现步骤 1.整 ...
- 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment
概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式. 实现原理 Leaf这个名字是来自德 ...
- 巧用cheerio重构grunt-inline
grunt-inline是楼主之前写的一个插件,主要作用是把页面带了__inline标记的资源内嵌到html页面去.比如下面的这个script标签. <script src="main ...
- mongodb分片集群
第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...