1

Javaで画像エディタを開発しようとしています。画像エディタのJava画像実装の一部は、回転、スケーリングなどの実行に加えて、画像をロードしていくつかの形状を描画することです。

JLabelを使用して画像を読み込んでいますが、JLabelを使用して画像に変換を描画して適用する方法はありますか?私がオンラインで見つけたすべての例では、JPanelを使用しました。

4

5 に答える 5

5

Java2D turorialを実際に確認する必要があります。で画像を描画し、 で画像をGraphics2D回転およびスケーリングする必要がありGraphics2Dます。

を使用しないでくださいJLabel

  • J-* コンポーネントは重い (JLabel軽量ですが)。JLabel にアイコンを追加することはできますが、通常、それらは頻繁に任意に変更されることのない安定したケースで使用されます。J-* コンポーネントをペイントすると、あまりにも多くの変更が加えられます。

  • 多数のコンポーネントを追加すると、パフォーマンスも低下します。(各コンポーネントは、Graphicsそれに属する個別のオブジェクトに自分自身を描画し、そのコンテナーはそれらすべてを描画し、レイアウトも重要です。)

  • もう 1 つの欠点は、1 つのコンポーネントまたはいくつかのコンポーネントを一緒に操作することが非常に困難であり、場合によっては不可能であるということです。たとえば、2 つの写真を追加してグループ化したい場合はどうすればよいでしょうか。あなたは2JLabel秒、1 JPanel(たぶん)必要です。次に、これら 2 つの画像に線を引き、もう一度グループ化したい場合はどうすればよいでしょうか?

基本的な手順は次のとおりです。

  1. コンポーネントのオーバーライドpaintまたはpaintComponentメソッド。
  2. Graphicsインスタンスを にキャストしますGraphics2D
  3. のいくつかのレンダリング属性を設定しますGraphics2D
  4. の変換 (回転、スケールなど) を設定しGraphics2Dます。
  5. 画像を描画するGraphics2D

Graphics2DAffineTransformRenderingHintsBufferedImageShapeなど、さらに多くのメソッドなど、多種多様なクラスが使用されます。ここですべてを説明することはできません。Java2Dチュートリアルを読んでください。API の概要と、これらの操作方法について説明します。

于 2013-02-01T04:11:04.470 に答える
3

JLabelを使用して画像を読み込んでいますが、JLabelを使用して画像に変換を描画して適用する方法はありますか?

あなたが何を意味するのか正確にはわかりません。

ただし、JLabel(表示されている画像である)のアイコンを取得して、変換したアイコンに対して実行する必要があることを実行し、をBufferedImage介してアイコンを再適用することができますsetIcon(..)

これが役立つことを願う短い例です:

JLabelアイコン付き/ BufferedImage-45度回転する前:

ここに画像の説明を入力してください

JLabelアイコンを取得した後、次の方法で回転して再適用しsetIcon(...)ます。

ここに画像の説明を入力してください

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test {

    private static JLabel imageLabel;
    private static JFrame frame;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                JPanel panel = new JPanel();

                imageLabel = new JLabel(new ImageIcon(createImage()));//set image of JLabel

                panel.add(imageLabel);

                frame.add(panel);

                frame.pack();
                frame.setVisible(true);

                startImageChangeTimer();//creates a timer which will rotate image after 5 seconds
            }

            private void startImageChangeTimer() {
                Timer timer = new Timer(5000, new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        //get JLabel Icon and convert to BufferedImage
                        BufferedImage img = getBufferedImageOfIcon(imageLabel.getIcon(), imageLabel.getWidth(), imageLabel.getHeight());
                        //rotate the image
                        img = createTransformedImage(img, -45);
                        //change the labels image
                        imageLabel.setIcon(new ImageIcon(img));

                        frame.pack();//resize frame accrodingly
                    }
                });
                timer.setRepeats(false);
                timer.start();
            }
        });
    }

    public static BufferedImage createImage() {
        BufferedImage img = new BufferedImage(100, 50, BufferedImage.TRANSLUCENT);
        Graphics2D g2d = img.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("Calibri", Font.BOLD, 20));
        FontMetrics fm = g2d.getFontMetrics();
        String text = "Hello world";
        int textWidth = fm.stringWidth(text);
        g2d.drawString(text, (img.getWidth() / 2) - textWidth / 2, img.getHeight() / 2);
        g2d.dispose();
        return img;
    }

    public static BufferedImage getBufferedImageOfIcon(Icon icon, int imgW, int imgH) {
        BufferedImage img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = (Graphics2D) img.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        icon.paintIcon(null, g2d, 0, 0);
        g2d.dispose();
        return img;
    }

    public static BufferedImage createTransformedImage(BufferedImage image, double angle) {
        double sin = Math.abs(Math.sin(angle));
        double cos = Math.abs(Math.cos(angle));
        int originalWidth = image.getWidth();
        int originalHeight = image.getHeight();
        int newWidth = (int) Math.floor(originalWidth * cos + originalHeight * sin);
        int newHeight = (int) Math.floor(originalHeight * cos + originalWidth * sin);
        BufferedImage rotatedBI = new BufferedImage(newWidth, newHeight, BufferedImage.TRANSLUCENT);
        Graphics2D g2d = rotatedBI.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.translate((newWidth - originalWidth) / 2, (newHeight - originalHeight) / 2);
        g2d.rotate(angle, originalWidth / 2, originalHeight / 2);
        g2d.drawImage(image, 0, 0, null);
        g2d.dispose();
        return rotatedBI;
    }
}

