/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package screenmaster;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Region;
/**
*
* @author cybergnome
*/
public class ManagedImage {
private final Image img;
private final String name;
private final File src;
public ManagedImage(File f) throws FileNotFoundException{
InputStream imgStream = new FileInputStream(f);
String name = f.getName();
img = new javafx.scene.image.Image(imgStream);
this.name = name;
src = f;
}
public File getSrcFile(){
return src;
}
public void setImage(ImageView imgView, Region container, ZoomMode zoomMode){
double imgAspectRatio = (img.getWidth())/(img.getHeight());
double parentAspectRatio = (container.getWidth())/(container.getHeight());
imgView.setPreserveRatio(true);
imgView.setImage(img);
Rectangle2D defaultViewportArea;
switch(zoomMode){
case NOZOOM: // do not scale
centerViewOn(0,0,imgView,container,zoomMode);
imgView.setSmooth(false);
imgView.setFitHeight(img.getHeight()); // 0 means ignore fitting/ otherwise this is the dimension measurement
imgView.setFitWidth(img.getWidth());
break;
case FIT: // scale but don't crop
imgView.setSmooth(true);
defaultViewportArea = new Rectangle2D(0, 0,img.getWidth(),img.getHeight());
imgView.setViewport(defaultViewportArea);
if(imgAspectRatio > parentAspectRatio){
// image is wider than container
imgView.setFitHeight(0); // 0 means ignore fitting/ otherwise this is the dimension measurement
imgView.setFitWidth(container.getWidth());
} else {
// image is taller than container
imgView.setFitHeight(container.getHeight()); // 0 means ignore fitting/ otherwise this is the dimension measurement
imgView.setFitWidth(0);
}
break;
case FILL: // scale and crop
imgView.setSmooth(true);
if(imgAspectRatio > parentAspectRatio){
// image is wider than container
double w = img.getHeight() * (parentAspectRatio);
double h = img.getHeight();
double m = 0.5*(img.getWidth() - w);
defaultViewportArea = new Rectangle2D(m, 0,w,h);
imgView.setViewport(defaultViewportArea);
imgView.setFitHeight(container.getHeight()); // 0 means ignore fitting/ otherwise this is the dimension measurement
imgView.setFitWidth(0);
} else {
// image is taller than container
double w = img.getWidth();
double h = img.getWidth() / parentAspectRatio;
double m = 0.5*(img.getHeight() - h);
defaultViewportArea = new Rectangle2D(0, m,w,h);
imgView.setViewport(defaultViewportArea);
imgView.setFitHeight(0); // 0 means ignore fitting/ otherwise this is the dimension measurement
imgView.setFitWidth(container.getWidth());
}
break;
}
}
/**
*
* @param dx Coordinate of center of view, where (0,0) is the center of the
* image.
* @param dy Coordinate of center of view, where (0,0) is the center of the
* image.
* @param imgView
* @param container
* @param zoomMode
*/
public void centerViewOn(double dx, double dy, ImageView imgView, Region container, ZoomMode zoomMode) {
switch(zoomMode){
case NOZOOM:
double xOffset = (img.getWidth() - container.getWidth()) * 0.5;
double yOffset = (img.getHeight() - container.getHeight()) * 0.5;
Rectangle2D viewPortArea = new Rectangle2D(xOffset + dx, yOffset+dy,img.getWidth(),img.getHeight());
imgView.setViewport(viewPortArea);
break;
}
}
@Override public String toString(){
return name;
}
}