Java - 图形DrawImage缩放问题

时间:2012-08-23 23:49:34

标签: java image graphics

我正在尝试使用下面的代码缩放图像(来自精灵表)。

Point pos = new Point(100, 100); //this shows where to display the image
Rectangle a = getAnimatedPos(); //just gets the coordinates of a specified image (which works correctly)

g.drawImage(img, pos.x, pos.y, pos.x+getWidth(), pos.y+getHeight(), a.x, a.y, a.x+a.width, a.y+a.height, null);

the function getWidth() returns the width of the frame. The formula is (imageWidth/rows).
the function getHeight() returns the height of the frame. The formula is (imageHeight/cols).

当我缩放图像(通过改变宽度或高度)时,它会开始显示其他帧吗?如果我将图像的宽度或高度保留为默认大小,则可以使用。我认为通过定义源coords和dest coords它不会这样做。

为了澄清,图像正在内部框架上绘制/渲染,例如尺寸为640x480。另外,当我的意思是框架时,我正在谈论一个精灵表,并且工作表中的每个图像都是一个框架。当然是动画。

要澄清的另一件事是,图像不是在组件之上绘制的。只是一个内部框架。

我应该尝试解决这个问题?

屏幕截图

如果一切都是默认的,那就是它的样子:http://wisemindstudios.com/good.png

当我改变某些内容时:http://wisemindstudios.com/bad.png

非常感谢!

2 个答案:

答案 0 :(得分:1)

我不知道这对你是否可行,但是。

基本上,我提取要渲染的帧,然后绘制它。

这可以避免我的可怜的小脑从所有参数中被破坏

Rectangle frameBounds = //... calculate the frame bounds to be extracted from the sprite sheet
BufferedImage cell = spriteSheet.getSubimage(frameBounds.x, frameBounds.y, frameBounds.width, frameBounds.height);

Rectangle renderBounds = //... calculate the location and size of the sprite to be rendered

g2d.drawImage(cell, renderBounds.x, renderBounds.y, renderBounds.width, renderBounds.height, this);

在我的测试中,这导致了非常糟糕的结果。你真的应该看一个更好的缩放算法;)

<强>已更新

我使用了这张精灵表

Sprite Sheet

产生了这个输出

Final

现在我添加了帧编号,将帧边界添加到渲染中以帮助它脱颖而出。

使用此方法从上一帧/下一帧中掉落的唯一原因是样式表错误(即帧大小不均匀)或当前帧的计算错误。

答案 1 :(得分:0)

我发现了这个问题。它在我的getAnimatedPos函数中。我传递了框架的新宽度和高度,而不是框架的原始宽度和高度(对于源坐标)。所以,毕竟这是一个非常简单的修复。

我确定绘图有问题而不是我的代码。但是,它通常始终是用户的错(或者在这种情况下是程序员)。那好吧。就是这样。

感谢您帮助我!