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画海报的更多相关文章

  1. java画海报二维码

    package cn.com.yitong.ares.qrcode; import java.awt.BasicStroke;import java.awt.Color;import java.awt ...

  2. 使用java画一张海报

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

  3. 很值得学习的java 画图板源码

    很值得学习的java 画图板源码下载地址:http://download.csdn.net/source/2371150 package minidrawpad; import java.awt.*; ...

  4. Java 画一个5X5的方形矩阵

    效果图如下: 思路:创建一个窗口,使其居中于屏幕中央,使用drawRect(x, y, width, height)画正方形. import java.awt.Graphics; import jav ...

  5. 用Java画简单验证码

    以下是具体代码: package com.jinzhi.tes2; import java.awt.Color;import java.awt.Font;import java.awt.Graphic ...

  6. JAVA 画图板实现(基本画图功能+界面UI)一、界面实现

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 这段时间在学JAVA的swing界面开发,试着做了个画图板.实现了直线.曲线.喷枪.矩形.圆形.文字 ...

  7. java画流程图【思路】

    java计算整数输入 <样例 画的第一张流程图 把脑子里的东西能清晰的表现出来 学编程必备

  8. 这个中秋,我用 Java 画了一个月饼!

    栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 为了写中秋这篇文章,我学了 20 种编程语言! 没 ...

  9. 【编程漫谈】用JAVA画多边形

    一门语言只要带图形库就可以编程画图了,用JAVA画图有两种方式,一是在内存中画好然后生成图片,就可以看到画图的效果了.另一个就是在窗口界面上直接画,可以实时看到程序的运行效果.刚开始学编程的时候,我加 ...

  10. 【风马一族_Java】使用java,画出任意大小的菱形

    public class rhombic { public static void main(String[] args){ /** * scriber()画菱形的方法,参数 9 是指菱形的对角线的长 ...

随机推荐

  1. Archlinux配置fcitx5

    fcitx5--Linux中最好用的中文输入法 ArchLinux配置fcitx5 输入法 本文基于archlinux + dwm.其他的桌面环境以及窗口管理器,配置选项差不多. 安装基础包 fcit ...

  2. JS数据结构与算法-栈结构

    一.认识栈结构 栈也是一种非常常见的数据结构,并且在程序中的应用非常广泛 数组 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据. 但是有时候,我们为了实现某些功能,必须对这种任意性 ...

  3. Vue3实现动态导入Excel表格数据

    1.  前言 在开发工作过程中,我们会遇到各种各样的表格数据导入,大部分我们的解决方案:提供一个模板前端进行下载,然后按照这个模板要求进行数据填充,最后上传导入,这是其中一种解决方案.个人认为还有另外 ...

  4. Complementary XOR

    题目链接 题目大意: 给你两个字符串只有01组成,你可以选取区间[l, r],对字符串a在区间里面进行异或操作,对字符串b非区间值进行异或操作,问能否将两个字符串变为全0串.如果可以输出YES, 操作 ...

  5. 从 WinDbg 角度理解 .NET7 的AOT玩法

    一:背景 1.讲故事 前几天 B 站上有位朋友让我从高级调试的角度来解读下 .NET7 新出来的 AOT,毕竟这东西是新的,所以这一篇我就简单摸索一下. 二:AOT 的几个问题 1. 如何在 .NET ...

  6. K8s如何启用cgroup2支持?

    什么是 cgroup ️Reference: control groups(控制组),通常被称为cgroup,是Linux内核的一项功能.它允许将进程组织成分层的组,然后限制和监控各种资源的使用. 内 ...

  7. Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)

    软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...

  8. CPU TLB原理 [转载好文]

    首先,我们知道MMU的作用是把虚拟地址转换成物理地址.虚拟地址和物理地址的映射关系存储在页表中,而现在页表又是分级的.64位系统常见的配置是4级页表,就以4级页表为例说明.分别是PGD.PUD.PMD ...

  9. ARM MMU架构 -- CPU如何访问MMU及DRAM

    <ARM Architecture Reference Manual ARMv8-A>里面有Memory层级框架图,从中可以看出L1.L2.DRAM.Disk.MMU之间的关系,以及他们在 ...

  10. devexpress中dockManager保存布局后恢复不正常

    在使用dockManager保存布局后进行恢复发现不正常,与中间的gridcontorl接触的都不行.gridcontorl设置的填充是fill 所以在在界面上再添加一个PanelControl控件并 ...