PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的

1. 添加依赖

这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的。

org.jsoup

jsoup

1.11.3

com.alibaba

fastjson

1.2.54

talk is cheap, show me the code

2.上代码

我就不多说了,注释已经写得很清楚了

package com.pibgstar.demo.utils;

import com.alibaba.fastjson.JSONObject;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.geom.Ellipse2D;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

/**

* @author pibigstar

* @desc 海报生成工具

**/

public class PosterUtil {

private static final String BACKGROUND_IMG = "images/bg.jpg"; // 背景图片

private static final String result_img = "D:/tmp/images/result.jpg"; // 最终输出图片

private static final String QQ = "741047261";

private static final String avatar_img = "http://q1.qlogo.cn/g?b=qq&nk="+QQ+"&s=100";//QQ获取头像接口

private static final String signature = "魔前一叩三千年,回首凡尘不做仙。"; // 个性签名

public static void main(String[] args){

drawPoster();

}

/**

* @Author:pibigstar

* @Description: 画海报

*/

public static void drawPoster(){

try {

long startTime = System.currentTimeMillis();

// 1. 创建画布

BufferedImage backgroundImg = ImageIO.read(getInputStream(BACKGROUND_IMG));

BufferedImage canvas = new BufferedImage(backgroundImg.getWidth(),backgroundImg.getHeight(),BufferedImage.TYPE_INT_RGB);

Graphics2D g = (Graphics2D) canvas.getGraphics();

// 设置抗锯齿

g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

// 2. 将头像设置为圆角

BufferedImage avatar = ImageIO.read(new URL(avatar_img));

BufferedImage newAvatar = new BufferedImage(avatar.getWidth(), avatar.getHeight(), BufferedImage.TYPE_INT_ARGB);

Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, avatar.getWidth(), avatar.getHeight());

Graphics2D g2 = newAvatar.createGraphics();

newAvatar = g2.getDeviceConfiguration().createCompatibleImage(avatar.getWidth(), avatar.getHeight(), Transparency.TRANSLUCENT);

g2 = newAvatar.createGraphics();

g2.setComposite(AlphaComposite.Clear);

g2.fill(new Rectangle(newAvatar.getWidth(), newAvatar.getHeight()));

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));

g2.setClip(shape);

// 使用 setRenderingHint 设置抗锯齿

g2 = newAvatar.createGraphics();

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2.fillRoundRect(0, 0,avatar.getWidth(), avatar.getHeight(), 150, 150);

g2.setComposite(AlphaComposite.SrcIn);

g2.drawImage(avatar, 0, 0, avatar.getWidth(), avatar.getHeight(), null);

g2.dispose();

// 3. 将背景图和头像结合

// 画背景

g.drawImage(backgroundImg.getScaledInstance(backgroundImg.getWidth(), backgroundImg.getHeight(), Image.SCALE_DEFAULT), 0, 0, null);

// 背景上画头像

g.drawImage(newAvatar.getScaledInstance(100, 100, Image.SCALE_DEFAULT), 42, 35, null);

// 4. 写字(昵称)

g.setColor(new Color(33, 33, 33, 128));

g.setFont(getFont(2, 32.0f));

g.drawString(getNickName(QQ), 200, 75);

// 5. 画个性签名

g.setColor(new Color(33, 33, 33, 128));

g.setFont(getFont(1, 40.0f));

// 画竖着的文字

int x = 240; // 起始位置

int length = signature.length();//字符总长度

int size = length/2; //一竖列的长度

int j = 0; // 读取到那个字符了

for (int i=0; i<2; i++) {//两竖列

int y = 300;

for (;j < size; j++) {

String c = String.valueOf(signature.charAt(j));

y += 40;

g.drawString(c,x,y);

}

size = length;

x += 70;//竖列之间的距离

}

g.dispose();

File resultImg = new File(result_img);

ImageIO.write(canvas, "png", resultImg);

System.out.println("生成成功!");

System.out.println("耗时: " + (System.currentTimeMillis()-startTime)/1000.0 + "s");

System.out.println("生成文件路径: " + resultImg.getAbsolutePath());

}catch (Exception e) {

e.printStackTrace();

}

}

/**

* @Description: 获取QQ昵称,无意间发现的QQ音乐的一个漏洞

*/