アップデート:

私は@shuangwhywhyに同意する傾向があります。JPanelビアに画像を描画しpaintComponent(Graphics g)ます。これにより、画像のサイズを変更して画像に設定しJPanelゲッターとセッターを使用)、呼び出しrepaint()て変更を表示できます。

于 2013-02-01T08:02:15.777 に答える
1

シンプルな画像編集ソフトはこちら

  /*Arpana*/
  CPanel displayPanel;

  JButton sharpenButton, blurringButton, edButton, resetButton;

  public ConvolveApp()
    super();
    Container container = getContentPane();

    displayPanel = new CPanel();
    container.add(displayPanel);

    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(2, 2));
    panel
        .setBorder(new TitledBorder(
            "Click a Button to Perform the Associated Operation and Reset..."));

    sharpenButton = new JButton("Sharpen");
    sharpenButton.addActionListener(new ButtonListener());
    blurringButton = new JButton("Blur");
    blurringButton.addActionListener(new ButtonListener());
    edButton = new JButton("Edge Detect");
    edButton.addActionListener(new ButtonListener());
    resetButton = new JButton("Reset");
    resetButton.addActionListener(new ButtonListener());

    panel.add(sharpenButton);
    panel.add(blurringButton);
    panel.add(edButton);
    panel.add(resetButton);

    container.add(BorderLayout.SOUTH, panel);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {

    setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10);
    setVisible(true); 

  public static void main(String arg[]) {
    new ConvolveApp();


  class ButtonListener implements ActionListener 
    public void actionPerformed(ActionEvent e) 
      JButton button = (JButton) e.getSource();

      if (button.equals(sharpenButton)) 
        displayPanel.sharpen();
        displayPanel.repaint();
       else if (button.equals(blurringButton)) 
        displayPanel.blur();
        displayPanel.repaint();
       else if (button.equals(edButton)) 
        displayPanel.edgeDetect();
        displayPanel.repaint();
      else if (button.equals(resetButton)) 
        displayPanel.reset();
        displayPanel.repaint();


class CPanel extends JLabel 
  Image displayImage;

  BufferedImage biSrc;

  BufferedImage biDest; 

  BufferedImage bi; 

  Graphics2D big;

  CPanel()
    setBackground(Color.black);
    loadImage();
    setSize(displayImage.getWidth(this), displayImage.getWidth(this)); 
    createBufferedImages();
    bi = biSrc;


  public void loadImage() 
    displayImage = Toolkit.getDefaultToolkit().getImage("Arpana.jpg");
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(displayImage, 1);
    try
      mt.waitForAll();
       if (displayImage.getWidth(this) == -1) 
      System.out.println("No jpg file");
      System.exit(0);


  public void createBufferedImages() 
    biSrc = new BufferedImage(displayImage.getWidth(this), displayImage
        .getHeight(this), BufferedImage.TYPE_INT_RGB);

    big = biSrc.createGraphics();
    big.drawImage(displayImage, 0, 0, this);

    biDest = new BufferedImage(displayImage.getWidth(this), displayImage
        .getHeight(this), BufferedImage.TYPE_INT_RGB);


  public void sharpen() 
    float data[] = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f,
        -1.0f };
    Kernel kernel = new Kernel(3, 3, data);
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
        null);
    convolve.filter(biSrc, biDest);
    bi = biDest;


  public void blur() 
    float data[] = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f,
        0.0625f, 0.125f, 0.0625f };
    Kernel kernel = new Kernel(3, 3, data);
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
        null);
    convolve.filter(biSrc, biDest);
    bi = biDest;


    public void edgeDetect() 
    float data[] = { 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f,
        -1.0f };

    Kernel kernel = new Kernel(3, 3, data);
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
        null);
    convolve.filter(biSrc, biDest);

