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. 数据库json字段类型总结

    ----------------------------------------=================以下是个人自己总结,可能只有自己看的懂.===================---- ...

  2. IOT黑客入门篇之初探Badusb

    什么是Badusb?   BadUSB是一种使用带有恶意软件编程的USB设备的计算机安全攻击.例如,USB 闪存驱动器可以包含可编程的Intel 8051微控制器,该微控制器可以重新编程,将USB闪存 ...

  3. Kubernetes IPVS和IPTABLES

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Kubernetes IPVS和IPTABLES ...

  4. 【Java并发011】原理层面:CAS操作全解析

    一.前言 volatile关键字是Java51个关键字中用的比较少的一个,它是一个与多线程并发的关键字,但是实际开发中,一般不会用到,使用synchronize+wait()+notify()/not ...

  5. 【Java并发010】使用层面:发令枪CountDownLatch全解析

    一.前言 CountDownLatch是在java1.5被引入,存在于java.util.cucurrent包中,跟它一起被引入的工具类还有CyclicBarrier.Semaphore.concur ...

  6. C温故补缺(一):数据类型和基本类型占位

    数据类型 基本类型:就是算术类型,包括整型和实型 枚举类型:一组离散的整数 void类型:无可用值类型 派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun( ...

  7. uboot引导应用程序

    uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导. 在uboot examples/standalone 目录下,有hello_world.c ...

  8. 批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。

    Sub Books2Sheets()Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Dim ...

  9. JavaScript入门④-万物皆对象:Object

    01.Object对象 Object 是 JavaScript 的一种 数据类型,它用于存储各种键值集合和更复杂的实体,是一组数据和功能的集合.JS中几乎所有对象都是继承自Object,Array.R ...

  10. 自己动手基于 Redis 实现一个 .NET 的分布式锁

    分布式锁的核心其实就是采用一个集中式的服务,然后多个应用节点进行抢占式锁定来进行实现,今天介绍如何采用Redis作为基础服务,实现一个分布式锁的类库,本方案不考虑 Redis 集群多节点问题,如果引入 ...