java画海报
package demotest; import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter; public class ImageUtil { /**
* 颜色转换
*/
private static Color fromStrToARGB(String str) {
String str1 = str.substring(1, 3);
String str2 = str.substring(3, 5);
String str3 = str.substring(5, 7);
int red = Integer.parseInt(str1, 16);
int green = Integer.parseInt(str2, 16);
int blue = Integer.parseInt(str3, 16);
if (str.length() == 9) {
String str4 = str.substring(7, 9);
int alpha = Integer.parseInt(str4, 16);
return new Color(red, green, blue, alpha);
} else {
return new Color(red, green, blue);
}
} /**
* 创建Graphics2D
*
* @param bgBufImage
* 底图
* @return Graphics2D
*/
private static Graphics2D createG2D(BufferedImage bgBufImage) {
Graphics2D bgBufImageGraphics = bgBufImage.createGraphics();
bgBufImageGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
return bgBufImageGraphics;
} /**
* 绘制海报底色(默认微软雅黑/PLAIN/32)
*
* @param bgBufImage
* 底图
* @param color
* 颜色
*/
private static void setBackGroup(BufferedImage bgBufImage, String color) {
Graphics2D bgBufImageGraphics = createG2D(bgBufImage);
bgBufImageGraphics.setBackground(fromStrToARGB(color));// 填充整个屏幕
bgBufImageGraphics.clearRect(0, 0, bgBufImage.getWidth(), bgBufImage.getHeight());
bgBufImageGraphics.dispose();
} /**
* 绘制海报文字(默认微软雅黑/PLAIN/32)
*
* @param basebBI
* 底图
* @param text
* 文本
* @param x
* 坐标 x
* @param y
* 坐标 y
* @param color
* 颜色
* @param font
* 字体
*/
private static void drawText(BufferedImage basebBI, String text, int x, int y, String color, Font font) {
// 抗锯齿
if (font == null) {
font = new Font("微软雅黑", Font.PLAIN, 32);
}
Graphics2D g2D = createG2D(basebBI);
g2D.setFont(font);
g2D.setPaint(new Color(0, 0, 0, 64));
// 先绘制一遍底色
g2D.drawString(text, x, y);
g2D.setPaint(fromStrToARGB(color));
// 再绘制一遍文字
// 由于部分情况会出现文字模糊的情况,保险起见才出此对策。
g2D.drawString(text, x, y);
g2D.dispose();
} /**
*
* 绘制海报文字(换行)
*
* @param basebBI
* 底图
* @param text
* 文本
* @param x
* 位置:x
* @param y
* 位置:y
* @param lineHeight
* 单行行高
* @param lineWidth
* 单行行宽
* @param color
* 文本颜色
* @param font
* 文本字体
* @param limitLineNum
* 限制行数
* @param backgroundWidth
* 底背位置(多行文字绘制时,出现为单行时居中的区域宽度。)
*/
private static void drawTextNewLine(BufferedImage basebBI, String text, int x, int y, int lineHeight, int lineWidth,
String color, Font font, int limitLineNum, int backgroundWidth) {
Graphics2D graphics = createG2D(basebBI);
if (font == null) {
font = new Font("微软雅黑", Font.PLAIN, 32);
}
graphics.setFont(font);
graphics.setPaint(fromStrToARGB(color)); // 计算字符串所占屏幕长度
FontRenderContext frc = graphics.getFontRenderContext();
graphics.getFontRenderContext();
// 记录行数
List<String> lineList = new ArrayList<String>();
if (backgroundWidth > 0) {
x = (backgroundWidth - lineWidth) / 2;
} int stringIndex = 0;
StringBuilder tmpLineString = new StringBuilder("");
while (stringIndex < text.length()) {
String tmp_char = text.substring(stringIndex, stringIndex + 1);
Rectangle2D tempStringBounds = font.getStringBounds(tmpLineString + tmp_char, frc);
double width = tempStringBounds.getWidth();
if (width > lineWidth) {
lineList.add(tmpLineString.toString());
tmpLineString = new StringBuilder("");
}
tmpLineString = tmpLineString.append(tmp_char);
stringIndex++;
}
// Color.BLACK 。字体颜色
graphics.setPaint(fromStrToARGB(color));
if (lineHeight == 0) {
lineHeight = 35;
} for (int i = 0; i < lineList.size(); i++) {
String lineStr = lineList.get(i);
double width = font.getStringBounds(lineStr, frc).getWidth();
double diffWidth = font.getStringBounds("...", frc).getWidth();
if (i > limitLineNum - 1) {
break;
} else if (i == limitLineNum - 1 && lineWidth - width < diffWidth) {
lineStr = lineStr.substring(0, lineStr.length() - 2) + "...";
}
graphics.drawString(lineStr, x, y + (i + 1) * lineHeight);
graphics.drawString(lineStr, x, y + (i + 1) * lineHeight);
}
graphics.dispose();
} /**
*
* 绘制海报图片
*
* @param basebBI
* 底图
* @param path
* 图片地址
* @param x
* 位置:x
* @param y
* 位置:y
* @param width
* 图片宽度
* @param height
* 图片高度
*/
private static void drawImage(BufferedImage basebBI, String path, int x, int y, int width, int height) throws Exception {
BufferedImage qrCodeImage = ImageIO.read(new URL(path));
drawImage(basebBI, qrCodeImage, x, y, width, height);
} /**
*
* 绘制海报图片
*
* @param basebBI
* 底图
* @param imageBI
* 图片 BufferedImage
* @param x
* 位置:x
* @param y
* 位置:y
* @param width
* 图片宽度
* @param height
* 图片高度
*/
private static void drawImage(BufferedImage basebBI, BufferedImage imageBI, int x, int y, int width, int height) {
Graphics2D g2D = createG2D(basebBI);
if (width == -1) {
width = imageBI.getWidth();
} if (height == -1) {
height = imageBI.getHeight();
}
g2D.drawImage(imageBI, x, y, width, height, null);
g2D.dispose();
} /**
* 创建带圆角的图片
*
* @param path
* 图片地址
* @param ratioWith
* 水平直径 -1 表示圆型
* @param ratioHeith
* 垂直直径 -1 表示圆型
*/
private static BufferedImage getRoundImage(String path, int ratioWith, int ratioHeith) throws Exception {
BufferedImage qrCodeImage = ImageIO.read(new URL(path));
BufferedImage image = new BufferedImage(qrCodeImage.getWidth(), qrCodeImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D image2D = createG2D(image);
if (ratioWith <= -1) {
ratioWith = qrCodeImage.getWidth();
}
if (ratioHeith <= -1) {
ratioHeith = qrCodeImage.getHeight();
}
image2D.fillRoundRect(0, 0, qrCodeImage.getWidth(), qrCodeImage.getHeight(), ratioWith, ratioHeith);
image2D.setComposite(AlphaComposite.SrcIn);
image2D.drawImage(qrCodeImage, 0, 0, qrCodeImage.getWidth(), qrCodeImage.getHeight(), null);
image2D.dispose();
return image;
} private static BufferedImage getRoundImageFromFile(String path, int ratioWith, int ratioHeith) throws Exception {
BufferedImage qrCodeImage = getFromPath(path);
BufferedImage image = new BufferedImage(qrCodeImage.getWidth(), qrCodeImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D image2D = createG2D(image);
if (ratioWith <= -1) {
ratioWith = qrCodeImage.getWidth();
}
if (ratioHeith <= -1) {
ratioHeith = qrCodeImage.getHeight();
}
image2D.fillRoundRect(0, 0, qrCodeImage.getWidth(), qrCodeImage.getHeight(), ratioWith, ratioHeith);
image2D.setComposite(AlphaComposite.SrcIn);
image2D.drawImage(qrCodeImage, 0, 0, qrCodeImage.getWidth(), qrCodeImage.getHeight(), null);
image2D.dispose();
return image;
} /**
* 输出图片
*
* @param bgBufImage
* 底图
* @param path
* 图片输出地址
*/
private static void saveImage(BufferedImage bgBufImage, String path) throws Exception {
Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter imageWriter = iterator.next();
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(1);
imageWriter.setOutput(ImageIO.createImageOutputStream(new FileOutputStream(new File(path))));
IIOImage iio_image = new IIOImage(bgBufImage, null, null);
imageWriter.write(null, iio_image, imageWriteParam);
imageWriter.dispose();
} private static BufferedImage getFromUrl(String url) throws MalformedURLException, IOException {
return ImageIO.read(new URL(url));
} private static BufferedImage getFromPath(String path) throws MalformedURLException, IOException {
return ImageIO.read(new FileInputStream(new File(path)));
} public static void drawImage() throws Exception {
// 二维码
String headUrl = "https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTL4BMa9N95tib3hae2XmIAhylV5Ex8GCekv0o6Rib55FLUvvnk1hMhBNZbqbUn5mXokt9DS7V2WSCkQ/132";
// 头像
String code = "e:\\1.jpg"; // BufferedImage bgBufImage = new BufferedImage(750, 1334,
// BufferedImage.TYPE_INT_RGB); // setBackGroup(bgBufImage, "#FF0000");
// drawImage(bgBufImage, qrCodeImageUrl, bgBufImage.getWidth() - 200, 10, -1,
// -1);
// drawImage(bgBufImage, getRoundImage(headUrl, -1, -1), 100, 100, 200, 200);
// drawText(bgBufImage, "测试", 0, 100, "#000000", null);
// drawTextNewLine(bgBufImage, "测试圣诞快乐数据库里搭街坊卡拉手机打开拉萨奥斯陆冬季开发了喀什假大空立法解释考虑", 0,
// 100, 35, 200, "#000000", null, 3,
// 750); // BufferedImage bgBufImage = ImageIO.read(new URL(headUrl));
// drawText(bgBufImage, "测试", 0, 100, "#000000", null);
// saveImage(bgBufImage, "E:\\demo1.jpeg"); BufferedImage bgBufImage = getFromPath(code);
BufferedImage headImage = getRoundImage(headUrl, 20, 20);
drawImage(bgBufImage, headImage, 100, 100, 100, 100);
saveImage(bgBufImage, "E:\\demo2.jpeg");
} public static Font getFontFromFile(String path) throws Exception {
InputStream is = new FileInputStream(path);
return Font.createFont(Font.TRUETYPE_FONT, is);
} public static void main(String[] args) {
try {
// drawImage();
String text = "娄山关路 设备编号: LSG-XG-6-001";
BufferedImage codeimg = getFromPath("e:\\11.jpg");
Graphics2D g = codeimg.createGraphics();
// g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
// RenderingHints.VALUE_ANTIALIAS_ON);
g.setBackground(Color.white);
g.setColor(Color.white);
g.fillRect(50, 460, 380, 50);
// 画圆
// g.fillOval(175, 175, 120, 120); BufferedImage logoimg = getRoundImageFromFile("e:\\logo.jpg", 120, 120);
g.drawImage(logoimg, 175, 175, 120, 120, null);
// g.drawImage(codeimg, 50, 460, 380, 50, null); // Font font = new Font("Serif", Font.BOLD, 20);
Font font = getFontFromFile("e:\\simhei.ttf");
font = font.deriveFont(20.0f);
font.deriveFont(Font.BOLD);
g.setColor(Color.red);
g.setFont(font);
// // 居中显示
FontMetrics fm = g.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
int widthX = (430 - textWidth) / 2;
g.drawString(text, widthX, 480);
// saveImage(codeimg, "E:\\demo2.jpeg");
ImageIO.write(codeimg, "jpg", new File("E:\\demo2.jpg"));
} catch (Exception e) {
e.printStackTrace();
} }
}
java画海报的更多相关文章
- java画海报二维码
package cn.com.yitong.ares.qrcode; import java.awt.BasicStroke;import java.awt.Color;import java.awt ...
- 使用java画一张海报
PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的 1. 添加依赖 这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的. <!-- jsoup --> ...
- 很值得学习的java 画图板源码
很值得学习的java 画图板源码下载地址:http://download.csdn.net/source/2371150 package minidrawpad; import java.awt.*; ...
- 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计算整数输入 <样例 画的第一张流程图 把脑子里的东西能清晰的表现出来 学编程必备
- 这个中秋,我用 Java 画了一个月饼!
栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 为了写中秋这篇文章,我学了 20 种编程语言! 没 ...
- 【编程漫谈】用JAVA画多边形
一门语言只要带图形库就可以编程画图了,用JAVA画图有两种方式,一是在内存中画好然后生成图片,就可以看到画图的效果了.另一个就是在窗口界面上直接画,可以实时看到程序的运行效果.刚开始学编程的时候,我加 ...
- 【风马一族_Java】使用java,画出任意大小的菱形
public class rhombic { public static void main(String[] args){ /** * scriber()画菱形的方法,参数 9 是指菱形的对角线的长 ...
随机推荐
- netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器
目录 简介 搭建netty服务器 DNS服务器的消息处理 DNS客户端消息请求 总结 简介 在前面的文章中,我们提到了使用netty构建tcp和udp的客户端向已经公布的DNS服务器进行域名请求服务. ...
- 2022春每日一题:Day 20
题目:Secret Message 老师说的trie树入门题 对于每个密码,存入trie树,每个字符对应编号i,则sum[i]++,最后结尾的编号为j,cnt[j]++ 查询,每个字符对应编号为i,不 ...
- 【云原生 · Kubernetes】Kubernetes运维
(1)Node的隔离与恢复 在硬件升级.硬件维护等情况下,需要将某些Node隔离.使用kubectl cordon <node_name>命令可禁止Pod调度到该节点上,在其上运行的Pod ...
- webrtc编译,不使用内置boringssl,使用openssl的
前言 在项目开发过程中,会遇到使用https.TLS.DTLS等场景,这些第三方库一般会使用openssl作为加密套件.例如,qt中加密套件就会使用openssl,但是webrtc会默认使用borin ...
- HDLBits答案——Getting started
Getting started 1 Step one module top_module( output one ); // Insert your code here assign one = 1' ...
- ubuntu等debian系linux系统添加人脸识别howdy
准备 proxychains proxychains是用来给终端走代理的软件,因为下载howdy的时候有一部分的文件的服务器在国外,且被墙了. 安装proxychains sudo apt insta ...
- MySQL数据库:7、SQL常用查询语句
Python基础之MySQL数据库 目录 Python基础之MySQL数据库 一.SQL语句常用查询方法 前期数据准备 1.基本查询 2.编写SQL语句的小技巧 3.查询之where筛选 3.1.功能 ...
- 这么简单,还不会使用java8 stream流的map()方法吗?
一.前言 在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为"王五"的语文成绩暂时修改 ...
- vba + ado +sql 连接数据库的常用操作方式
vba + ado +sql 连接Access.MySQL.Oracle Private Sub Connection_DBA() '********************************* ...
- 图解B树及C#实现(2)数据的读取及遍历
目录 前言 查询数据 算法说明 代码实现 查询最值 算法说明 代码实现 B树的遍历 算法说明 代码实现 Benchmarks 总结 参考资料 前言 本文为系列文章 B树的定义及数据的插入 数据的读取及 ...