java海报_使用java画一张海报
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画一张海报相关推荐
- java 推广海报_使用java画一张海报
PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的 1. 添加依赖 这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的. org.jsoup jsoup 1.11. ...
- 虚拟机 java 开发_深入浅出 Java 虚拟机 · 通往高级 Java 开发的必经之路
第一章 JVM 内存模型 Java 虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区. 下面对这五个区域 ...
- 易语言 java支持_开源Java客户端可以连接易语言服务器
我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求. 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可 ...
- java 爬虫_探索Java 多线程爬虫及分布式爬虫架构
在我们调试爬虫程序的时候,单线程爬虫没什么问题,但是当我们在线上环境使用单线程爬虫程序去采集网页时,单线程就暴露出了两个致命的问题: 采集效率特别慢,单线程之间都是串行的,下一个执行动作需要等上一个执 ...
- 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...
最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...
- java 计时器_【java内存】内存结构
开局3张图,结论全靠吹,全文所有内容都围绕这3个图展开. 1.java语言编译解释过程 我们编写的java语言,经过java源码编译器后会编译成jvm字节码,也就是.class文件. 然后再通过类加载 ...
- 21点 小游戏 java代码_基于Java的21点扑克游戏的实现
在上次写的比较牌点的扑克游戏上Java扑克游戏(多人多牌数比较游戏)的实现中,添加21点游戏规则,实现21点牌类游戏.具体实现步骤如下:[需要源代码的留QQ,大家一起探讨探讨哈,谢谢啦!] 抽象出规则 ...
- java 一二三四五_五道java小题,补更四道java小题
一:分析以下需求,并用代码实现 1.定义List集合,存入多个字符串 2.删除集合中字符串"def" 3.然后利用迭代器遍历集合元素并输出 import java.util.Arr ...
- java 斗地主_基于java实现斗地主代码实例解析
斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克 ...
最新文章
- 2016030204 - git和github结合
- WebSocket 的通信机制
- python解复杂方程组_sympy计算方程组的复杂表达式怎么获得数值解?
- oracle11g 隐藏参数_ORACLE 11GR2常用参数(含隐含参数)设置
- 面试必备:synchronized的底层原理?
- 区块链基础学习(一)
- Bailian4004 数字组合【递归+DP】
- uniapp‘急‘速入门
- ffmpeg 音频转amr
- 合肥宏晶微MS9334芯片特性/HDMI一分四开发板/HDMI分配器芯片/HDMI 1分4芯片
- DH密钥交换在实践中的安全问题
- 配置 hosts 浏览器访问仍然不生效
- 记一次Redis出问题及解决方案
- HHTC第十二届程序设计竞赛
- python软件和rost软件哪个更好_ROST-CM软件分词和词频统计用法体验
- 【安卓开发】简单记账app功能实现开发-期末大作业个人总结
- 方便快捷!身份证OCR带你一秒录入
- Cocos2d-x 面试题解 整理01
- Android常用设计模式
- 程序员读历史-秦始皇-荆轲刺秦-01
热门文章
- 自学c语言多久能赚钱,我这样学C语言,一个月赚了2000元?
- FFMPEG基本操作命令指南(一)
- SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
- 原来这才是体制内笔杆子干部竞聘演讲稿
- 校园网如何用路由器开WiFi
- 安装npm报错rollbackFailedOptional: verb npm-session原因及解决方案
- 如何写一个拼写纠错器 -- how to write a spelling corrector
- HBase实现谷粒微博案例
- 英雄联盟转区服务器维护,英雄联盟转服务器费用(付费转区详细介绍)
- REST是什么(转)