public static void main(String[] args) throws IOException {
//從鏈接中獲取圖片,如OSS,服務器等。
// String url = "https://mjmall.oss-cn-shanghai.aliyuncs.com/18/1/merchantIcon.png";
// BufferedImage avatarImage = ImageIO.read(new URL(url));
BufferedImage avatarImage = ImageIO.read(new File("C:/head/mager.jpg"));
int width = 120;//如果剪切出來的圖片畫質模糊,請將width 調大點.
// 透明底的圖片
BufferedImage formatAvatarImage = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D graphics = formatAvatarImage.createGraphics();
//把圖片切成一個圓
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//留一個像素的空白區域,這個很重要,畫圓的時候把這個覆蓋
int border = 1;
//圖片是一個圓型
Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
//需要保留的區域
graphics.setClip(shape);
graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
graphics.dispose();
//在圓圖外面再畫一個圓
//新創建一個graphics,這樣畫的圓不會有鋸齒
graphics = formatAvatarImage.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int border1 = 3;
//畫筆是4.5個像素,BasicStroke的使用可以查看下面的參考文檔
//使畫筆時基本會像外延伸一定像素,具體可以自己使用的時候測試
Stroke s = new BasicStroke(4.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
graphics.setStroke(s);
graphics.setColor(Color.WHITE);
graphics.drawOval(border1, border1, width - border1 * 2, width - border1 * 2);
graphics.dispose();
OutputStream os = new FileOutputStream("C:/head/oo.png");//發佈項目時,如:Tomcat 他會在服務器本地tomcat webapps文件下創建此文件名
ImageIO.write(formatAvatarImage, "PNG", os);
}
.改爲工具類使用截取頭像成圓形使用上傳到oss(或其他,請自己更改,我只提供簡單的方法)需要OSS架包或連接參數說明請跳轉點擊打開鏈接
public class CopeImageUtil {
private static Logger LOGGER = LoggerFactory.getLogger(CopeImageUtil.class);
//head參數圖片,其他參數都是連接OSS使用的參數。
public static String headImages(String head, String ENDPOINT, String ACCESS_KEY_ID, String ACCESS_KEY_SECRET, String BUCKET_NAME) throws MalformedURLException{
//從鏈接中獲取圖片,如OSS,服務器等。如果不是從連接中獲取請使用File上傳。
String url = head;
BufferedImage avatarImage;
try {
avatarImage = ImageIO.read(new URL(url));
int width = 400;
// 透明底的圖片
BufferedImage formatAvatarImage = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D graphics = formatAvatarImage.createGraphics();
//把圖片切成一個圓
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//留一個像素的空白區域,這個很重要,畫圓的時候把這個覆蓋
int border =1;
//圖片是一個圓型
Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
//需要保留的區域
graphics.setClip(shape);
graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
graphics.dispose();
//在圓圖外面再畫一個圓
//新創建一個graphics,這樣畫的圓不會有鋸齒
graphics = formatAvatarImage.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int border1 = 3;
//畫筆是4.5個像素,BasicStroke的使用可以查看下面的參考文檔
//使畫筆時基本會像外延伸一定像素,具體可以自己使用的時候測試
Stroke s = new BasicStroke(4.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
graphics.setStroke(s);
graphics.setColor(Color.WHITE);
graphics.drawOval(border1, border1, width - border1 * 2, width - border1 * 2);
graphics.dispose();
// 創建OSSClient實例
OSSClient ossClient = new OSSClient(ENDPOINT,
ACCESS_KEY_ID, ACCESS_KEY_SECRET);
//隨機生成圖片名
String filePath = new DateTime().toString("yyyy/MM/dd/");
String fileName = IdUtils.genImageName() + ".png";
ImageIO.write(formatAvatarImage, "png", new FileOutputStream("copeImage.png"));
ossClient.putObject(BUCKET_NAME, filePath + fileName, new File("copeImage.png"));
//返回上傳到OSS的圖片地址鏈接
return "https://" + BUCKET_NAME + "."+ENDPOINT+"/" + filePath + fileName;
}catch (Exception e) {
LOGGER.error("調用小程序生成微信永久小程序碼URL接口異常", e);
}
return null;
}
-----------------------------------------