我需要根据图像的最长边来调整图像大小,例如:最长边 - 可以是宽度或高度 - 应该只有100像素长。
目前我正在使用此方法:
private Image resizeImageByLongestSide(File imageFile, int lengthLongestSide)
{
String uri ="file:" + imageFile.getAbsolutePath();
Image image = new Image(uri); // raed to determine width/height
// read image again for resizing
if(image.getWidth() >= image.getHeight())
return new Image(uri, lengthLongestSide, 0, true, false);
else
return new Image(uri, 0, lengthLongestSide, true, false);
}
因此,首先必须通过磁盘读取图像以确定哪一侧是最长的一侧,而不是再次从磁盘读取,因为调整大小似乎只能通过使用Image构造函数...任何提示/改进吗?谢谢: - )
答案 0 :(得分:1)
您需要的只是ImageView
在内存中加载图像一次,然后在需要时对imageview进行操作。
示例代码:
//load image to memory
final static Image MY_IMAGE = new Image(path of image file);
//create different imageviews pointing to image in memory and do manipulations
ImageView myImage = new ImageView(MY_IMAGE);
myImage.setFitHeight(value);
myImage.setFitWidth(value);
答案 1 :(得分:1)
invariant接近最终解决方案,最终解决方案的信用转到l2p in the oracle forum:
ImageView不会改变实际的图像,无论它是否在场景中。它仅从给定图像渲染可见节点。如果您希望它从当前可见状态渲染新图像,则必须创建快照()。 所以:
Image resizedImage = myImageView.snapshot(null, null); // after using myImageView.setFitHeight()/setFitWidth/( etc.
<强>修正:强>
使用当前方法会丢失透明度,因为默认控件(herE:imageview)背景为白色。白色透明度(来自我们的图像)的屏幕截图给出了白色,因此我们松开了原始的透明度。解决此问题:将背景本身设置为透明。
所以,固定代码:
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
return imageView.snapshot(params, null);
地狱,这个东西很棘手; - )