package railo.runtime.img.coder;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.imageio.ImageIO;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.commons.lang.StringUtil;
import railo.runtime.img.ImageUtil;
import railo.runtime.img.JAIUtil;
import railo.runtime.img.PSDReader;
class JRECoder extends Coder {
private String[] writerFormatNames;
private String[] readerFormatNames;
protected JRECoder(){
super();
}
/**
* translate a file resource to a buffered image
* @param res
* @return
* @throws IOException
*/
public final BufferedImage toBufferedImage(Resource res,String format) throws IOException {
if(StringUtil.isEmpty(format))format=ImageUtil.getFormat(res);
if("psd".equalsIgnoreCase(format)) {
PSDReader reader = new PSDReader();
InputStream is=null;
try {
reader.read(is=res.getInputStream());
return reader.getImage();
}
finally {
IOUtil.closeEL(is);
}
}
if(JAIUtil.isSupportedReadFormat(format)){
return JAIUtil.read(res);
}
BufferedImage img=null;
InputStream is=null;
try {
img = ImageIO.read(is=res.getInputStream());
}
finally {
IOUtil.closeEL(is);
}
if(img==null && StringUtil.isEmpty(format)) {
return JAIUtil.read(res);
}
return img;
}
/**
* translate a binary array to a buffered image
* @param binary
* @return
* @throws IOException
*/
public final BufferedImage toBufferedImage(byte[] bytes,String format) throws IOException {
if(StringUtil.isEmpty(format))format=ImageUtil.getFormat(bytes,null);
if("psd".equalsIgnoreCase(format)) {
PSDReader reader = new PSDReader();
reader.read(new ByteArrayInputStream(bytes));
return reader.getImage();
}
if(JAIUtil.isSupportedReadFormat(format)){
return JAIUtil.read(new ByteArrayInputStream(bytes),format);
}
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
if(img==null && StringUtil.isEmpty(format))
return JAIUtil.read(new ByteArrayInputStream(bytes),null);
return img;
}
public final String[] getWriterFormatNames() {
if(writerFormatNames==null) {
String[] iio = ImageIO.getWriterFormatNames();
String[] jai = JAIUtil.isJAISupported()?JAIUtil.getSupportedWriteFormat():null;
writerFormatNames=mixTogetherOrdered(iio,jai);
}
return writerFormatNames;
}
public final String[] getReaderFormatNames() {
if(readerFormatNames==null){
String[] iio = ImageIO.getReaderFormatNames();
String[] jai = JAIUtil.isJAISupported()?JAIUtil.getSupportedReadFormat():null;
readerFormatNames=mixTogetherOrdered(iio,jai);
}
return readerFormatNames;
}
public static final String[] mixTogetherOrdered(String[] names1,String[] names2) {
Set<String> set=new HashSet<String>();
if(names1!=null)for(int i=0;i<names1.length;i++){
set.add(names1[i].toLowerCase());
}
if(names2!=null)for(int i=0;i<names2.length;i++){
set.add(names2[i].toLowerCase());
}
names1= set.toArray(new String[set.size()]);
Arrays.sort(names1);
return names1;
}
}