使用java画一张海报
PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的
1. 添加依赖
这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的。
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
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 画图板源码下载地址:http://download.csdn.net/source/2371150 package minidrawpad; import java.awt.*; ...
- 用JAVA自己画一张二维码
我们都知道,最近2年移动支付在中国堪称新四大发明之一. 二维码无处不在,特别是最近的支付宝扫码领红包,微信,qq,到处在发,阿里有点攻占腾讯移动支付市场的势头啊~博主忽然就对二维码是怎么画的有了点好奇 ...
- java画海报二维码
package cn.com.yitong.ares.qrcode; import java.awt.BasicStroke;import java.awt.Color;import java.awt ...
- java画流程图【思路】
java计算整数输入 <样例 画的第一张流程图 把脑子里的东西能清晰的表现出来 学编程必备
- Java 画一个5X5的方形矩阵
效果图如下: 思路:创建一个窗口,使其居中于屏幕中央,使用drawRect(x, y, width, height)画正方形. import java.awt.Graphics; import jav ...
- 用Java画简单验证码
以下是具体代码: package com.jinzhi.tes2; import java.awt.Color;import java.awt.Font;import java.awt.Graphic ...
- JAVA 画图板实现(基本画图功能+界面UI)一、界面实现
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 这段时间在学JAVA的swing界面开发,试着做了个画图板.实现了直线.曲线.喷枪.矩形.圆形.文字 ...
- 这个中秋,我用 Java 画了一个月饼!
栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 为了写中秋这篇文章,我学了 20 种编程语言! 没 ...
- 【编程漫谈】用JAVA画多边形
一门语言只要带图形库就可以编程画图了,用JAVA画图有两种方式,一是在内存中画好然后生成图片,就可以看到画图的效果了.另一个就是在窗口界面上直接画,可以实时看到程序的运行效果.刚开始学编程的时候,我加 ...
随机推荐
- VScode 为 *.cu文件 添加高亮及c++ intelligence相关操作的方法
问题:*.cu在VScode不能像*.cc或*.cpp一样在c++及c++ intelligence插件有关键字的高亮以及go to definition等的操作 解决方案:添加*.cu与*.cpp文 ...
- 【leetcode刷题笔记】Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...
- Linux下几种RTP协议实现的比较和JRTPLIB编程讲解
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议. IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...
- bzoj3569 DZY Loves Chinese II & bzoj3237 [AHOI2013] 连通图
给一个无向连通图,多次询问,每次询问给 k 条边,问删除这 k 条边后图的连通性,对于 bzoj3237 可以离线,对于 bzoj3569 强制在线 $n,m,q \leq 500000,k \leq ...
- luogu1336 最佳课题选择
背包问题加强版orz #include<iostream> #include<cstdio> #include<cmath> #include<cstring ...
- 【LeetCode】085. Maximal Rectangle
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's ...
- JS通过经纬度计算两个地方的距离
1 主要原理: Lat1 Lung1 表示A点纬度和经度,Lat2 Lung2 表示B点纬度和经度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差: 63 ...
- docker异常处理
Error running DeleteDevice dm_task_run failed重启docker即可 Error starting daemon: error initializing gr ...
- HDOJ1114(完全背包)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...
- boost::io_service解读
boost::io_service解读 asio是boost提供的一个c++异步编程模型库,其核心类io_service,在多线程编程里面提供了任务队列和任务分发功能,在socket.io编程里主要作 ...