我正在尝试调整图像大小,将其另存为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;
}
所以我的问题是,为什么第二个街区不起作用?
请检查:
Image imgScaled = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
如果null
theimgScaled
与否,对我来说,你有一个null
。
忘记了哪种情况,是但是有一种,当图像加载是阻塞和其他无阻塞方法时,这意味着API函数会返回并且图像还没有加载。通常需要使用观察者。就像我告诉我忘记了那是什么时候,但我遇到了那些情况!
你有一个取整问题。。。
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,但没有任何效果。错误仍然存在。