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 开发的必经之路

    第一章 JVM 内存模型 Java 虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区. 下面对这五个区域 ...

  3. 易语言 java支持_开源Java客户端可以连接易语言服务器

    我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求. 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可 ...

  4. java 爬虫_探索Java 多线程爬虫及分布式爬虫架构

    在我们调试爬虫程序的时候,单线程爬虫没什么问题,但是当我们在线上环境使用单线程爬虫程序去采集网页时,单线程就暴露出了两个致命的问题: 采集效率特别慢,单线程之间都是串行的,下一个执行动作需要等上一个执 ...

  5. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  6. java 计时器_【java内存】内存结构

    开局3张图,结论全靠吹,全文所有内容都围绕这3个图展开. 1.java语言编译解释过程 我们编写的java语言,经过java源码编译器后会编译成jvm字节码,也就是.class文件. 然后再通过类加载 ...

  7. 21点 小游戏 java代码_基于Java的21点扑克游戏的实现

    在上次写的比较牌点的扑克游戏上Java扑克游戏(多人多牌数比较游戏)的实现中,添加21点游戏规则,实现21点牌类游戏.具体实现步骤如下:[需要源代码的留QQ,大家一起探讨探讨哈,谢谢啦!] 抽象出规则 ...

  8. java 一二三四五_五道java小题,补更四道java小题

    一:分析以下需求,并用代码实现 1.定义List集合,存入多个字符串 2.删除集合中字符串"def" 3.然后利用迭代器遍历集合元素并输出 import java.util.Arr ...

  9. java 斗地主_基于java实现斗地主代码实例解析

    斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克 ...

最新文章

  1. 2016030204 - git和github结合
  2. WebSocket 的通信机制
  3. python解复杂方程组_sympy计算方程组的复杂表达式怎么获得数值解?
  4. oracle11g 隐藏参数_ORACLE 11GR2常用参数(含隐含参数)设置
  5. 面试必备:synchronized的底层原理?
  6. 区块链基础学习(一)
  7. Bailian4004 数字组合【递归+DP】
  8. uniapp‘急‘速入门
  9. ffmpeg 音频转amr
  10. 合肥宏晶微MS9334芯片特性/HDMI一分四开发板/HDMI分配器芯片/HDMI 1分4芯片
  11. DH密钥交换在实践中的安全问题
  12. 配置 hosts 浏览器访问仍然不生效
  13. 记一次Redis出问题及解决方案
  14. HHTC第十二届程序设计竞赛
  15. python软件和rost软件哪个更好_ROST-CM软件分词和词频统计用法体验
  16. 【安卓开发】简单记账app功能实现开发-期末大作业个人总结
  17. 方便快捷!身份证OCR带你一秒录入
  18. Cocos2d-x 面试题解 整理01
  19. Android常用设计模式
  20. 程序员读历史-秦始皇-荆轲刺秦-01

热门文章

  1. 自学c语言多久能赚钱,我这样学C语言,一个月赚了2000元?
  2. FFMPEG基本操作命令指南(一)
  3. SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
  4. 原来这才是体制内笔杆子干部竞聘演讲稿
  5. 校园网如何用路由器开WiFi
  6. 安装npm报错rollbackFailedOptional: verb npm-session原因及解决方案
  7. 如何写一个拼写纠错器 -- how to write a spelling corrector
  8. HBase实现谷粒微博案例
  9. 英雄联盟转区服务器维护,英雄联盟转服务器费用(付费转区详细介绍)
  10. REST是什么(转)