public void reset()
    big.setColor(Color.black);
    big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this));
    big.drawImage(displayImage, 0, 0, this);
    bi = biSrc;


  public void update(Graphics g) 
    g.clearRect(0, 0, getWidth(), getHeight());
    paintComponent(g);
于 2014-03-20T15:20:09.580 に答える
0

これを達成するために JLabels を使用している人々について聞いたことがあります。BufferedImageJLabel の背景としてを表示することをお勧めします。ユーザーが画像に編集を適用したら、画像を編集し (画像を操作するためのライブラリがまだない場合は、imgscarを強くお勧めします)、JLabel の背景として再適用します (自動的に更新されない場合)。 .

于 2013-02-01T04:04:15.777 に答える
0
      /* Arpana*/   
     import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.image.BufferedImage;
    import java.awt.image.ConvolveOp;
    import java.awt.image.Kernel;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.border.TitledBorder;

    public class ConvolveApp extends JFrame {
      CPanel displayPanel;

      JButton sharpenButton, blurringButton, edButton, resetButton;

      public ConvolveApp() {
        super();
        Container container = getContentPane();

        displayPanel = new CPanel();
        container.add(displayPanel);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 2));
        panel
            .setBorder(new TitledBorder(
                "Click a Button to Perform the Associated Operation and Reset..."));

        sharpenButton = new JButton("Sharpen");
        sharpenButton.addActionListener(new ButtonListener());
        blurringButton = new JButton("Blur");
        blurringButton.addActionListener(new ButtonListener());
        edButton = new JButton("Edge Detect");
        edButton.addActionListener(new ButtonListener());
        resetButton = new JButton("Reset");
        resetButton.addActionListener(new ButtonListener());

        panel.add(sharpenButton);
        panel.add(blurringButton);
        panel.add(edButton);
        panel.add(resetButton);

        container.add(BorderLayout.SOUTH, panel);

        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            System.exit(0);
          }
        });
        setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10);
        setVisible(true); 
      }
      public static void main(String arg[]) {
        new ConvolveApp();
      }

      class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          JButton button = (JButton) e.getSource();

          if (button.equals(sharpenButton)) {
            displayPanel.sharpen();
            displayPanel.repaint();
          } else if (button.equals(blurringButton)) {
            displayPanel.blur();
            displayPanel.repaint();
          } else if (button.equals(edButton)) {
            displayPanel.edgeDetect();
            displayPanel.repaint();
          } else if (button.equals(resetButton)) {
            displayPanel.reset();
            displayPanel.repaint();
          }
        }
      }
    }

    class CPanel extends JLabel {
      Image displayImage;

      BufferedImage biSrc;

      BufferedImage biDest; // Destination image is mandetory.

      BufferedImage bi; // Only an additional reference.

      Graphics2D big;

      CPanel() {
        setBackground(Color.black);
        loadImage();
        setSize(displayImage.getWidth(this), displayImage.getWidth(this)); 
        createBufferedImages();
        bi = biSrc;
      }

      public void loadImage() {
        displayImage = Toolkit.getDefaultToolkit().getImage("Arpana.jpg");
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(displayImage, 1);
        try {
          mt.waitForAll();
        } catch (Exception e) {
          System.out.println("Exception while loading.");
        }
        if (displayImage.getWidth(this) == -1) {
          System.out.println("No jpg file");
          System.exit(0);
        }
      }

      public void createBufferedImages() {
        biSrc = new BufferedImage(displayImage.getWidth(this), displayImage
            .getHeight(this), BufferedImage.TYPE_INT_RGB);

        big = biSrc.createGraphics();
        big.drawImage(displayImage, 0, 0, this);

        biDest = new BufferedImage(displayImage.getWidth(this), displayImage
            .getHeight(this), BufferedImage.TYPE_INT_RGB);
      }

      public void sharpen() {
        float data[] = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f,
            -1.0f };
        Kernel kernel = new Kernel(3, 3, data);
        ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
            null);
        convolve.filter(biSrc, biDest);
        bi = biDest;
      }

      public void blur() {
        float data[] = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f,
            0.0625f, 0.125f, 0.0625f };
        Kernel kernel = new Kernel(3, 3, data);
        ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
            null);
        convolve.filter(biSrc, biDest);
        bi = biDest;
      }

        public void edgeDetect() {
        float data[] = { 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f,
            -1.0f };

        Kernel kernel = new Kernel(3, 3, data);
        ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
            null);
        convolve.filter(biSrc, biDest);

        bi = biDest;
      }

      public void reset() {
        big.setColor(Color.black);
        big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this));
        big.drawImage(displayImage, 0, 0, this);
        bi = biSrc;
      }

      public void update(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        paintComponent(g);
      }

      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;

        g2D.drawImage(bi, 0, 0, this);
      }
    }
于 2014-03-20T15:25:53.560 に答える