背景描述:最近在做app推送消息,在做關注人推送需要把有更新的關注人頭像合成一張圖檔,展示示例如下:

花了一些時間來弄這個,之前沒做過圖檔處理,是以記錄一下,合成之後的樣例如下:
下面是代碼:
/**
*
* @Title: modifyImagetogeter
* @Description: 将幾張圖檔合成一張圖檔
* @param: @param b1
* @param: @param b2
* @param: @param b3
* @param: @return
* @return: BufferedImage
* @throws
* @author:石德斌
* @date:2020年4月21日 下午3:26:41
*/
public static BufferedImage modifyImagetogeter(BufferedImage[] image) {
//建立一個304*304的圖檔
BufferedImage tag = new BufferedImage(304,304,BufferedImage.TYPE_INT_RGB);
try {
Graphics2D graphics = tag.createGraphics();
//設定顔色為218,223,224
graphics.setColor(new Color(218,223,224));
//填充顔色
graphics.fillRect(0, 0, 304, 304);
int count = image.length;
//根據不同的合成圖檔數量設定圖檔放置位置
if(count == 1){
int startX = 108;
int startY = 108;
BufferedImage b = image[0];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
}else if(count == 2){
int startX = 60;
int startY = 108;
BufferedImage b1 = image[0];
graphics.drawImage(b1, startX, startY, b1.getWidth(), b1.getHeight(), null);
BufferedImage b2 = image[1];
startX = startX + b1.getWidth()+8;
graphics.drawImage(b2, startX, startY, b2.getWidth(), b2.getHeight(), null);
}else if(count == 3){
int startX = 108;
int startY = 60;
BufferedImage b1 = image[0];
graphics.drawImage(b1, startX, startY, b1.getWidth(), b1.getHeight(), null);
BufferedImage b2 = image[1];
startX = 60;
startY = 60 + b1.getHeight() + 8;
graphics.drawImage(b2, startX, startY, b2.getWidth(), b2.getHeight(), null);
BufferedImage b3 = image[2];
startX = startX + b2.getWidth()+8;
graphics.drawImage(b3, startX, startY, b3.getWidth(), b3.getHeight(), null);
}else if(count == 4){
int startX = 60;
int startY = 60;
BufferedImage b1 = image[0];
graphics.drawImage(b1, startX, startY, b1.getWidth(), b1.getHeight(), null);
BufferedImage b2 = image[1];
startX = 60 + b1.getWidth() + 8;
graphics.drawImage(b2, startX, startY, b2.getWidth(), b2.getHeight(), null);
BufferedImage b3 = image[2];
startX = 60;
startY = 60 + b2.getHeight() + 8;
graphics.drawImage(b3, startX, startY, b3.getWidth(), b3.getHeight(), null);
BufferedImage b4 = image[3];
startX = 60 + b3.getWidth() + 8;
graphics.drawImage(b4, startX, startY, b4.getWidth(), b4.getHeight(), null);
}else if(count == 5){
int startX = 60;
int startY = 60;
BufferedImage b1 = image[0];
graphics.drawImage(b1, startX, startY, b1.getWidth(), b1.getHeight(), null);
BufferedImage b2 = image[1];
startX = startX + b1.getWidth()+8;
graphics.drawImage(b2, startX, startY, b2.getWidth(), b2.getHeight(), null);
startX = 12;
startY = 12 + startY + b2.getHeight();
for(int i = 2;i<count;i++){
BufferedImage b = image[i];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = startX + b.getWidth() + 8;
}
}else if(count == 6){
int startX = 12;
int startY = 60;
for(int i = 0;i<count;i++){
BufferedImage b = image[i];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = startX + b.getWidth() + 8;
if((i+1)%3 == 0){
startY = startY + b.getHeight() + 8;
startX = 12;
}
}
}else if(count == 7){
int startX = 108;
int startY = 12;
BufferedImage b = image[0];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = 12;
startY = startY + 8 + b.getHeight();
for(int i = 1;i<count;i++){
b = image[i];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = startX + b.getWidth() + 8;
if(i%3 == 0){
startY = startY + b.getHeight() + 8;
startX = 12;
}
}
}else if(count == 8){
int startX = 60;
int startY = 12;
BufferedImage b1 = image[0];
graphics.drawImage(b1, startX, startY, b1.getWidth(), b1.getHeight(), null);
BufferedImage b2 = image[1];
startX = startX + b1.getWidth()+8;
graphics.drawImage(b2, startX, startY, b2.getWidth(), b2.getHeight(), null);
startX = 12;
startY = 12 + b2.getHeight() + 8;
for(int i = 2;i<count;i++){
BufferedImage b = image[i];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = startX + b.getWidth() + 8;
if(i == 4){
startY = startY + b.getHeight() + 8;
startX = 12;
}
}
}else if(count == 9){
int startX = 12;
int startY = 12;
for(int i = 0;i<count;i++){
BufferedImage b = image[i];
graphics.drawImage(b, startX, startY, b.getWidth(), b.getHeight(), null);
startX = startX + b.getWidth() + 8;
if((i+1)%3 == 0){
startY = startY + b.getHeight() + 8;
startX = 12;
}
}
}
graphics.dispose();
} catch (Exception e) {
logger.error("推送同比壓縮圖檔出錯{}",e);
}
return tag;
}
public static BufferedImage loadImageLocal(String imgName) {
try {
return ImageIO.read(new File(imgName));
// return ImageIO.read(new URL(imgName));
} catch (IOException e) {
logger.error("推送同比壓縮圖檔出錯{}",e);
}
return null;
}
public static void writeImageLocal(String newImage, BufferedImage img) {
if (newImage != null && img != null) {
try {
File outputfile = new File(newImage);
ImageIO.write(img, "jpg", outputfile);
} catch (IOException e) {
logger.error("推送同比壓縮圖檔出錯{}",e);
}
}
}
/**
*
* @Title: handleLarge
* @Description: 同比例壓縮圖檔,使圖檔形成相同大小
* @param: @param image
* @param: @return
* @return: BufferedImage[]
* @throws
* @author:石德斌
* @date:2020年4月23日 上午10:36:11
*/
private static BufferedImage[] handleLarge(Integer width,Integer height,BufferedImage[] image) {
BufferedImage[] b = new BufferedImage[image.length];
for (int i = 0; i < image.length; i++) {
BufferedImage sourceImage = image[i];
try {
b[i] = ImageUtils.zoom2(width, height, sourceImage);
} catch (Exception e) {
logger.error("推送同比壓縮圖檔出錯{}",e);
}
}
return b;
}
public static void main(String[] args) {
// BufferedImage b1 = loadImageLocal("C:\\Users\\Admin\\Documents\\WeChat Files\\a010662716\\FileStorage\\File\\2020-04\\頭像\\");
try {
//用于合成的圖檔數量
int count = 9;
BufferedImage[] image =new BufferedImage[count];
for(int i =0;i<count;i++){
image[i]=loadImageLocal("C:\\Users\\Admin\\Documents\\WeChat Files\\a010662716\\FileStorage\\File\\2020-04\\頭像\\"+(i+1)+".png");
}
writeImageLocal("C:\\Users\\Admin\\Desktop\\"+count+".png", modifyImagetogeter(handleLarge(88,88,image)));
} catch (Exception e) {
e.printStackTrace();
}
}
public static BufferedImage zoom2(int width,int height,BufferedImage sourceImage) throws Exception {
if( sourceImage == null ){
return sourceImage;
}
// 計算x軸y軸縮放比例--如需等比例縮放,在調用之前確定參數width和height是等比例變化的
double ratiox = (new Integer(width)).doubleValue()/ sourceImage.getWidth();
double ratioy = (new Integer(height)).doubleValue()/ sourceImage.getHeight();
AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratiox, ratioy), null);
BufferedImage bufImg = op.filter(sourceImage, null);
return bufImg;
}