許多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;
}
}