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