private static String getNickName(String qq){

String api = "https://c.y.qq.com/rsc/fcgi-bin/fcg_get_profile_homepage.fcg?cid=205360838&ct=20&userid="+qq+"&reqfrom=1";

String nick = "";

JSONObject creatorObject = null;

try {

Document document = Jsoup.connect(api).ignoreContentType(true).timeout(10000).get();

String body = document.body().text();

JSONObject jsonObject = JSONObject.parseObject(body);

JSONObject dataObject = (JSONObject) jsonObject.get("data");

creatorObject = (JSONObject) dataObject.get("creator");

nick = creatorObject.get("nick").toString();

}catch (Exception e) {

e.printStackTrace();

}

return nick;

}

/**

* 根据字体类型获取字体

* @param type 字体类型

* @param size 字体大小

*/

private static Font getFont(int type, float size) {

// 字体路径

String path;

switch (type) {

case 1:

path = "ttf/JianTi.ttf";

break;

case 2:

path = "ttf/PingFang.ttf";

break;

default:

path = "ttf/JianTi.ttf";

}

InputStream inputStream = null;

try {

inputStream = getInputStream(path);

Font font = Font.createFont(Font.TRUETYPE_FONT, inputStream);

font = font.deriveFont(size);

return font;

} catch (FontFormatException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (inputStream != null) {

inputStream.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

/**

* 获取resources下的文件输入流

*/

private static InputStream getInputStream(String fileName) {

return PosterUtil.class.getClassLoader().getResourceAsStream(fileName);

}

}

3. 目录结构

4. 最终效果

java 推广海报_使用java画一张海报相关推荐

  1. java海报_使用java画一张海报

    PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的 1. 添加依赖 这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的. org.jsoup jsoup 1.11. ...

  2. java 画笔粗细_用JAVA做个画笔,有画笔和橡皮功能就行。越简单越好

    展开全部 新建一个java文件,取名叫做PaintJava.java 代码如下: import java.applet.*; import java.awt.*; import java.awt.ev ...

  3. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  4. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  5. java打印计算机_在Java程序中实现高精度打印

    在Java环境中,可以使用 java.awt.Toolkit.getScreenResolution()可以得到屏幕每英寸的象素数,但是好像没有什么方法能知道某一台打印机的分辨率,更别提去控制打印粒度 ...

  6. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  7. java 图片 大小_在JAVA中调整图片大小

    在JAVA中,当我们调整图片的大小或比例时,我们可以按照以下的步棸: 通过调用的ImageIO类的read(File)方法 创建用于输入图片BufferedImage对象. 按所需输出高度输出的Buf ...

  8. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  9. java 图片效果_使用Java进行图片底片化效果处理

    使用java代码读取图片,并进行底片化处理 util importjava.awt.image.BufferedImage;importjava.io.File;importjava.util.Arr ...

最新文章

  1. Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm
  2. 2021-01-14
  3. boost::hana::remove_at用法的测试程序
  4. 解决 同时安装 python3,python2环境时,用pip安装 python3 包
  5. oracle 并行执行 杀掉会话,oracle – 为什么即使我禁用并行DML和并行DDL也会创建并行会话...
  6. Linux系统编程:验证kernel内核缓存区大小-4096字节
  7. ffmpeg 2.6.3在Windows系统MinGW的编译
  8. 华东交通大学ACM-ICPC训练基地简介
  9. IOS开发中实现UITableView按照首字母将集合进行检索分组
  10. 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能
  11. 【离散数学·图论】关于哈密顿图的判别条件总结
  12. Java实现图片验证码功能
  13. 【渝粤教育】电大中专电商运营实操 (24)作业 题库
  14. crontab 误删除恢复
  15. 工欲善其事必先利其器–SimpleTestBed
  16. Linux下安装JDK(rpm版)
  17. 微信小程序接入第三方插件腾讯位置服务地图选点
  18. 超全!Tkinter 使用教程!4000字!
  19. 小米笔记本12.5英寸装ubuntu后设置快捷键开启和关闭触摸板
  20. 计算机发展历史简述及CPU构成及工作过程——Crash Course内容整理

热门文章

  1. 李宏毅hw4,训练+调优
  2. 微信支付(销客多)配置
  3. Activiti6--入门学习--错误边界事件
  4. ElasticSearch查询地图信息(geo-point类型)
  5. 两个故事讲述什么是消息队列
  6. 行列式的本质是什么?
  7. 【理解springboot自动装配原理】
  8. 超详细零信任市场解读
  9. 在windows 10中新建文本文档,只有txt文件双击打不开,但右键点编辑可以打开。
  10. 基于SSM的Web网页聊天室系统设计与实现 毕业论文+项目源码及数据库文件、