package models.services;
import models.base.FileOperationException;
import org.imgscalr.Scalr;
import play.Logger;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* This class handles all image related functionalities
*/
public class ImageService {
final static Logger.ALogger logger = Logger.of(ImageService.class);
private ImageService(){}
static public boolean validateMinSize(File file, int min_length, int min_height){
BufferedImage image;
try {
image = ImageIO.read(file);
if(image.getWidth() < min_length) {
return false;
}
if(image.getHeight() < min_height) {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
static public boolean validateMaxSize(File file, int max_length, int max_height){
BufferedImage image;
try {
image = ImageIO.read(file);
if(image.getWidth() > max_length) {
return false;
}
if(image.getHeight() > max_height) {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
static public void crop(File file, int x, int y, int width, int height) throws FileOperationException {
BufferedImage image;
try {
image = ImageIO.read(file);
image = Scalr.crop(image, x, y, width, height);
saveToJPG(image, file);
image.flush();
} catch (IOException | IllegalArgumentException e){
logger.error(e.getMessage(), e);
throw new FileOperationException("Cropping failed");
}
}
static public void resize(File file, int width, int height) throws FileOperationException {
BufferedImage image;
try {
image = ImageIO.read(file);
image = Scalr.resize(image,
Scalr.Method.ULTRA_QUALITY,
Scalr.Mode.FIT_EXACT,
width,
height);
saveToJPG(image, file);
image.flush();
} catch (IOException | IllegalArgumentException e) {
logger.error(e.getMessage(), e);
throw new FileOperationException("Resizing failed");
}
}
static private void saveToJPG(BufferedImage image, File file) throws IOException {
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
newImage.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);
ImageIO.write(newImage, "jpg", file);
newImage.flush();
}
}