2011-09-01 47 views
0

位图只不过是一个int[] pixels = new int[width * height];将位图缩放到另一个位图中,最好采用“手动”方式?

我使用了这种方式:

BufferedImage img = new BufferedImage(WIDTH,HEIGHT,RGB); 
int[] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 

“就在这里呈现的像素[],例如加载使用BufferedImage img = ImageIO.read(URL)的图像;

Graphics g; 
g.drawImage(img, 0,0, getWidth(), getHeight(), null); 

现在在“做渲染在这里像素”很多东西都可能发生,着色纹理(它们是灰阶),但我还需要重新调节。虽然我不知道“最好的方式”做到这一点。

所有'位图'只是一个整数数组。

缩放可以在步骤来完成对0.1或0.01或3 我个人认为是这样的:

for(int yy = 0; yy < tex.height; yy++){ 
    for(int xx = 0; xx < tex.width; xx++){ 
     int px = tex.getPixel(yy * tex.width + xx); 
     this.putPixel((y*this.width)+((int)((yy*scale) * tex.width)) + (x) + ((int)(xx*scale))); 
    } 
} 

但我不知道这是否会是“正确”的方式。或者如果有其他/更好的方法。

+0

如果需要更多信息,请不要问。 –

+0

参见'AffineTransformOp',显示[here](http://stackoverflow.com/questions/4216123/how-to-scale-a-bufferedimage/4216635#4216635)。 – trashgod

+0

是的,我看到了一个,但我不打算保留对BufferedImage对象的引用。 –

回答

0

可悲的是没有正确的方法。您必须在质量和性能之间进行权衡。

image scaling上的维基百科页面对方法有很好的概述。

+0

这两者都不是真正的本质,最多只能使用〜32x32网格的不同纹理,视口具有〜320x240的网格。所有相同的纹理将具有相同的东西,所以它们可能是相同的对象引用,只是在视口的不同部分绘制。 –

+0

我有最简单的工作版本,运行效果很好。因为确实如此,所以接受了你的回答。 –