-2

私の画像宣言:

ImageIcon imageIcon1 = new ImageIcon(main.class.getResource("image1.png"));
Image image1 = imageIcon1.getImage();

image1 を取得し、垂直軸に沿って反転して別の画像として保存するにはどうすればよいですか?

私はグーグルで検索しましたが、見つけたすべてのソリューションには、何らかのキャストエラーが発生しています。また、私のイメージを宣言するより効率的な方法があれば教えてください。

4

2 に答える 2

8

あなたは次のように述べています:

私はグーグルで検索しましたが、見つけたすべてのソリューションには、何らかのキャストエラーが発生しています。

これは、あなたが何か間違ったことをしていることだけを教えてくれますが、何を教えてくれず、私たちがあなたを助ける方法を制限しています. 私のために働いたいくつかのステップだけをあなたに伝えることができます:

  • 最初と同じサイズの別の BufferedImage を作成し、
  • createGraphics()経由でGraphics2D コンテキストを取得します。
  • AffineTransform.getScaleInstance(-1, 1)水平反転の を介してグラフィックを反転します
  • 次に変換を変換して、反転した画像を目的の場所に移動することを忘れないでください。
  • 古いイメージを新しいイメージに描画し、
  • Graphics2D オブジェクトを破棄します。

さらにサポートが必要な場合は、試したことを示し、すべてのエラー メッセージを含めてください。

たとえば、しばらく前にミラー スプライト イメージで遊んだときに、これで遊んだことがあります。これをコンパイルして実行して、私が何を意味するかを確認してください。

import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
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 FlipViaTransform {
   private static final String SPRITE_SHEET_SPEC = "http://www.funorb.com/img/images/game/"
         + "central/dev_diary/sprite_sheet_full.gif";
   private static final int TIMER_DELAY = 200;
   private static final int SPRITE_ROWS = 8; // an 8 x 8 sprite sheet

   public static void main(String[] args) {
      try {
         URL spriteSheetUrl = new URL(SPRITE_SHEET_SPEC);
         BufferedImage spriteSheet = ImageIO.read(spriteSheetUrl);
         final ImageIcon[] iconsA = new ImageIcon[64];
         final ImageIcon[] iconsB = new ImageIcon[64];
         double wD = (double) spriteSheet.getWidth() / SPRITE_ROWS;
         double hD = (double) spriteSheet.getHeight() / SPRITE_ROWS;
         int w = (int) wD;
         int h = (int) hD;

         // *** here's what I used to flip
         AffineTransform at = AffineTransform.getScaleInstance(-1, 1); // *** flip
         at.translate(-wD, 0);  // *** translate so that flipped image is visible
         for (int i = 0; i < SPRITE_ROWS; i++) {
            for (int j = 0; j < SPRITE_ROWS; j++) {
               int x = (int) (i * wD);
               int y = (int) (j * hD);
               BufferedImage imgA = spriteSheet.getSubimage(x, y, w, h);
               BufferedImage imgB = new BufferedImage(imgA.getWidth(),
                     imgA.getHeight(), BufferedImage.TYPE_INT_ARGB);
               Graphics2D g2 = imgB.createGraphics();
               g2.setTransform(at);   // *** transform
               g2.drawImage(imgA, 0, 0, null);  // *** draw old image into new
               g2.dispose();  // *** get rid of graphics2d object

               iconsA[j * SPRITE_ROWS + i] = new ImageIcon(imgA);
               iconsB[j * SPRITE_ROWS + i] = new ImageIcon(imgB);
            }
         }

         final JLabel labelA = new JLabel("Image");
         final JLabel labelB = new JLabel("Mirror Image");

         labelA.setVerticalTextPosition(JLabel.BOTTOM);
         labelB.setVerticalTextPosition(JLabel.BOTTOM);
         labelA.setHorizontalTextPosition(JLabel.CENTER);
         labelB.setHorizontalTextPosition(JLabel.CENTER);
         labelA.setIcon(iconsA[0]);
         labelB.setIcon(iconsB[0]);
         final JPanel panel = new JPanel(new GridLayout(1, 0));
         panel.add(labelA);
         panel.add(labelB);
         Timer spriteTimer = new Timer(TIMER_DELAY, new ActionListener() {
            int spriteIndex = 0;

            @Override
            public void actionPerformed(ActionEvent arg0) {
               labelA.setIcon(iconsA[spriteIndex]);
               labelB.setIcon(iconsB[spriteIndex]);
               spriteIndex++;
               spriteIndex %= iconsA.length;
            }
         });
         spriteTimer.start();
         JOptionPane.showMessageDialog(null, panel, "AffineTransform Example", JOptionPane.PLAIN_MESSAGE);
         spriteTimer.stop();
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

次のように表示されます。
ここに画像の説明を入力

于 2012-12-21T03:21:56.463 に答える
0

私はこれを行ったことはありませんが、Java で ImageMagick や GraphicsMagic などのサードパーティ ライブラリを使用できるかどうかを調査してみてください。これらのライブラリは、PNG 画像を読み取り、それらに対してグラフィック操作を実行できます。

于 2012-12-21T03:22:59.850 に答える