package railo.runtime.img;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.io.IOException;
import javax.imageio.stream.ImageInputStream;
import org.apache.commons.codec.binary.Base64;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ExpressionException;
import railo.runtime.img.coder.Coder;
public class ImageUtil {
private static Coder coder;
static {
coder = Coder.getInstance();
}
public static String[] getWriterFormatNames() {
return coder.getWriterFormatNames();
}
public static String[] getReaderFormatNames() {
return coder.getReaderFormatNames();
}
/**
* translate a file resource to a buffered image
* @param res
* @return
* @throws IOException
*/
public static BufferedImage toBufferedImage(Resource res,String format) throws IOException {
return coder.toBufferedImage(res, format);
}
/**
* translate a binary array to a buffered image
* @param binary
* @return
* @throws IOException
*/
public static BufferedImage toBufferedImage(byte[] bytes,String format) throws IOException {
return coder.toBufferedImage(bytes, format);
}
public static byte[] readBase64(String b64str) throws ExpressionException {
if(StringUtil.isEmpty(b64str))
throw new ExpressionException("base64 string is empty");
int index = b64str.indexOf("base64,");
if(index!=-1)b64str=b64str.substring(index + 7);
return Base64.decodeBase64(b64str.getBytes());
}
public static String getFormat(Resource res) throws IOException {
String ext=getFormatFromExtension(res,null);
if(ext!=null) return ext;
String mt=ResourceUtil.getMimeType(res, null);
if(mt==null) return null;//throw new IOException("can't extract mimetype from ["+res+"]");
return getFormatFromMimeType(mt);
}
public static String getFormat(byte[] binary) throws IOException {
return getFormatFromMimeType(IOUtil.getMimeType(binary, ""));
}
public static String getFormat(byte[] binary,String defaultValue) {
return getFormatFromMimeType(IOUtil.getMimeType(binary, ""),defaultValue);
}
public static String getFormatFromExtension(Resource res, String defaultValue) {
String ext=ResourceUtil.getExtension(res,null);
if("gif".equalsIgnoreCase(ext))return "gif";
if("jpg".equalsIgnoreCase(ext))return "jpg";
if("jpe".equalsIgnoreCase(ext))return "jpg";
if("jpeg".equalsIgnoreCase(ext))return "jpg";
if("png".equalsIgnoreCase(ext))return "png";
if("tiff".equalsIgnoreCase(ext))return "tiff";
if("tif".equalsIgnoreCase(ext))return "tiff";
if("bmp".equalsIgnoreCase(ext))return "bmp";
if("bmp".equalsIgnoreCase(ext))return "bmp";
if("wbmp".equalsIgnoreCase(ext))return "wbmp";
if("ico".equalsIgnoreCase(ext))return "bmp";
if("wbmp".equalsIgnoreCase(ext))return "wbmp";
if("psd".equalsIgnoreCase(ext))return "psd";
if("fpx".equalsIgnoreCase(ext))return "fpx";
if("pnm".equalsIgnoreCase(ext))return "pnm";
if("pgm".equalsIgnoreCase(ext))return "pgm";
if("pbm".equalsIgnoreCase(ext))return "pbm";
if("ppm".equalsIgnoreCase(ext))return "ppm";
return defaultValue;
}
public static String getFormatFromMimeType(String mt) throws IOException {
String format = getFormatFromMimeType(mt, null);
if(format!=null) return format;
if(StringUtil.isEmpty(mt))throw new IOException("cannot find Format of given image");//31
throw new IOException("can't find Format ("+mt+") of given image");
}
public static String getFormatFromMimeType(String mt, String defaultValue) {
if("image/gif".equals(mt)) return "gif";
if("image/gi_".equals(mt)) return "gif";
if("image/jpeg".equals(mt)) return "jpg";
if("image/jpg".equals(mt)) return "jpg";
if("image/jpe".equals(mt)) return "jpg";
if("image/pjpeg".equals(mt)) return "jpg";
if("image/vnd.swiftview-jpeg".equals(mt)) return "jpg";
if("image/pipeg".equals(mt)) return "jpg";
if("application/x-jpg".equals(mt)) return "jpg";
if("application/jpg".equals(mt)) return "jpg";
if("image/jp_".equals(mt)) return "jpg";
if("image/png".equals(mt)) return "png";
if("image/x-png".equals(mt))return "png";
if("application/x-png".equals(mt)) return "png";
if("application/png".equals(mt)) return "png";
if("image/tiff".equals(mt)) return "tiff";
if("image/tif".equals(mt)) return "tiff";
if("image/x-tif".equals(mt)) return "tiff";
if("image/x-tiff".equals(mt)) return "tiff";
if("application/tif".equals(mt)) return "tiff";
if("application/x-tif".equals(mt)) return "tiff";
if("application/tiff".equals(mt)) return "tiff";
if("application/x-tiff".equals(mt)) return "tiff";
if("image/bmp".equals(mt)) return "bmp";
if("image/vnd.wap.wbmp".equals(mt)) return "wbmp";
if("image/fpx".equals(mt)) return "fpx";
if("image/x-fpx".equals(mt)) return "fpx";
if("image/vnd.fpx".equals(mt)) return "fpx";
if("image/vnd.netfpx".equals(mt)) return "fpx";
if("image/vnd.fpx".equals(mt)) return "fpx";
if("application/vnd.netfpx".equals(mt)) return "fpx";
if("application/vnd.fpx".equals(mt)) return "fpx";
if("image/x-portable-anymap".equals(mt)) return "pnm";
if("image/x-portable/anymap".equals(mt)) return "pnm";
if("image/x-pnm".equals(mt)) return "pnm";
if("image/pnm".equals(mt)) return "pnm";
if("image/x-portable-graymap".equals(mt)) return "pgm";
if("image/x-portable/graymap".equals(mt)) return "pgm";
if("image/x-pgm".equals(mt)) return "pgm";
if("image/pgm".equals(mt)) return "pgm";
if("image/portable bitmap".equals(mt)) return "pbm";
if("image/x-portable-bitmap".equals(mt)) return "pbm";
if("image/x-portable/bitmap".equals(mt)) return "pbm";
if("image/x-pbm".equals(mt)) return "pbm";
if("image/pbm".equals(mt)) return "pbm";
if("image/x-portable-pixmap".equals(mt)) return "ppm";
if("application/ppm".equals(mt)) return "ppm";
if("application/x-ppm".equals(mt)) return "ppm";
if("image/x-p".equals(mt)) return "ppm";
if("image/x-ppm".equals(mt)) return "ppm";
if("image/ppm".equals(mt)) return "ppm";
if("image/ico".equals(mt)) return "ico";
if("image/x-icon".equals(mt)) return "ico";
if("application/ico".equals(mt)) return "ico";
if("application/x-ico".equals(mt)) return "ico";
if("image/photoshop".equals(mt)) return "psd";
if("image/x-photoshop".equals(mt)) return "psd";
if("image/psd".equals(mt)) return "psd";
if("application/photoshop".equals(mt)) return "psd";
if("application/psd".equals(mt)) return "psd";
if("zz-application/zz-winassoc-psd".equals(mt)) return "psd";
// can not terminate this types exactly
// image/x-xbitmap
// application/x-win-bitmap
// image/x-win-bitmap
// application/octet-stream
return defaultValue;
}
public static String getMimeTypeFromFormat(String mt) throws IOException {
if("gif".equals(mt)) return "image/gif";
if("jpeg".equals(mt)) return "image/jpg";
if("jpg".equals(mt)) return "image/jpg";
if("jpe".equals(mt)) return "image/jpg";
if("png".equals(mt)) return "image/png";
if("tiff".equals(mt)) return "image/tiff";
if("tif".equals(mt)) return "image/tiff";
if("bmp".equals(mt)) return "image/bmp";
if("bmp".equals(mt)) return "image/bmp";
if("wbmp".equals(mt)) return "image/vnd.wap.wbmp";
if("fpx".equals(mt)) return "image/fpx";
if("pgm".equals(mt)) return "image/x-portable-graymap";
if("pnm".equals(mt)) return "image/x-portable-anymap";
if("pbm".equals(mt)) return "image/x-portable-bitmap";
if("ppm".equals(mt)) return "image/x-portable-pixmap";
if("ico".equals(mt)) return "image/ico";
if("psd".equals(mt)) return "image/psd";
if(StringUtil.isEmpty(mt))throw new IOException("can't find Format of given image");//31
throw new IOException("can't find Format ("+mt+") of given image");
}
public static void closeEL(ImageInputStream iis) {
try {
if(iis!=null)iis.close();
}
catch (Throwable t) {}
}
public static BufferedImage createBufferedImage(BufferedImage image, int columns, int rows) {
ColorModel colormodel = image.getColorModel();
BufferedImage newImage;
if(colormodel instanceof IndexColorModel) {
if(colormodel.getTransparency() != 1)
newImage = new BufferedImage(columns, rows, 2);
else
newImage = new BufferedImage(columns, rows, 1);
}
else {
newImage = new BufferedImage(colormodel, image.getRaster().createCompatibleWritableRaster(columns, rows), colormodel.isAlphaPremultiplied(), null);
}
return newImage;
}
public static BufferedImage createBufferedImage(BufferedImage image) {
return createBufferedImage(image, image.getWidth(), image.getHeight());
}
}