package com.salesmanager.core.business.utils; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.FileNameMap; import java.net.URLConnection; import javax.imageio.ImageIO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ProductImageCropUtils { private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageCropUtils.class); private boolean cropeable = true; private int cropeBaseline = 0;// o is width, 1 is height private int getCropeBaseline() { return cropeBaseline; } private double cropAreaWidth = 0; private double cropAreaHeight = 0; //private InputStream originalFile = null; private BufferedImage originalFile = null; public ProductImageCropUtils(BufferedImage file, int largeImageWidth, int largeImageHeight) { try { this.originalFile = file; /** Original Image **/ // get original image size int width = originalFile.getWidth(); int height = originalFile.getHeight(); /*** determine if image can be cropped ***/ determineCropeable(width, largeImageWidth, height, largeImageHeight); /*** determine crop area calculation baseline ***/ //this.determineBaseline(width, height); determineCropArea(width, largeImageWidth, height, largeImageHeight); } catch (Exception e) { LOGGER.error("Image Utils error in constructor", e); } } private void determineCropeable(int width, int specificationsWidth, int height, int specificationsHeight) { /*** determine if image can be cropped ***/ // height int y = height - specificationsHeight; // width int x = width - specificationsWidth; if (x < 0 || y < 0) { setCropeable(false); } if (x == 0 && y == 0) { setCropeable(false); } if((height % specificationsHeight) == 0 && (width % specificationsWidth) == 0 ) { setCropeable(false); } } private void determineCropArea(int width, int specificationsWidth, int height, int specificationsHeight) { cropAreaWidth = specificationsWidth; cropAreaHeight = specificationsHeight; double factorWidth = new Integer(width).doubleValue() / new Integer(specificationsWidth).doubleValue(); double factorHeight = new Integer(height).doubleValue() / new Integer(specificationsHeight).doubleValue(); double factor = factorWidth; if(factorWidth>factorHeight) { factor = factorHeight; } // crop factor /* double factor = 1; if (this.getCropeBaseline() == 0) {// width factor = new Integer(width).doubleValue() / new Integer(specificationsWidth).doubleValue(); } else {// height factor = new Integer(height).doubleValue() / new Integer(specificationsHeight).doubleValue(); }*/ double w = factor * specificationsWidth; double h = factor * specificationsHeight; if(w==h) { setCropeable(false); } cropAreaWidth = w; if(cropAreaWidth > width) cropAreaWidth = width; cropAreaHeight = h; if(cropAreaHeight > height) cropAreaHeight = height; /* * if(factor>1) { //determine croping section for(double * i=factor;i>1;i--) { //multiply specifications by factor int newWidth * = (int)(i * specificationsWidth); int newHeight = (int)(i * * specificationsHeight); //check if new size >= original image * if(width>=newWidth && height>=newHeight) { cropAreaWidth = newWidth; * cropAreaHeight = newHeight; break; } } } */ } public File getCroppedImage(File originalFile, int x1, int y1, int width, int height) throws Exception { if(!this.cropeable) { return originalFile; } FileNameMap fileNameMap = URLConnection.getFileNameMap(); String contentType = fileNameMap.getContentTypeFor(originalFile.getName()); String extension = contentType.substring(contentType.indexOf("/"),contentType.length()); BufferedImage image = ImageIO.read(originalFile); BufferedImage out = image.getSubimage(x1, y1, width, height); File tempFile = File.createTempFile("temp", "." + extension ); tempFile.deleteOnExit(); ImageIO.write(out, extension, tempFile); return tempFile; } public BufferedImage getCroppedImage() throws IOException { //out if croppedArea == 0 or file is null Rectangle goal = new Rectangle( (int)this.getCropAreaWidth(), (int) this.getCropAreaHeight()); //Then intersect it with the dimensions of your image: Rectangle clip = goal.intersection(new Rectangle(originalFile.getWidth(), originalFile.getHeight())); //Now, clip corresponds to the portion of bi that will fit within your goal. In this case 100 x50. //Now get the subImage using the value of clip. BufferedImage clippedImg = originalFile.getSubimage(clip.x, clip.y, clip.width, clip.height); return clippedImg; } public double getCropAreaWidth() { return cropAreaWidth; } public void setCropAreaWidth(int cropAreaWidth) { this.cropAreaWidth = cropAreaWidth; } public double getCropAreaHeight() { return cropAreaHeight; } public void setCropAreaHeight(int cropAreaHeight) { this.cropAreaHeight = cropAreaHeight; } public void setCropeable(boolean cropeable) { this.cropeable = cropeable; } public boolean isCropeable() { return cropeable; } }