Java圖片合成,壓縮

許多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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章