JAVA生成九宫格图片 微信群头像(不限制张数)拿走即可用
生活随笔
收集整理的這篇文章主要介紹了
JAVA生成九宫格图片 微信群头像(不限制张数)拿走即可用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
廢話不多說 先上效果 再上代碼
package cn.specil.util.file;import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List;public class MakeGropHeadPicUtil {/**圖片寬度*/private final Integer PIC_WIDTH = 422;/**圖片高度*/private final Integer PIC_HEIGHT = 422;/**空白寬度*/private final Integer PIC_SPACE = 14;/**小圖片寬度*/private Double LUMP_WIDTH = null;/**小圖片起始點橫坐標*/private Double LUMP_POINT_X = null;/**小圖片起始點縱坐標*/private Double LUMP_POINT_Y = null;/*** 思考筆記 可以跳過* 2 和 4 的區別 向下偏移量 0.5 LUMP_WIDTH+ 0.5 PIC_SPACE* 3 和 4 的區別 第一張圖向右偏移量 0.5 LUMP_WIDTH + 0.5 PIC_SPACE* 5 和 6 的區別 第一張圖向右偏移量 0.5 LUMP_WIDTH+ 0.5 PIC_SPACE* 6 和 9 的區別 向下偏移量 0.5 LUMP_WIDTH+ 0.5 PIC_SPACE* 7 和 9 的區別 第一張圖向右偏移量 LUMP_WIDTH+PIC_SPACE* 8 和 9 的區別 第一張圖向右偏移量 0.5 LUMP_WIDTH+ 0.5 PIC_SPACE*/// 圍邊使用的灰色private final int [] COLOR_GREY_BGR = new int[] {230, 230, 230};//校對數組使用下標private int flg = 0;public static void main(String[] args) {MakeGropHeadPicUtil picUtil = new MakeGropHeadPicUtil();//添加測試圖片List<String> pics = new ArrayList<>();pics.add("C:/Users/specil/Desktop/Cross/小測試/1.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/2.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/3.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/4.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/5.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/6.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/7.jpg");pics.add("C:/Users/specil/Desktop/Cross/小測試/8.jpg"); // pics.add("C:/Users/specil/Desktop/Cross/小測試/9.jpg");//注意 存儲位置最后記得加“/”picUtil.getCombinationOfhead(pics,"C:/Users/specil/Desktop/Cross/小測試/","八張圖");}/*** @param pics 圖片列表* @param path 存儲路徑* @param fileName 存儲圖片名稱* @return 成功 OR 失敗*/public boolean getCombinationOfhead(List<String> pics, String path, String fileName){List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>();// BufferedImage.TYPE_INT_RGB可以自己定義可查看APIBufferedImage outImage = new BufferedImage(PIC_WIDTH, PIC_HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics2D gra = outImage.createGraphics();//設置背景為藍灰色gra.setColor(toColor(COLOR_GREY_BGR));//填滿圖片gra.fillRect(0, 0, PIC_WIDTH, PIC_HEIGHT);// 開始拼湊 根據圖片的數量判斷該生成哪種樣式組合頭像Integer size = pics.size();//圖片數量Integer sqrt = (int)Math.ceil(Math.sqrt(size));//寬度 一行幾張圖片//計算出 單張圖片寬度LUMP_WIDTH = (PIC_WIDTH - ((sqrt + 1.0) * PIC_SPACE))/sqrt;System.out.println(LUMP_WIDTH);// 壓縮圖片所有的圖片生成尺寸同意的 為 125*125for (int i = 0; i < pics.size(); i++) {BufferedImage resize2 = resize2(pics.get(i), LUMP_WIDTH.intValue(), LUMP_WIDTH.intValue(), true);bufferedImages.add(resize2);}//缺幾個滿伍int lack = 0;//計算起始點坐標if(size < sqrt*(sqrt-1)){//少一行 不滿伍//缺幾個滿伍lack = sqrt*(sqrt-1) - size;//向右邊偏移量LUMP_POINT_X = PIC_SPACE.doubleValue() + lack * (LUMP_WIDTH + PIC_SPACE) / 2;//向下偏移量LUMP_POINT_Y = PIC_SPACE.doubleValue() + LUMP_WIDTH/2.;}else if (size == sqrt*(sqrt-1)){//滿伍少一行//向右邊偏移量LUMP_POINT_X = PIC_SPACE.doubleValue();//向下偏移量LUMP_POINT_Y = PIC_SPACE.doubleValue() + LUMP_WIDTH/2.;}else if(size < sqrt*sqrt){//不滿伍//缺幾個滿伍lack = sqrt*sqrt - size;//向右邊偏移量LUMP_POINT_X = PIC_SPACE.doubleValue()+ lack * (LUMP_WIDTH + PIC_SPACE) / 2;LUMP_POINT_Y = PIC_SPACE.doubleValue();}else if (size == sqrt*sqrt){//滿伍LUMP_POINT_X = PIC_SPACE.doubleValue();LUMP_POINT_Y = PIC_SPACE.doubleValue();}int line = lack==0?-1:0; //第幾行圖片int row = 0; //第幾列圖片for (int i = 0; i < bufferedImages.size(); i++){if ((i + lack) % sqrt == 0){line ++;row = 0;}if(line == 0){gra.drawImage(bufferedImages.get(i), LUMP_POINT_X.intValue() + (row++ * (PIC_SPACE+LUMP_WIDTH.intValue())), LUMP_POINT_Y.intValue(), null);}else{gra.drawImage(bufferedImages.get(i), PIC_SPACE + (row++ * (PIC_SPACE+LUMP_WIDTH.intValue())), LUMP_POINT_Y.intValue() + (line * (PIC_SPACE+LUMP_WIDTH.intValue())), null);}}File file = new File(path+fileName+".png");//文件如果存在先刪除,再創建try {if(!file.getParentFile().exists()) {file.getParentFile().mkdirs();if(file.exists()) {file.delete();if(!file.createNewFile()) {System.out.println("創建失敗!");}}}}catch(IOException e) {e.printStackTrace();}//將圖片寫到文件try {return ImageIO.write(outImage, "png", file);} catch (IOException e) {return false;}}/*** 圖片縮放* @param picPath 本地或網絡圖片路徑* @param height 縮放后高度* @param width 縮放后寬度* @param fill 是否填充灰色* @return BufferedImage*/public BufferedImage resize2(String picPath, Integer height, Integer width, boolean fill){try {BufferedImage imageBuff =null;if(picPath.indexOf("https://")==0 || picPath.indexOf("http://")==0){ //簡單判斷是網絡圖片還是本地圖片imageBuff = ImageIO.read(new URL(picPath));}else{imageBuff = ImageIO.read(new File(picPath));}Image itemp = imageBuff.getScaledInstance(width, height, Image.SCALE_SMOOTH);double ratio = 0; // 縮放比例// 計算比例if ((imageBuff.getHeight() > height) || (imageBuff.getWidth() > width)) {if (imageBuff.getHeight() > imageBuff.getWidth()) {ratio = height.doubleValue()/ imageBuff.getHeight();} else {ratio = width.doubleValue() / imageBuff.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);itemp = op.filter(imageBuff, null);}if (fill) {BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.setColor(toColor(COLOR_GREY_BGR));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);elseg.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;}/*** @toColor 顏色索引轉為顏色* @param colorRoot 顏色索引* @return 顏色*/private Color toColor(int[] colorRoot) {if(colorRoot.length>=3) {return new Color(colorRoot[0], colorRoot[1], colorRoot[2]);}else {return null;}} }總結
以上是生活随笔為你收集整理的JAVA生成九宫格图片 微信群头像(不限制张数)拿走即可用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信点赞的测试用例
- 下一篇: html手机点赞图标素材,微信点赞心形图