调整图像大小而不从磁盘再次读取它?

时间:2013-02-16 13:58:58

标签: image javafx-2 image-manipulation

我需要根据图像的最长边来调整图像大小,例如:最长边 - 可以是宽度或高度 - 应该只有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构造函数...任何提示/改进吗?谢谢: - )

2 个答案:

答案 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); 

地狱,这个东西很棘手; - )