1

我正在尝试调整图像的大小,将其保存为 BufferedImage。如果我不缩放图像,我可以正常工作。

使用以下代码,传入文件名并将其转换为 BufferedImage 这工作正常使用g.drawImage(img, x, y, null);where img is the BufferedImage

public Sprite(String filename){
    ImageIcon imgIcon = new ImageIcon(filename);
    int width = imgIcon.getIconWidth();
    int height = imgIcon.getIconHeight();
    BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics bg = bimg.getGraphics();
    bg.drawImage(imgIcon.getImage(), 0, 0, null);
    bg.dispose();
    this.sprite = bimg;
}

下面的方法在这里不起作用,它需要一个文件名和一个调整大小的宽度。g.drawImage(img, x, y, null);它调整它的大小,然后将其转换为 BufferedImage,但在 img 是 BufferedImage 的情况下再次使用它不起作用。

public Sprite(String filename, int width){
    ImageIcon imgIcon = new ImageIcon(filename);
    Image img = imgIcon.getImage();
    float h = (float)img.getHeight(null);
    float w = (float)img.getWidth(null);
    int height = (int)(h * (width / w));
    Image imgScaled = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);

    BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics bg = bimg.getGraphics();
    bg.drawImage(imgScaled, 0, 0, null);
    bg.dispose();
    this.sprite = bimg;
}

所以我的问题是,为什么第二个块不起作用?

4

2 回答 2

1

检查:

Image imgScaled = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);

如果是nullimgScaled不是,对我来说,你有一个null

忘记是哪种情况了,但是有一种情况,当图片加载是阻塞的,其他是非阻塞的方法,这意味着API函数将返回并且图像还没有加载。通常需要使用观察者。就像我说的我忘了那是什么时候,但我遇到了那些情况!

于 2012-12-12T22:28:15.577 回答
1

你有一个四舍五入的问题...

Java 将根据您提供的值返回除法结果...

例如...

int width = 100;
int w = 5;
int result = width / w
// result = 0, but it should be 0.5

Java 进行了内部转换,将值转换回int,这只是截断十进制值。

相反,您需要鼓励 Java 将结果作为十进制值返回......

int result = width / (float)w
// result = 0.5

所以,你的规模计算int height = (int)(h * (width / w))实际上正在返回0

我会使用更多的计算方式

int height = Math.round((h * (width / (float)w)))

对不起,我不太记得所有这些的“技术”喋喋不休,但这是这个想法的一般笑话;)

更新

ImageIcon使用后台线程实际加载图像像素,但在调用构造函数后立即返回。这意味着图像数据可能在未来一段时间内不可用。

改为使用ImageIO.read(new File(filename))。这将阻塞,直到图像数据被读取并返回 a BufferedImage,这更容易处理。

于 2012-12-12T22:43:52.403 回答