FastDFS+java九宮格微信群聊頭像
阿新 • • 發佈:2018-11-12
參考的工具類出自部落格:https://www.jianshu.com/p/394f9b0357b3
我僅僅只是改了下:通過getCombinationOfhead方法返回的是 byte[] 位元組陣列,其它不變。(因為我要將圖片上傳到 FastDFS,然後通過FastDFS返回 url 連結)
public final class ImageUtil { /** * 圖片的間隙 */ private static final int SIDE = 6; /** * 畫板尺寸 */ private static final int CANVANS_W = 112; private static final int CANVANS_H = 112; /** * 尺寸1 (小) */ private static final int ONE_IMAGE_SIZE = CANVANS_H - (2 * SIDE); /** * 尺寸2 (中) */ private static final int TWO_IMAGE_SIZE = (CANVANS_H - (3 * SIDE)) / 2; /** * 尺寸3 (大) */ private static final int FIVE_IMAGE_SIZE = (CANVANS_H - (4 * SIDE)) / 3; private ImageUtil() { } /** * 生成群組頭像 * * @param paths 圖片連結 * @return * @throws IOException */ public static byte[] getCombinationOfhead(List<String> paths) throws IOException { List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>(); int imageSize = 0; if (paths.size() <= 1) { //若為一張圖片 imageSize = ONE_IMAGE_SIZE; } else if (paths.size() > 1 && paths.size() < 5) { //若為2-4張圖片 imageSize = TWO_IMAGE_SIZE; } else { //若>=5張圖片 imageSize = FIVE_IMAGE_SIZE; } for (int i = 0; i < paths.size(); i++) { BufferedImage resize2 = ImageUtil.resize2(paths.get(i), imageSize, imageSize, true); bufferedImages.add(resize2); } BufferedImage outImage = new BufferedImage(CANVANS_W, CANVANS_H, BufferedImage.TYPE_INT_RGB); // 生成畫布 Graphics g = outImage.getGraphics(); Graphics2D g2d = (Graphics2D) g; // 設定背景色 g2d.setBackground(new Color(231, 231, 231)); // 通過使用當前繪圖表面的背景色進行填充來清除指定的矩形。 g2d.clearRect(0, 0, CANVANS_W, CANVANS_H); // 開始拼湊 根據圖片的數量判斷該生成那種樣式的組合頭像目前為九種 for (int i = 1; i <= bufferedImages.size(); i++) { Integer size = bufferedImages.size(); switch (size) { case 1: g2d.drawImage(bufferedImages.get(i - 1), SIDE, SIDE, null); break; case 2: if (i == 1) { g2d.drawImage(bufferedImages.get(i - 1), SIDE, (CANVANS_W - imageSize) / 2, null); } else { g2d.drawImage(bufferedImages.get(i - 1), 2 * SIDE + imageSize, (CANVANS_W - imageSize) / 2, null); } break; case 3: if (i == 1) { g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - imageSize) / 2, SIDE, null); } else { g2d.drawImage(bufferedImages.get(i - 1), (i - 1) * SIDE + (i - 2) * imageSize, imageSize + (2 * SIDE), null); } break; case 4: if (i <= 2) { g2d.drawImage(bufferedImages.get(i - 1), i * SIDE + (i - 1) * imageSize, SIDE, null); } else { g2d.drawImage(bufferedImages.get(i - 1), (i - 2) * SIDE + (i - 3) * imageSize, imageSize + 2 * SIDE, null); } break; case 5: if (i <= 2) { g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2 + (i - 1) * imageSize + (i - 1) * SIDE, (CANVANS_W - 2 * imageSize - SIDE) / 2, null); } else { g2d.drawImage(bufferedImages.get(i - 1), (i - 2) * SIDE + (i - 3) * imageSize, ((CANVANS_W - 2 * imageSize - SIDE) / 2) + imageSize + SIDE, null); } // break; case 6: if (i <= 3) { g2d.drawImage(bufferedImages.get(i - 1), SIDE * i + imageSize * (i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2, null); } else { g2d.drawImage(bufferedImages.get(i - 1), ((i - 3) * SIDE) + ((i - 4) * imageSize), ((CANVANS_W - 2 * imageSize - SIDE) / 2) + imageSize + SIDE, null); } break; case 7: if (i <= 1) { g2d.drawImage(bufferedImages.get(i - 1), 2 * SIDE + imageSize, SIDE, null); } if (i <= 4 && i > 1) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 1) * SIDE) + ((i - 2) * imageSize), 2 * SIDE + imageSize, null); } if (i <= 7 && i > 4) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 4) * SIDE) + ((i - 5) * imageSize), 3 * SIDE + 2 * imageSize, null); } break; case 8: if (i <= 2) { g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2 + (i - 1) * imageSize + (i - 1) * SIDE, SIDE, null); } if (i <= 5 && i > 2) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 2) * SIDE) + ((i - 3) * imageSize), 2 * SIDE + imageSize, null); } if (i <= 8 && i > 5) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 5) * SIDE) + ((i - 6) * imageSize), 3 * SIDE + 2 * imageSize, null); } break; case 9: if (i <= 3) { g2d.drawImage(bufferedImages.get(i - 1), (i * SIDE) + ((i - 1) * imageSize), SIDE, null); } if (i <= 6 && i > 3) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 3) * SIDE) + ((i - 4) * imageSize), 2 * SIDE + imageSize, null); } if (i <= 9 && i > 6) { g2d.drawImage(bufferedImages.get(i - 1), ((i - 6) * SIDE) + ((i - 7) * imageSize), 3 * SIDE + 2 * imageSize, null); } break; default: break; } } //將BufferedImage轉為byte[]位元組陣列 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(outImage, "jpg", baos ); baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close(); return imageInByte; } /** * 圖片縮放 * * @param filePath 圖片路徑 * @param height 高度 * @param width 寬度 * @param bb 比例不對時是否需要補白 */ public static BufferedImage resize2(String filePath, int height, int width, boolean bb) { try { double ratio = 0; // 縮放比例 BufferedImage bi = null; if (filePath.indexOf("http://") == 0) { bi = ImageIO.read(new URL(filePath)); } else { bi = ImageIO.read(new File(filePath)); } Image itemp = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH); // 計算比例 if ((bi.getHeight() > height) || (bi.getWidth() > width)) { if (bi.getHeight() > bi.getWidth()) { ratio = (new Integer(height)).doubleValue() / bi.getHeight(); } else { ratio = (new Integer(width)).doubleValue() / bi.getWidth(); } AffineTransformOp op = new AffineTransformOp( AffineTransform.getScaleInstance(ratio, ratio), null); itemp = op.filter(bi, null); } if (bb) { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); g.setColor(Color.white); g.fillRect(0, 0, width, height); if (width == itemp.getWidth(null)) { g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); } else { g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); } g.dispose(); itemp = image; } return (BufferedImage) itemp; } catch (IOException e) { e.printStackTrace(); } return null; } }
關於FastDFS與SpringBoot的配置可以看該博文:https://blog.csdn.net/xyang81/article/details/52850667
使用的FastDFS版本:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.2</version>
</dependency>
在FastDFSClientWrapper中 新增了一個方法:(其實只是把入參變成了 byte[])
@Component public class FastDFSClientWrapper { @Autowired private FastFileStorageClient storageClient; /** * 上傳byte[]位元組陣列 */ public String uploadFile(byte[] buff, String fileExtension) { ByteArrayInputStream stream = new ByteArrayInputStream(buff); StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null); return getResAccessUrl(storePath); } // 封裝圖片URL地址 private String getResAccessUrl(StorePath storePath) { return storePath.getFullPath(); } }
然後就可以使用了:
@RestController
@RequestMapping("/")
public class GroupsController {
@Autowired
private FastDFSClientWrapper dfsClient;
/**
* @param picUrls FastDFS上的圖片連結集合
* @return 返回圖片在FastDFS上的url連結
*/
private String init9Pic(List<String> picUrls){
try {
//生成九宮格群組頭像
byte[] buff = ImageUtil.getCombinationOfhead(picUrls);
//上傳到FastDFS
String url = dfsClient.uploadFile(buff,"jpg");
if(!Objects.equals(url, "")){
return url;
}
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
搞定: