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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值