<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 圖像 > 原文: [https://zetcode.com/gfx/java2d/java2dimages/](https://zetcode.com/gfx/java2d/java2dimages/) 在 Java 2D 教程的這一部分中,我們將處理圖像。 `BufferedImage`是使用 Java 2D 處理圖像的基礎類。 它是存儲在內存中的像素矩形。 ## 顯示圖像 在第一個示例中,我們在面板上顯示圖像。 `DisplayImageEx.java` ```java package com.zetcode; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private Image mshi; public Surface() { loadImage(); setSurfaceSize(); } private void loadImage() { mshi = new ImageIcon("mushrooms.jpg").getImage(); } private void setSurfaceSize() { Dimension d = new Dimension(); d.width = mshi.getWidth(null); d.height = mshi.getHeight(null); setPreferredSize(d); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(mshi, 0, 0, null); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class DisplayImageEx extends JFrame { public DisplayImageEx() { initUI(); } private void initUI() { add(new Surface()); pack(); setTitle("Mushrooms"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { DisplayImageEx ex = new DisplayImageEx(); ex.setVisible(true); } }); } } ``` 在示例中,我們在面板上顯示圖像。 調整窗口大小以適合圖像的大小。 ```java private void loadImage() { mshi = new ImageIcon("mushrooms.jpg").getImage(); } ``` 我們使用`ImageIcon`類加載圖像。 該圖像位于當前工作目錄中。 ```java private void setSurfaceSize() { Dimension d = new Dimension(); d.width = mshi.getWidth(null); d.height = mshi.getHeight(null); setPreferredSize(d); } ``` 我們確定加載圖像的大小。 使用`setPreferredSize()`方法,我們設置`Surface`面板的首選大小。 `JFrame`容器的`pack()`方法將使框架適合其子代的大小。 在我們的例子中是`Surface`面板。 結果,窗口將被調整大小以精確顯示加載的圖像。 ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(mshi, 0, 0, null); } ``` 使用`drawImage()`方法在面板上繪制圖像。 最后一個參數是`ImageObserver`類。 有時用于異步加載。 當我們不需要異步加載圖像時,可以將`null`放在此處。 ```java private void initUI() { ... pack(); ... } ``` `pack()`方法調整容器的大小以適合子面板的大小。 ## 灰度圖像 在計算中,灰度數字圖像是其中每個像素的值是單個樣本的圖像,也就是說,它攜帶有關其強度的完整(且唯一)信息。 這種圖像僅由中性灰色陰影組成,從最弱的黑色到最強的白色不等。 (維基百科) 在下一個示例中,我們使用 Java 2D 創建灰度圖像。 `GrayScaleImage.java` ```java package com.zetcode; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private Image mshi; private BufferedImage bufimg; private Dimension d; public Surface() { loadImage(); determineAndSetSize(); createGrayImage(); } private void determineAndSetSize() { d = new Dimension(); d.width = mshi.getWidth(null); d.height = mshi.getHeight(null); setPreferredSize(d); } private void createGrayImage() { bufimg = new BufferedImage(d.width, d.height, BufferedImage.TYPE_BYTE_GRAY); Graphics2D g2d = bufimg.createGraphics(); g2d.drawImage(mshi, 0, 0, null); g2d.dispose(); } private void loadImage() { mshi = new ImageIcon("mushrooms.jpg").getImage(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bufimg, null, 0, 0); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class GrayScaleImageEx extends JFrame { public GrayScaleImageEx() { initUI(); } private void initUI() { Surface dpnl = new Surface(); add(dpnl); pack(); setTitle("GrayScale image"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { GrayScaleImageEx ex = new GrayScaleImageEx(); ex.setVisible(true); } }); } } ``` 有幾種創建灰度圖像的方法。 我們通過將圖像數據寫入`BufferedImage.TYPE_BYTE_GRAY`類型的緩沖圖像中來實現。 ```java bufimg = new BufferedImage(d.width, d.height, BufferedImage.TYPE_BYTE_GRAY); ``` 我們創建一個`BufferedImage.TYPE_BYTE_GRAY`類型的`BufferedImage`類。 ```java Graphics2D g2d = bufimg.createGraphics(); g2d.drawImage(mshi, 0, 0, null); ``` 在這里,我們將蘑菇圖像繪制到緩沖圖像中。 ```java g2d.dispose(); ``` 使用`createGraphics()`方法創建的圖形對象應手動釋放。 當這些對象返回時,作為對象的`paint()`和`update()`方法的參數提供的圖形對象將由系統自動釋放。 ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bufimg, null, 0, 0); } ``` 緩沖的圖像通過`drawImage()`方法繪制在面板上。 ## 圖像翻轉 以下示例翻轉圖像。 我們將要過濾圖像。 有一種`filter()`方法正在轉換圖像。 `FlippedImageEx.java` ```java package com.zetcode; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private Image mshi; private BufferedImage bufimg; private final int SPACE = 10; public Surface() { loadImage(); createFlippedImage(); setSurfaceSize(); } private void loadImage() { mshi = new ImageIcon("mushrooms.jpg").getImage(); } private void createFlippedImage() { bufimg = new BufferedImage(mshi.getWidth(null), mshi.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics gb = bufimg.getGraphics(); gb.drawImage(mshi, 0, 0, null); gb.dispose(); AffineTransform tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-mshi.getWidth(null), 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); bufimg = op.filter(bufimg, null); } private void setSurfaceSize() { int w = bufimg.getWidth(); int h = bufimg.getHeight(); Dimension d = new Dimension(3*SPACE+2*w, h+2*SPACE); setPreferredSize(d); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(mshi, SPACE, SPACE, null); g2d.drawImage(bufimg, null, 2*SPACE + bufimg.getWidth(), SPACE); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class FlippedImageEx extends JFrame { public FlippedImageEx() { initUI(); } private void initUI() { add(new Surface()); pack(); setTitle("Flipped image"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { FlippedImageEx ex = new FlippedImageEx(); ex.setVisible(true); } }); } } ``` 在我們的代碼示例中,我們水平翻轉圖像。 ```java AffineTransform tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-castle.getWidth(null), 0); ``` 翻轉圖像意味著對其進行縮放和平移。 因此,我們進行了`AffineTransform`操作。 ```java AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); bufferedImage = op.filter(bufferedImage, null) ``` 這是可用的過濾操作之一。 這也可以通過像素操縱來完成。 但是 Java 2D 提供了高級類,使操作圖像更加容易。 在我們的情況下,`AffineTransformOp`類對圖像像素執行縮放和平移。 ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(mshi, SPACE, SPACE, null); g2d.drawImage(bufimg, null, 2*SPACE + bufimg.getWidth(), SPACE); } ``` 這兩個圖像都畫在面板上。 ```java private void setSurfaceSize() { int w = bufimg.getWidth(); int h = bufimg.getHeight(); Dimension d = new Dimension(3*SPACE+2*w, h+2*SPACE); setPreferredSize(d); } ``` 我們設置面板的首選大小。 我們計算大小,以便可以在面板上放置兩個圖像,并在它們之間以及圖像和窗口邊框之間留一些空間。 ## 圖像模糊 下一個代碼示例使圖像模糊。 模糊意味著沒有聚焦的圖像。 為了模糊圖像,我們使用了卷積運算。 這是一種數學運算,也用于邊緣檢測或噪聲消除。 模糊操作可用于各種圖形效果。 例如,創建速度錯覺或顯示人的注意力不集中。 模糊濾鏡操作用像素及其鄰居的平均值替換圖像中的每個像素。 卷積是每個像素的運算。 對圖像中的每個像素重復相同的算法。 內核可以看作是一個二維的數字網格,它按順序遍歷圖像的每個像素,并一路執行計算。 由于圖像也可以被視為數字的二維網格,因此將內核應用于圖像可以可視化為在較大的網格(圖像)上移動的小網格(內核)。 (developer.apple.com) `BlurredImageEx.java` ```java package com.zetcode; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private BufferedImage mshi; private BufferedImage bluri; public Surface() { loadImage(); createBlurredImage(); setSurfaceSize(); } private void loadImage() { try { mshi = ImageIO.read(new File("mushrooms.jpg")); } catch (IOException ex) { Logger.getLogger(Surface.class.getName()).log( Level.WARNING, null, ex); } } private void createBlurredImage() { float[] blurKernel = { 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f }; BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel)); bluri = blur.filter(mshi, new BufferedImage(mshi.getWidth(), mshi.getHeight(), mshi.getType())); } private void setSurfaceSize() { Dimension d = new Dimension(); d.width = mshi.getWidth(null); d.height = mshi.getHeight(null); setPreferredSize(d); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bluri, null, 0, 0); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class BlurredImageEx extends JFrame { public BlurredImageEx() { setTitle("Blurred image"); add(new Surface()); pack(); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { BlurredImageEx ex = new BlurredImageEx(); ex.setVisible(true); } }); } } ``` 在代碼示例中,我們從磁盤加載圖像,對圖像執行模糊操作,然后在窗口上顯示結果。 ```java private void loadImage() { try { mshi = ImageIO.read(new File("mushrooms.jpg")); } catch (IOException ex) { Logger.getLogger(Surface.class.getName()).log( Level.WARNING, null, ex); } } ``` `ImageIO`類的`read()`方法從磁盤讀取圖像并返回`BufferedImage`。 ```java float[] blurKernel = { 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f, 1 / 9f }; ``` 該矩陣稱為內核。 所述值是應用于改變的像素的相鄰值的權重。 ```java BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel)); bluri = blur.filter(mshi, new BufferedImage(mshi.getWidth(), mshi.getHeight(), mshi.getType())); ``` 在這里,我們對圖像應用模糊濾鏡。 ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bluri, null, 0, 0); } ``` 模糊的圖像繪制在窗口上。 ## 反射 在下一個示例中,我們顯示反射圖像。 這種效果使人產生幻覺,好像圖像在水中被反射一樣。 以下代碼示例受到 [jhlabs.com](http://www.jhlabs.com/java/java2d/reflections/index.html) 中代碼的啟發。 `ReflectionEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private BufferedImage image; private BufferedImage refImage; private int img_w; private int img_h; private final int SPACE = 30; public Surface() { loadImage(); getImageSize(); createReflectedImage(); } private void loadImage() { try { image = ImageIO.read(new File("rotunda.jpg")); } catch (Exception ex) { Logger.getLogger(Surface.class.getName()).log( Level.WARNING, null, ex); } } private void getImageSize() { img_w = image.getWidth(); img_h = image.getHeight(); } private void createReflectedImage() { float opacity = 0.4f; float fadeHeight = 0.3f; refImage = new BufferedImage(img_w, img_h, BufferedImage.TYPE_INT_ARGB); Graphics2D rg = refImage.createGraphics(); rg.drawImage(image, 0, 0, null); rg.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN)); rg.setPaint(new GradientPaint(0, img_h * fadeHeight, new Color(0.0f, 0.0f, 0.0f, 0.0f), 0, img_h, new Color(0.0f, 0.0f, 0.0f, opacity))); rg.fillRect(0, 0, img_w, img_h); rg.dispose(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); int win_w = getWidth(); int win_h = getHeight(); int gap = 20; g2d.setPaint(new GradientPaint(0, 0, Color.black, 0, win_h, Color.darkGray)); g2d.fillRect(0, 0, win_w, win_h); g2d.translate((win_w - img_w) / 2, win_h / 2 - img_h); g2d.drawImage(image, 0, 0, null); g2d.translate(0, 2 * img_h + gap); g2d.scale(1, -1); g2d.drawImage(refImage, 0, 0, null); g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } @Override public Dimension getPreferredSize() { return new Dimension(img_w + 2 * SPACE, 2 * img_h + 3 * SPACE); } } public class ReflectionEx extends JFrame { public ReflectionEx() { initUI(); } private void initUI() { add(new Surface()); pack(); setTitle("Reflection"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ReflectionEx ex = new ReflectionEx(); ex.setVisible(true); } }); } } ``` 在示例中,我們創建了反射圖像的錯覺。 ```java refImage = new BufferedImage(img_w, img_h, BufferedImage.TYPE_INT_ARGB); Graphics2D rg = refImage.createGraphics(); rg.drawImage(image, 0, 0, null); ``` 創建已加載圖像的副本。 ```java rg.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN)); rg.setPaint(new GradientPaint(0, img_h * fadeHeight, new Color(0.0f, 0.0f, 0.0f, 0.0f), 0, img_h, new Color(0.0f, 0.0f, 0.0f, opacity))); rg.fillRect(0, 0, img_w, img_h); ``` 這是代碼中最重要的部分。 我們使第二個圖像透明。 但是透明度不是恒定不變的。 圖像逐漸淡出。 這是通過`GradientPaint`類實現的。 ```java g2d.setPaint(new GradientPaint(0, 0, Color.black, 0, win_h, Color.darkGray)); g2d.fillRect(0, 0, win_w, win_h); ``` 窗口的背景填充有漸變顏料。 涂料是從黑色到深灰色的平滑混合。 ```java g2d.translate((win_w - img_w) / 2, win_h / 2 - img_h); g2d.drawImage(image, 0, 0, null); ``` 普通圖像將移動到窗口的中心并繪制。 ```java g2d.translate(0, 2 * imageHeight + gap); g2d.scale(1, -1); ``` 此代碼翻轉圖像并將其轉換為原始圖像下方。 平移操作是必需的,因為縮放操作會使圖像上下顛倒并向上平移圖像。 要了解發生了什么,只需拍攝照片并將其放在桌子上并翻轉即可。 ```java g2d.drawImage(refImage, 0, 0, null); ``` 繪制反射的圖像。 ```java @Override public Dimension getPreferredSize() { return new Dimension(img_w + 2 * SPACE, 2 * img_h + 3 * SPACE); } ``` 設置組件的首選大小的另一種方法是重寫`getPreferredSize()`方法。 ![Reflection](https://img.kancloud.cn/c7/ec/c7ec09740e41a9f7031b3aac1421158d_182x296.jpg) 圖:反射 在 Java2D 教程的這一部分中,我們處理了圖像。
                  <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>

                              哎呀哎呀视频在线观看