许多Java Web应用都遇到过类似处理图片的需求:客户上传图片,后台对图片进行压缩,
同时打上logo(合成)。现针对这一需求做一个基于java awt的实现。关键代码如下:
public class ImageHelper {
private static java.util.List statusList = null;
/**
* 图片处理方法,将源图片和提示图片压缩后合并,返回合并后的文件二进制数组
* 图片类型:png
* 图片处理方式:8位RGBA颜色分量,带alpha通道
* @param sourceImg 源图片byte数组
* @param infoImg 提示信息图片byte数组
* @param targetSize 目标图片大小
* @param infoSize 信息图片大小
* */
public static byte[] tailorImageFile(byte[] sourceImg,byte[] infoImg,int targetSize,int infoSize){
return tailorImageFile(sourceImg,infoImg,"png",targetSize,infoSize);
}
/**
* 图片处理方法,将源图片和提示图片压缩后合并,返回合并后的文件byte数组
* 图片处理方式:8位RGBA颜色分量,带alpha通道
* @param sourceImg 源图片byte数组
* @param infoImg 提示信息图片byte数组
* @param imageType 图片类型
* @param targetSize 目标图片大小
* @param infoSize 信息图片大小
* */
public static byte[] tailorImageFile(byte[] sourceImg,byte[] infoImg,String imageType,int targetSize,int infoSize){
if(targetSize<infoSize){//提示信息图片的size必须小于目标图片的size
return null;
}
ByteArrayInputStream srcInputStream = null;
ByteArrayInputStream infoInputStream = null;
ByteArrayOutputStream targetOutputStream = null;
try {
srcInputStream = new ByteArrayInputStream(sourceImg);
infoInputStream = new ByteArrayInputStream(infoImg);
Image sourceImage = ImageIO.read(srcInputStream);//源图片
Image infoImage = ImageIO.read(infoInputStream);//信息图片
BufferedImage tempImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_INT_ARGB);//图片压缩方式:8位RGBA颜色分量,带alpha通道。
Graphics2D g2D = (Graphics2D)tempImage.getGraphics();
g2D.drawImage(sourceImage, 0, 0, targetSize, targetSize, null);//将源文件图片按一定比例绘入临时图片
g2D = (Graphics2D) tempImage.getGraphics();//获得绘入源图片的临时图片画布
g2D.drawImage(infoImage, targetSize-infoSize,targetSize-infoSize, infoSize, infoSize, null);//将提示信息按一定尺寸绘入临时图片
targetOutputStream = new ByteArrayOutputStream(1048576);//1M的长度
ImageIO.write(tempImage, imageType, targetOutputStream);//将绘制完成的图片写入输出流
byte[] targetImg = targetOutputStream.toByteArray();
return targetImg;
} catch (IOException e) {
e.printStackTrace();
} finally {
if(srcInputStream!=null)
{
try {
srcInputStream.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if(infoInputStream!=null)
{
try {
infoInputStream.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if(targetOutputStream!=null)
{
try {
targetOutputStream.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static byte[] zipImageFile(byte[] sourceImg,int targetSize){
return zipImageFile(sourceImg, targetSize, "png");
}
/**
* 图片处理方法,将源图片压缩,返回处理后的文件二进制数组
* 图片处理方式:8位RGBA颜色分量,带alpha通道
* @param sourceImg 源图片byte数组
* @param imageType 图片类型
* @param targetSize 目标图片大小
* */
public static byte[] zipImageFile(byte[] sourceImg,int targetSize,String imageType){
ByteArrayInputStream srcInputStream = null;
ByteArrayOutputStream targetOutputStream = null;
try{
srcInputStream = new ByteArrayInputStream(sourceImg);
Image sourceImage = ImageIO.read(srcInputStream);//源图片
BufferedImage tempImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_INT_ARGB);//图片压缩方式:8位RGBA颜色分量,带alpha通道。
Graphics2D g2D = (Graphics2D)tempImage.getGraphics();
g2D.drawImage(sourceImage, 0, 0, targetSize, targetSize, null);//将源文件图片按一定比例绘入临时图片
targetOutputStream = new ByteArrayOutputStream(1048576);//1M的长度
ImageIO.write(tempImage, imageType, targetOutputStream);//将绘制完成的图片写入输出流
byte[] targetImg = targetOutputStream.toByteArray();
return targetImg;
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if(srcInputStream!=null)
{
try {
srcInputStream.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if(targetOutputStream!=null)
{
try {
targetOutputStream.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}