【问题标题】:How to flip and save Image如何翻转和保存图像
【发布时间】:2012-12-21 03:15:05
【问题描述】:

我的形象声明:

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

如何拍摄 image1,沿垂直轴翻转并保存为另一张图像?

我用谷歌搜索过,我发现的每个解决方案都带有某种类型的转换错误。 另外,如果有更有效的方式来声明我的图像,请告诉我。

【问题讨论】:

  • “我发现的每个解决方案都带有某种类型的转换错误” - 这些解决方案是什么(代码)以及错误究竟是什么(消息/堆栈跟踪)?
  • 你为什么要问same question twice?并且还没有提供足够的信息来提供一个好的答案?这种不必要的讨论划分对本网站上的志愿者不公平,在此不予赞赏。
  • 什么鬼:/你想被删除?好尴尬!
  • 如果您想删除您的帐户,请查看stackoverflow.com/help/deleting-account

标签: java image bufferedimage flip imageicon


【解决方案1】:

你说:

我用谷歌搜索过,我发现的每个解决方案都带有某种类型的转换错误。

这只会告诉我们您做错了什么,但不会告诉我们是什么,从而限制了我们可以为您提供帮助的方式。我只能告诉你一些对我有用的步骤:

  • 创建另一个与第一个大小相同的 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();
      }
   }
}

显示为:

【讨论】:

  • @CalinGribble:您可以像保存任何图像一样保存它。 ImageIO.write(...)。请务必检查 ImageIO API,因为它会告诉您您需要什么。
【解决方案2】:

我从来没有这样做过,但是你可以尝试研究一下你是否可以使用 Java 中的 ImageMagick 或 GraphicsMagic 等 3d 派对库。这些库可以读取 PNG 图像并对其执行图形操作。

【讨论】:

  • 没有必要这样做,因为只需核心 Java 即可轻松完成简单的翻转。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2012-06-30
  • 2022-11-30
  • 2014-04-28
  • 2017-06-24
  • 2017-06-05
相关资源
最近更新 更多