Java合并获取OSS图片对象并合并

Java合并获取OSS图片对象并合并

最近要把一批相同规模的图片合并在一张图上。图片是存放在阿里OSS上的,最后合并后,还是要放回OSS。参考了这篇文章:Java图片合并。结合自己的需求,实现了一个简单的oss图片合并。

一:获取oss图片对象

  /**
     * @Author: Rain
     * @Description:
     * @Date: 2021/6/20 13:27
     * @Param: url 获取的图片的路径集合
     * @return: java.util.List<com.aliyun.oss.model.OSSObject>
     **/

    public List<OSSObject> getOssObject(List<String> url) {
        List<OSSObject> list = new ArrayList<>();
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        for (String objectName : url) {
//            String objectName = "test/2020_1030_4_4.jpg";
            // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
            list.add(ossObject);
        }
      
        return list;
    }

二:合并图片

 /** 
     * @Author: Rain
     * @Description:  
     * @Date: 2021/6/20 13:30 
     * @Param: ossObjects oss图片对象
     * @Param: a 每排多少张图片
     * @return: java.awt.image.BufferedImage 
     **/
public static BufferedImage mergeImage(List<OSSObject> ossObjects,float a){
        BufferedImage mergedImage = null;
        try {
            int totalHeight = 0;
            int maxWidth = 0;
            List<BufferedImage> imageList = new ArrayList<>();
            for(OSSObject ossObject:ossObjects){
                BufferedImage image = ImageIO.read(ossObject.getObjectContent());
                imageList.add(image);
                totalHeight=image.getHeight();
                if(image.getWidth() > maxWidth){
                    maxWidth = image.getWidth();
                }
            }
            int size = imageList.size();
            mergedImage = new BufferedImage((int)(maxWidth*a),(int)(totalHeight*Math.ceil(size/a)),BufferedImage.TYPE_3BYTE_BGR);
            for(int i=0;i<imageList.size();i++){
                for(int h=0;h<imageList.get(i).getHeight();h++){
                    for(int w=0;w<imageList.get(i).getWidth();w++){
                        //确定图片在第几列
                        int weigh = (int) (w + (i % a) * imageList.get(i).getWidth());
                        //确定图片在第几行
                        int hight = (int) (h + Math.floor(i / a) * imageList.get(i).getHeight());
                        mergedImage.setRGB(weigh,hight,imageList.get(i).getRGB(w,h));
                    }
                }
            }
            //图片写到本地
//            ImageIO.write(mergedImage,"jpg",new File("D:\\files\\new.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mergedImage;
    }

三:转换BufferedImage 为InputStream

  /** 
   * @Author: Rain
   * @Description:  将BufferedImage转换为InputStream
   * @Date: 2021/6/20 13:33 
   * @Param: image  
   * @return: java.io.InputStream 
   **/
    public static  InputStream bufferedImageToInputStream(BufferedImage image){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", os);
            InputStream input = new ByteArrayInputStream(os.toByteArray());
            return input;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

四: 写回OSS

  public void readBufferedImage(InputStream inputStream) {
        String url = AttachEnum.PATH.getMessage();//上传的路径
        String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg";//生成的文件名
        String objectName = url + "/" + finalFileName;
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(new PutObjectRequest(bucketName, objectName, inputStream));
        ossClient.shutdown();
    }

本例的图片规格都是一样的,如果不是,需要重新设计对应的高度和宽度。一些方法的具体调用没有贴出来,有疑问可以留言给我。小编刚入行的菜鸟,写的东西有不对的地方请大佬多多指教。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值