2012-12-21 78 views
-2

我的图片声明:如何翻转和保存图像

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

如何拍摄图像1,翻转沿着它的垂直轴,并保存为另一幅图像?

我已经使用了Google,并且我找到的每个解决方案都有一些类型的转换错误。 此外,如果有更有效的方式来宣布我的形象,请让我知道。

+1

“我找到的每个解决方案都带有某种类型的转换错误” - 这些解决方案(代码)以及错误(消息/堆栈跟踪)究竟是什么? –

+0

为什么你问[相同的问题两次](http://stackoverflow.com/questions/13983099/how-do-you-flip-an-image-and-also-change-its-location)?并且也没有提供足够的信息以便在任何一个方面得到很好的答案讨论中这种不必要的分歧对于本网站的志愿者不公平,在此不予理解。 –

+0

究竟是什么:/你想被删除?尴尬了! –

回答

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(); 
     } 
    } 
} 

,显示为:
enter image description here

+0

@CalinGribble:你可以像任何图片一样保存。 'ImageIO.write(...)'。请检查ImageIO API,因为它会告诉你你需要什么。 –

0

我从来没有做过,但你可以尝试研究,如果你可以使用3D党库如ImageMagick或带Java的GraphicsMagic。这些库可以读取PNG图像并对它们执行图形操作。

+1

只需使用核心Java就可以轻松完成简单的翻转操作,因此不需要此操作。 –

+0

啊,好的。没关系。 – shargors