1

画像の一部を描画するために私が見つけた唯一の方法は、このdrawImage関数を使用することです。

public abstract boolean drawImage(Image img、int dx1、int dy1、int dx2、int dy2、int sx1、int sy1、int sx2、int sy2、ImageObserverobserver)

長方形ではなく宛先座標のみを必要とする画像のセクションを描画する方法はありますか?目的の長方形がカットのサイズと一致することを心配するのではなく、イメージカットを指定して、それを座標で描画したいと思います。これは、間違っているかのようにエラーの余地があることがわかります。画像が収まるように絞り込んだり伸ばしたりします。さらに、画面上で画像を移動する場合は、単純な左上の座標点ではなく、2セットの点を移動することを意味します。

(誰かがこれを行うビデオを見たことがあると確信していますが、機能が何であるかを思い出せません)

4

1 に答える 1

2

画像からサブ画像を作成し、それを描画することができます。

メソッドであるBufferedImageAPIを確認してください。getSubImage()これにより、大きな画像から切り取られた画像がBufferedImageオブジェクトとして返されます。drawImage(...)次に、その位置をとるだけの単純なオーバーロードでこれを描画できます。

例えば:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class SubImageEg extends JPanel {
   // images from Wikimedia Commons
   // http://commons.wikimedia.org/wiki/Main_Page
   public static final String MAIN_IMG_PATH = "http://upload.wikimedia.org/wikipedia/commons/" +
        "thumb/4/43/Sarcophilus_harrisii_taranna.jpg/800px-Sarcophilus_harrisii_taranna.jpg";
   public static final String SECOND_IMG_PATH = "http://upload.wikimedia.org/wikipedia/commons/" +
        "thumb/f/f8/Soldering_a_0805.jpg/800px-Soldering_a_0805.jpg";
   public static final String[] IMAGE_PATHS = {MAIN_IMG_PATH, SECOND_IMG_PATH};
   private static final int SUB_X = 520;
   private static final int SUB_Y = 340;
   private static final int SUB_W = 150;
   private static final int SUB_H = 150;
   private static final int SEC_SUB_X = 400;
   private static final int SEC_SUB_Y = 200;

   private BufferedImage[] images = new BufferedImage[IMAGE_PATHS.length];
   private BufferedImage secondImgSubImg;

   public SubImageEg() {
      try {
         for (int i = 0; i < IMAGE_PATHS.length; i++) {
            images[i] = ImageIO.read(new URL(IMAGE_PATHS[i]));
         }

         secondImgSubImg = images[1].getSubimage(SUB_X, SUB_Y, SUB_W, SUB_H);
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (images[0] != null) {
         g.drawImage(images[0], 0, 0, this);
      }
      if (secondImgSubImg != null) {
         g.drawImage(secondImgSubImg, SEC_SUB_X, SEC_SUB_Y, this);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      if (images[0] != null) {
         return new Dimension(images[0].getWidth(), images[0].getHeight());
      } else {
         return super.getPreferredSize();
      }
   }

   private static void createAndShowGui() {
      SubImageEg mainPanel = new SubImageEg();

      JFrame frame = new JFrame("SubImageEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-08-08T03:19:08.537 に答える