Java利用AlphaComposite類合并圖像
更新時間:2020年10月30日 09:25:05 作者:返回主頁追極
這篇文章主要介紹了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() { //創(chuàng)建背景圖片(帶透明分量的) 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(); //創(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)); //設置邊框 //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); //窗體設置內(nèi)容面板為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){ //調(diào)用的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類合并圖像的詳細內(nèi)容,更多關于Java 合并圖像的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:
- Java swing 圖像處理多種效果實現(xiàn)教程
- java如何用Processing生成馬賽克風格的圖像
- JAVA演示阿里云圖像識別API,印刷文字識別-營業(yè)執(zhí)照識別
- Java實現(xiàn)圖片旋轉、指定圖像大小和水平翻轉
- java通過jni調(diào)用opencv處理圖像的方法
- Java獲取彩色圖像中的主色彩的實例代碼
- JavaSE圖像驗證碼簡單識別程序詳解
- Java圖像之自定義角度旋轉(實例)
- Java OCR tesseract 圖像智能文字字符識別技術實例代碼
- 詳解使用JavaCV/OpenCV抓取并存儲攝像頭圖像
- java 使用ImageIO.writer從BufferedImage生成jpeg圖像遇到問題總結及解決
相關文章
SpringCloud實現(xiàn)Redis在各個微服務的Session共享問題
Redis是運行在內(nèi)存中,查取速度很快。本文重點給大家介紹SpringCloud實現(xiàn)Redis在各個微服務的Session共享,感興趣的朋友一起看看吧2018-08-08SpringMVC KindEditor在線編輯器之文件上傳代碼實例
這篇文章主要介紹了SpringMVC KindEditor在線編輯器之文件上傳代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09JAVA中 redisTemplate 和 jedis的配合使用操作
這篇文章主要介紹了JAVA中 redisTemplate 和 jedis的配合使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java Collection和Collections的區(qū)別
本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對集合進行操作的工具類,下面就來介紹一下具體用法,感興趣的可以了解一下2023-12-12