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();
}
/**
* 合成測(cè)試
*/
public static void testComposite() {
//創(chuàng)建背景圖片(帶透明分量的)
BufferedImage bg = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
Graphics2D bgGraphics = (Graphics2D) bg.getGraphics();
bgGraphics.setColor(Color.yellow); //設(shè)置顏色
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); //畫(huà)文本
bgGraphics.dispose();
//創(chuàng)建第二張圖片
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(); //內(nèi)容面板
contentPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); //設(shè)置邊框
//contentPanel.setLayout(new BorderLayout());
//添加標(biāo)簽
JLabel label = new JLabel();
label.setText("組合模式:");
contentPanel.add(label);
//添加下拉框
JComboBox comboBox = new JComboBox();
comboBox.addItem("默認(rèn)");
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);
//添加滑動(dòng)條([0-10]=>[0,0.1,0.2,.... 1.0])
JSlider jSlider = new JSlider(0,10,10);
jSlider.setMajorTickSpacing(5); // 設(shè)置主刻度間隔
jSlider.setMinorTickSpacing(1); // 設(shè)置次刻度間隔
jSlider.setPaintTicks(true); // 繪制刻度
jSlider.setPaintLabels(true); // 繪制標(biāo)簽
jSlider.setSnapToTicks(true); // 對(duì)其到刻度取值
/*
* 給指定的刻度值顯示自定義標(biāo)簽
*/
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); //將刻度值和自定義標(biāo)簽的對(duì)應(yīng)關(guān)系設(shè)置到滑塊(設(shè)置后不再顯示默認(rèn)的刻度值)
contentPanel.add(jSlider);
jf.setContentPane(contentPanel); //窗體設(shè)置內(nèi)容面板為jp
jf.setBounds(200, 200, 500, 500);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true); //窗體可見(jiàn)
DrawingPanel drawPanel = new DrawingPanel();
drawPanel.setBounds(0,60,500,415);
drawPanel.setPreferredSize(new Dimension(500,415));
drawPanel.setBorder(BorderFactory.createLineBorder(Color.red)); //設(shè)置邊框
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(); //重畫(huà)
}
}
});
//滑動(dòng)條改變事件
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(); //重畫(huà)
}
});
//窗體改變事件
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;
}
/**
* 重寫(xiě)paint方法
* @param g
*/
@Override
public void paint(Graphics g){
//調(diào)用的super.paint(g),讓父類做一些事前的工作,如刷新屏幕
super.paint(g);
//在面板上畫(huà)畫(huà)
Graphics2D g2d = (Graphics2D)g;
g2d.setComposite(AlphaComposite.Src);
g2d.drawImage(bg,100,100,null); //背景圖
if(alphaComposite!=null) {
g2d.setComposite(alphaComposite.derive(alpha));
}else{
//默認(rèn)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類合并圖像的詳細(xì)內(nèi)容,更多關(guān)于Java 合并圖像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java swing 圖像處理多種效果實(shí)現(xiàn)教程
- java如何用Processing生成馬賽克風(fēng)格的圖像
- JAVA演示阿里云圖像識(shí)別API,印刷文字識(shí)別-營(yíng)業(yè)執(zhí)照識(shí)別
- Java實(shí)現(xiàn)圖片旋轉(zhuǎn)、指定圖像大小和水平翻轉(zhuǎn)
- java通過(guò)jni調(diào)用opencv處理圖像的方法
- Java獲取彩色圖像中的主色彩的實(shí)例代碼
- JavaSE圖像驗(yàn)證碼簡(jiǎn)單識(shí)別程序詳解
- Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)
- Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼
- 詳解使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像
- java 使用ImageIO.writer從BufferedImage生成jpeg圖像遇到問(wèn)題總結(jié)及解決
相關(guān)文章
SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享問(wèn)題
Redis是運(yùn)行在內(nèi)存中,查取速度很快。本文重點(diǎn)給大家介紹SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享,感興趣的朋友一起看看吧2018-08-08
SpringMVC KindEditor在線編輯器之文件上傳代碼實(shí)例
這篇文章主要介紹了SpringMVC KindEditor在線編輯器之文件上傳代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
JAVA中 redisTemplate 和 jedis的配合使用操作
這篇文章主要介紹了JAVA中 redisTemplate 和 jedis的配合使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java實(shí)現(xiàn)快速排序和堆排序的示例代碼
這篇文章主要為大家詳細(xì)介紹了快速排序和堆排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java、C++),感興趣的小伙伴可以了解一下2022-12-12
Java中創(chuàng)建對(duì)象的5種方式總結(jié)
本篇文章主要介紹了Java中創(chuàng)建對(duì)象的5種方式總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
SpringBoot項(xiàng)目中遇到的BUG問(wèn)題及解決方法
這篇文章主要介紹了SpringBoot項(xiàng)目中遇到的BUG問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
跳表的由來(lái)及Java實(shí)現(xiàn)詳解
跳表(Skip List)是一種基于鏈表的數(shù)據(jù)結(jié)構(gòu),它可以支持快速的查找、插入、刪除操作,本文主要來(lái)和大家講講跳表的由來(lái)與實(shí)現(xiàn),感興趣的小伙伴可以了解一下2023-06-06
Java Collection和Collections的區(qū)別
本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對(duì)集合進(jìn)行操作的工具類,下面就來(lái)介紹一下具體用法,感興趣的可以了解一下2023-12-12

