2012-09-18 121 views
3

我正在创建一个太空入侵者的游戏,我希望所有的图像都能与屏幕分辨率成比例。这意味着它可以在所有屏幕尺寸上使用,并且所有图像都会缩小或变大,以便它们适合屏幕。游戏是全屏。什么是最简单的方法来做到这一点?此外,这是设置一切大小的最佳方式吗?如何更改图像的大小?

+0

如何显示图像? – Baz

+0

也许JAI API?恩,好主意可能是。 – Nishant

+0

你应该告诉我们你试过的东西。而且,你的意思是缩放。这会降低图像的质量,因为像素被复制以创建之前没有的新信息。最佳方法是使用固定分辨率(即更改屏幕分辨率来解析游戏的分辨率)。这就是所有游戏所做的。 – m0skit0

回答

1

设G是你的Graphics2D对象的实例,theImage是要绘制的图像,并xFactor和yFactor是缩放因子x和y,尝试:

AffineTransformation scaleTransformation = AffineTransformation.getScaleInstance(xFactor, yFactor); 
g.draw(theImage, scaleTransformation, null); 
4

有你有看Image#getScaledInstance()虽然它有它的短挫折(The Perils of Image.getScaledInstance())的问题是:

Image.getScaledInstance()不返回完成,缩放后的图像。当使用图像像素 时,它会在稍后的时间留下大部分缩放工作。

由于这些挫折,你可能想用不同的方式来调整图片的大小,你可以尝试这样的事:

import javax.swing.ImageIcon; 
import java.awt.image.BufferedImage; 
import java.awt.Image; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.io.File; 
import javax.imageio.ImageIO; 
import java.awt.RenderingHints; 

public class ImgUtils { 

public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) { 
    BufferedImage bi = null; 
    try { 
     ImageIcon ii = new ImageIcon(filename);//path to image 
     bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
     g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY)); 
     g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return bi; 
} 

} 

你会使用它像:

BufferedImage img=new ImgUtils().scaleImage(50,50,"c:/test.jpg"); 
//now you have a scaled image in img 

参考:

+1

对,JAI我个人讨厌。有这么多的调整,几乎总是你必须妥协的一件事或其他。我不知道为什么Java中没有象样的图像处理器可以与imageMagick相提并论。 – Nishant

+0

@Nishant +1是的,我必须说这是一种失望 –

1
Image getScaledImage(Image Img, int wt, int ht) { 
    BufferedImage resizedImg = new BufferedImage(wt, ht, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = resizedImg.createGraphics(); 

    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g2.drawImage(Img, 0, 0, wt, ht, null); 
    g2.dispose(); 

    return resizedImg; 
}