<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 合成 > 原文: [https://zetcode.com/gfx/java2d/composition/](https://zetcode.com/gfx/java2d/composition/) 在 Java 2D 編程教程的這一部分中,我們定義了合成操作。 合成是將來自不同來源的視覺元素組合成單個圖像。 它們被用來創建一種幻覺,即所有這些元素都是同一場景的一部分。 合成在電影行業中被廣泛使用來創造人群,否則將是昂貴或不可能創造的整個新世界。 (wikipedia.org) ## 工作方式 有幾種合成操作。 我們在下一個代碼示例中展示其中的一些。 `AlphaComposite`類實現基本的 alpha 合成規則,用于組合源色和目標色,以實現圖形和圖像的混合和透明效果。 假設我們要在面板上繪制兩個對象。 繪制的第一個對象稱為目標,第二個稱為源。 `AlphaComposite`類確定如何將這兩個對象混合在一起。 如果我們有`AlphaComposite.SRC_OVER`規則,則將在兩個對象重疊的位置繪制源對象的像素。 `CompositionEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private final int rules[] = { AlphaComposite.DST, AlphaComposite.DST_ATOP, AlphaComposite.DST_OUT, AlphaComposite.SRC, AlphaComposite.SRC_ATOP, AlphaComposite.SRC_OUT }; private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); for (int x = 20, y = 20, i = 0; i < rules.length; x += 60, i++) { AlphaComposite ac = AlphaComposite.getInstance(rules[i], 0.8f); BufferedImage buffImg = new BufferedImage(60, 60, BufferedImage.TYPE_INT_ARGB); Graphics2D gbi = buffImg.createGraphics(); gbi.setPaint(Color.blue); gbi.fillRect(0, 0, 40, 40); gbi.setComposite(ac); gbi.setPaint(Color.green); gbi.fillRect(5, 5, 40, 40); g2d.drawImage(buffImg, x, y, null); gbi.dispose(); } g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class CompositionEx extends JFrame { public CompositionEx() { add(new Surface()); setTitle("Composition"); setSize(400, 120); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { CompositionEx ex = new CompositionEx(); ex.setVisible(true); } }); } } ``` 我們繪制兩個矩形,并將它們與六個不同的合成操作合并。 ```java private final int rules[] = { AlphaComposite.DST, AlphaComposite.DST_ATOP, AlphaComposite.DST_OUT, AlphaComposite.SRC, AlphaComposite.SRC_ATOP, AlphaComposite.SRC_OUT }; ``` 在這里,我們有六個不同的合成規則。 ```java AlphaComposite ac = AlphaComposite.getInstance(rules[i], 0.8f); ``` 在這里,我們得到`AlphaComposite`類。 ```java BufferedImage buffImg = new BufferedImage(60, 60, BufferedImage.TYPE_INT_ARGB); ``` 我們使用緩沖圖像執行合成操作。 ```java Graphics2D gbi = buffImg.createGraphics(); ``` 使用`createGraphics()`方法從緩沖的圖像創建`Graphics2D`對象。 ```java gbi.setComposite(ac); ``` `setComposite()`方法為`Graphics2D`上下文設置組合。 ```java g2d.drawImage(buffImg, x, y, null); ``` 使用`drawImage()`方法在面板上繪制緩沖圖像。 ```java gbi.dispose(); ``` 必須處理創建的圖形對象。 ![Composition](https://img.kancloud.cn/dc/3e/dc3e6461d8337251972c4b4998dad2fe_400x120.jpg) 圖:組合 ## 太陽和云 在下一個示例中,我們顯示太陽來自云層后面。 我們將在此動畫中使用合成技術。 `SunAndCloudEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; class Surface extends JPanel implements ActionListener { private Image sun; private Image cloud; private Timer timer; private float alpha = 1f; private final int DELAY = 600; public Surface() { loadImages(); initTimer(); } private void loadImages() { sun = new ImageIcon("sun.png").getImage(); cloud = new ImageIcon("cloud.png").getImage(); } private void initTimer() { timer = new Timer(DELAY, this); timer.start(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); BufferedImage buffImg = new BufferedImage(220, 140, BufferedImage.TYPE_INT_ARGB); Graphics2D gbi = buffImg.createGraphics(); AlphaComposite ac = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); gbi.drawImage(sun, 40, 30, null); gbi.setComposite(ac); gbi.drawImage(cloud, 0, 0, null); g2d.drawImage(buffImg, 20, 20, null); gbi.dispose(); g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void step() { alpha -= 0.1; if (alpha <= 0) { alpha = 0; timer.stop(); } } @Override public void actionPerformed(ActionEvent e) { step(); repaint(); } } public class SunAndCloudEx extends JFrame { public SunAndCloudEx() { initUI(); } private void initUI() { add(new Surface()); setTitle("Sun and cloud"); setSize(300, 210); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SunAndCloudEx ex = new SunAndCloudEx(); ex.setVisible(true); } }); } } ``` 太陽來自云層背后。 云終于消失了。 ```java private void loadImages() { sun = new ImageIcon("sun.png").getImage(); cloud = new ImageIcon("cloud.png").getImage(); } ``` 我們從磁盤加載兩個映像。 ```java private void initTimer() { timer = new Timer(DELAY, this); timer.start(); } ``` 在`initTimer()`方法內部,計時器被激活。 ```java AlphaComposite ac = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); ``` 我們使用`AlphaComposite.SRC_OVER`規則-源與目標混合并覆蓋空白像素。 ```java gbi.drawImage(sun, 40, 30, null); gbi.setComposite(ac); gbi.drawImage(cloud, 0, 0, null); g2d.drawImage(buffImg, 20, 20, null); ``` 圖像被渲染到`BufferedImage`中,隨后被復制到屏幕上。 `setComposite()`指定在渲染過程中如何將新像素與圖形設備上的現有像素合并。 ![Sun & cloud](https://img.kancloud.cn/aa/54/aa54f1f582a305a84bca4120bbea69d3_300x210.jpg) 圖:太陽和云 ## 聚光燈 聚光燈是只照亮很小區域的強光束,特別用于將注意力集中在舞臺表演者身上。 `SpotlightEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private final int RADIUS = 50; private Image image; private int iw; private int ih; private int x; private int y; private boolean mouseIn; public Surface() { initUI(); } private void initUI() { loadImage(); iw = image.getWidth(null); ih = image.getHeight(null); addMouseMotionListener(new MyMouseAdapter()); addMouseListener(new MyMouseAdapter()); } private void loadImage() { image = new ImageIcon("penguin.png").getImage(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); int midX = (getWidth() - iw) / 2; int midY = (getHeight() - ih) / 2; BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D bigr = bi.createGraphics(); if (mouseIn) { bigr.setPaint(Color.white); bigr.fillOval(x - RADIUS, y - RADIUS, RADIUS * 2, RADIUS * 2); bigr.setComposite(AlphaComposite.SrcAtop); bigr.drawImage(image, midX, midY, iw, ih, this); } bigr.setComposite(AlphaComposite.SrcOver.derive(0.1f)); bigr.drawImage(image, midX, midY, iw, ih, this); bigr.dispose(); g2d.drawImage(bi, 0, 0, getWidth(), getHeight(), this); g2d.dispose(); } private class MyMouseAdapter extends MouseAdapter { @Override public void mouseExited(MouseEvent e) { mouseIn = false; repaint(); } @Override public void mouseEntered(MouseEvent e) { mouseIn = true; } @Override public void mouseMoved(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } } } public class SpotlightEx extends JFrame { public SpotlightEx() { initUI(); } private void initUI() { add(new Surface()); setSize(350, 300); setTitle("Spotlight"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SpotlightEx ex = new SpotlightEx(); ex.setVisible(true); } }); } } ``` 使用構圖規則和 Alpha 透明度值創建聚光燈效果。 還必須注意,我們的圖像具有透明背景。 ```java BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); ``` 創建了`BufferedImage`。 它的大小等于面板的大小。 我們的 PNG 文件具有透明背景; 因此,我們使用`BufferedImage.TYPE_INT_ARGB`圖像類型。 ```java if (mouseIn) { bigr.fillOval(x - RADIUS, y - RADIUS, RADIUS * 2, RADIUS * 2); bigr.setComposite(AlphaComposite.SrcAtop); bigr.drawImage(image, midX, midY, iw, ih, this); } ``` 如果鼠標在面板區域中,則`AlphaComposite.SrcAtop`規則用于在鼠標指針周圍繪制一個完全不透明的圓圈。 ```java bigr.setComposite(AlphaComposite.SrcOver.derive(0.1f)); bigr.drawImage(image, midX, midY, iw, ih, this); ``` 這兩行描繪了圖像的其余部分。 `AlphaComposite.SrcOver`規則用于創建高度透明的圖像,并將其與背景混合。 ```java g2d.drawImage(bi, 0, 0, getWidth(), getHeight(), this); ``` 在最后一步中,緩沖的圖像將在面板的整個區域上繪制。 ![Spotlight](https://img.kancloud.cn/fd/7e/fd7ee3e6ecf281f87ff911cbb5fe6abc_350x300.jpg) 圖:聚光燈 在 Java 2D 教程的這一部分中,我們討論了圖像合成。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看