当前位置: 首页 > 知识库问答 >
问题:

Java图像调整BufferedImage不绘制

史谦
2023-03-14

我正在尝试调整图像大小,将其另存为BuffereImage。如果不缩放图像,效果很好。

在下面的代码中,文件名被传入并转换为buffereImage。使用g.drawImage(img,x,y,null)可以很好地工作 其中img是BuffereImage

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

下面的方法在这里不工作,它需要一个文件名,和一个调整大小的宽度。它调整它的大小,然后将其转换为BufferedImage,但它不工作使用g.drawImage(img, x, y, null);再次其中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;
}

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


共有2个答案

贝德辉
2023-03-14

请检查:

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

如果nulltheimgScaled与否,对我来说,你有一个null

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

施默
2023-03-14

你有一个取整问题。。。

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。改为读取(新文件(文件名))。这将一直阻止,直到图像数据被读取,并将返回一个缓冲图像,这非常容易处理。

 类似资料:
  • 问题内容: 在StackOverflow上已经存在类似此链接的问题,并且可接受的答案是“广播”: 在我的程序中,我尝试: 不幸的是,我得到运行时错误: sun.awt.image.ToolkitImage无法转换为java.awt.image.BufferedImage 显然,投射不起作用。 问题是:将Image转换为BufferedImage的正确方法是(或存在)什么? 问题答案: 从Java游

  • 所以我有一个非常奇怪的情况。我有两个图标,都是288x288px。但第一个图标在应用程序中显示得比另一个更大。 她是我的xml: css部分:. background{background-图像: url("res://login_bg"); background-重复:无重复;background-大小:封面;background-位置:中心;} 和两个图标: 有人有同样的问题吗?

  • 问题内容: 我有一个从主监视器截取的图像,因此我想将其添加到Java FX : 我正在尝试将设置为,但是类型不兼容,也无法强制转换。我该如何纠正? 问题答案: 您可以使用

  • 我有一个来自主监视器的图像截图,我想将其添加到Java FX ImageView中,如下所示: 我试图将BufferedImage捕获设置为javafx。场景形象Image Image但是类型不兼容,我也无法转换它。我该如何纠正?

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我有一个开源应用程序,可以将照片上传到Facebook。为了节省带宽,照片在上传之前会自动调整大小(Facebook设置了最大大小限制)。少数人抱怨照片质量,实际上您可以看到其中的区别(有关某些演示图像,请参阅此问题)。 所以我的问题

  • 我的makeWhiteTransparent方法如下所示: 我尝试将graphics.drawImage(newImage,null,0,0)更改为graphics.drawImage(newImage,0,0,null),并按照建议将TYPE_4BYTE_ABGR更改为TYPE_INT_ARGB,但没有任何效果。错误仍然存在。