/* * Created on Jun 6, 2006 */ package org.openedit.images; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import javax.imageio.ImageIO; import org.openedit.repository.InputStreamItem; import com.openedit.page.Page; import com.openedit.page.manage.PageManager; import com.openedit.users.User; import com.openedit.util.FileUtils; import com.openedit.util.PathUtilities; public class ImageCrop { protected Rectangle fieldRange; protected PageManager fieldPageManager; protected float fieldScaleX; protected float fieldScaleY; public Rectangle getRange() { return fieldRange; } public void setRange(Rectangle inRange) { fieldRange = inRange; } public void setRange( int inX, int inY, int inWidth, int inHeight) { setRange(new Rectangle(inX, inY, inWidth, inHeight)); } public void crop( String inPath, User inUser, String inMessage ) throws Exception { Page input = getPageManager().getPage(inPath); if ( input.exists() ) { InputStream in = null; OutputStream out = null; File tmp = File.createTempFile("crop", "image"); try { in = input.getContentItem().getInputStream(); BufferedImage origImage = ImageIO.read(in); BufferedImage done = crop(origImage); String type = PathUtilities.extractPageType(inPath); out = new FileOutputStream( tmp ); ImageIO.write(done, type, out); } finally { FileUtils.safeClose(in); FileUtils.safeClose(out); } InputStreamItem item = new InputStreamItem(); item.setAuthor(inUser.getUserName()); item.setMessage(inMessage); item.setPath(inPath); item.setInputStream(new FileInputStream(tmp)); item.setMakeVersion(true); input.setContentItem(item); getPageManager().putPage(input); tmp.delete(); } } public BufferedImage crop(BufferedImage inImage) { //BufferedImage origImage = ImageIO.read( inInImageFile ); int scaledX = (int)getRange().getX(); int scaledY = (int)getRange().getY(); int scaledWidth = (int)getRange().getWidth(); int scaledHeight = (int)getRange().getHeight(); if(getScaleX() > 0) { scaledX = (int)(scaledX * getScaleX()); scaledWidth = (int)(scaledWidth * getScaleX()); } if(getScaleY() > 0) { scaledY = (int)(scaledY * getScaleY()); scaledHeight = (int)(scaledHeight * getScaleY()); } int x = Math.max(0, scaledX); int y = Math.max(0, scaledY); int w = Math.min(scaledWidth, inImage.getWidth() - x ); int h = Math.min(scaledHeight, inImage.getHeight() - y); x = Math.min(inImage.getWidth(), x); y = Math.min(inImage.getHeight(), y ); BufferedImage crop = inImage.getSubimage(x,y,w, h); return crop; } public PageManager getPageManager() { return fieldPageManager; } public void setPageManager(PageManager inPageManager) { fieldPageManager = inPageManager; } public void setRange(String inX, String inY, String inWidth, String inHeight) { setRange(Integer.parseInt(inX),Integer.parseInt(inY),Integer.parseInt(inWidth),Integer.parseInt(inHeight) ); } public void resize(String inEditPath, User inUser, String inMessage) throws Exception { Page input = getPageManager().getPage(inEditPath); if ( input.exists() ) { InputStream in = null; OutputStream out = null; File tmp = File.createTempFile("resize", "image"); try { in = input.getContentItem().getInputStream(); BufferedImage origImage = ImageIO.read(in); BufferedImage scaledImage = new BufferedImage( getRange().width, getRange().height, BufferedImage.TYPE_INT_RGB ); Graphics2D scaledGraphics = scaledImage.createGraphics(); scaledGraphics.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); scaledGraphics.drawImage( origImage, 0, 0, getRange().width, getRange().height, null ); String type = PathUtilities.extractPageType(inEditPath); out = new FileOutputStream( tmp ); ImageIO.write(scaledImage, type, out); } finally { FileUtils.safeClose(in); FileUtils.safeClose(out); } InputStreamItem item = new InputStreamItem(); item.setAuthor(inUser.getUserName()); item.setMessage(inMessage); item.setPath(inEditPath); item.setInputStream(new FileInputStream(tmp)); item.setMakeVersion(true); input.setContentItem(item); getPageManager().putPage(input); tmp.delete(); } } public float getScaleX() { return fieldScaleX; } public void setScaleX(float inScaleX) { fieldScaleX = inScaleX; } public void setScaleX(String inScaleX) { fieldScaleX = Float.parseFloat(inScaleX); } public Float getScaleY() { return fieldScaleY; } public void setScaleY(float inScaleY) { fieldScaleY = inScaleY; } public void setScaleY(String inScaleY) { fieldScaleY = Float.parseFloat(inScaleY); } public int getScaledWidth() { float x = getScaleX(); if(x > 0) { return (int)(getRange().width * x); } else { return (int)getRange().width; } } public int getScaledHeight() { float y = getScaleY(); if(y > 0) { return (int)(getRange().height * y); } else { return (int)getRange().height; } } }