lau572
9 months ago
6 changed files with 496 additions and 1 deletions
@ -0,0 +1,80 @@ |
|||
package com.zc.business.domain; |
|||
|
|||
import com.zc.business.enums.BoardIconEnum; |
|||
|
|||
/** |
|||
* @Description |
|||
* |
|||
* @author liuwenge |
|||
* @date 2024/2/27 17:07 |
|||
*/ |
|||
public class DcBoardImgLane { |
|||
|
|||
//第一车道
|
|||
private BoardIconEnum firstLane; |
|||
|
|||
//第二车道
|
|||
private BoardIconEnum secondLane; |
|||
|
|||
//第三车道
|
|||
private BoardIconEnum thirdLane; |
|||
|
|||
//第四车道
|
|||
private BoardIconEnum fourthLane; |
|||
|
|||
//应急车道
|
|||
private BoardIconEnum emergencyLane; |
|||
|
|||
|
|||
public BoardIconEnum getFirstLane() { |
|||
return firstLane; |
|||
} |
|||
|
|||
public void setFirstLane(BoardIconEnum firstLane) { |
|||
this.firstLane = firstLane; |
|||
} |
|||
|
|||
public BoardIconEnum getSecondLane() { |
|||
return secondLane; |
|||
} |
|||
|
|||
public void setSecondLane(BoardIconEnum secondLane) { |
|||
this.secondLane = secondLane; |
|||
} |
|||
|
|||
public BoardIconEnum getThirdLane() { |
|||
return thirdLane; |
|||
} |
|||
|
|||
public void setThirdLane(BoardIconEnum thirdLane) { |
|||
this.thirdLane = thirdLane; |
|||
} |
|||
|
|||
public BoardIconEnum getFourthLane() { |
|||
return fourthLane; |
|||
} |
|||
|
|||
public void setFourthLane(BoardIconEnum fourthLane) { |
|||
this.fourthLane = fourthLane; |
|||
} |
|||
|
|||
public BoardIconEnum getEmergencyLane() { |
|||
return emergencyLane; |
|||
} |
|||
|
|||
public void setEmergencyLane(BoardIconEnum emergencyLane) { |
|||
this.emergencyLane = emergencyLane; |
|||
} |
|||
|
|||
public DcBoardImgLane(){}; |
|||
|
|||
public DcBoardImgLane(BoardIconEnum firstLane, BoardIconEnum secondLane, BoardIconEnum thirdLane, BoardIconEnum fourthLane, BoardIconEnum emergencyLane){ |
|||
this.firstLane = firstLane; |
|||
this.secondLane = secondLane; |
|||
this.thirdLane = thirdLane; |
|||
this.fourthLane = fourthLane; |
|||
this.emergencyLane = emergencyLane; |
|||
}; |
|||
|
|||
|
|||
} |
@ -0,0 +1,150 @@ |
|||
package com.zc.business.domain; |
|||
|
|||
import sun.font.FontDesignMetrics; |
|||
|
|||
import java.awt.*; |
|||
|
|||
/** |
|||
* @Description:ruoyi |
|||
* @auther: Lenovo |
|||
* @date: 2024/2/2616:43 |
|||
* @param: param |
|||
* @return: 结果 |
|||
*/ |
|||
public class ImageDTO { |
|||
|
|||
//类型(0:文字,1:矩形)
|
|||
private int type; |
|||
|
|||
//文字内容
|
|||
private String text; |
|||
//字体颜色和透明度
|
|||
private Color color; |
|||
//字体和大小
|
|||
private Font font; |
|||
//左上角起始点的x坐标
|
|||
private int x; |
|||
//左上角起始点的y坐标
|
|||
private int y; |
|||
//矩形宽度
|
|||
private int rectWidth; |
|||
//矩形高度
|
|||
private int rectHeight; |
|||
|
|||
public int getType() { |
|||
return type; |
|||
} |
|||
|
|||
public void setType(int type) { |
|||
this.type = type; |
|||
} |
|||
|
|||
public String getText() { |
|||
return text; |
|||
} |
|||
|
|||
public void setText(String text) { |
|||
this.text = text; |
|||
} |
|||
|
|||
public Color getColor() { |
|||
return color; |
|||
} |
|||
|
|||
public void setColor(Color color) { |
|||
this.color = color; |
|||
} |
|||
|
|||
public Font getFont() { |
|||
return font; |
|||
} |
|||
|
|||
public void setFont(Font font) { |
|||
this.font = font; |
|||
} |
|||
|
|||
public int getX() { |
|||
return x; |
|||
} |
|||
|
|||
public void setX(int x) { |
|||
this.x = x; |
|||
} |
|||
|
|||
public int getY() { |
|||
return y; |
|||
} |
|||
|
|||
public void setY(int y) { |
|||
this.y = y; |
|||
} |
|||
|
|||
|
|||
|
|||
public int getRectWidth() { |
|||
return rectWidth; |
|||
} |
|||
|
|||
public void setRectWidth(int rectWidth) { |
|||
this.rectWidth = rectWidth; |
|||
} |
|||
|
|||
public int getRectHeight() { |
|||
return rectHeight; |
|||
} |
|||
|
|||
public void setRectHeight(int rectHeight) { |
|||
this.rectHeight = rectHeight; |
|||
} |
|||
|
|||
|
|||
|
|||
/** |
|||
* 创建文字ImageDTO, 每一个对象,代表在该图片中要插入的一段文字内容: |
|||
* @param text : 文本内容; |
|||
* @param color : 字体颜色(前三位)和透明度(第4位,值越小,越透明); |
|||
* @param font : 字体的样式和字体大小; |
|||
* @param x : 当前字体在该图片位置的横坐标; |
|||
* @param y : 当前字体在该图片位置的纵坐标; |
|||
* @return |
|||
*/ |
|||
public static ImageDTO createImageDTO(String text,Color color,Font font,int x,int y){ |
|||
ImageDTO imageDTO = new ImageDTO(); |
|||
imageDTO.setType(0); |
|||
imageDTO.setText(text); |
|||
imageDTO.setColor(color); |
|||
imageDTO.setFont(font); |
|||
|
|||
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); |
|||
y = y + metrics.getAscent() - (metrics.getAscent() + metrics.getDescent() - font.getSize()) / 2; |
|||
|
|||
imageDTO.setX(x); |
|||
imageDTO.setY(y); |
|||
return imageDTO; |
|||
} |
|||
|
|||
|
|||
public ImageDTO(){} |
|||
|
|||
|
|||
|
|||
/** |
|||
* 创建ImageDTO, 每一个对象,代表在该图片中要插入的矩形: |
|||
* @param color : 颜色(前三位)和透明度(第4位,值越小,越透明); |
|||
* @param x : 当前矩形在该图片位置的横坐标; |
|||
* @param y : 当前矩形在该图片位置的纵坐标; |
|||
* @param rectWidth : 当前矩形的宽度; |
|||
* @param rectHeight : 当前矩形的高度; |
|||
* @return |
|||
*/ |
|||
public static ImageDTO createRectImageDTO(Color color,int x,int y,int rectWidth,int rectHeight){ |
|||
ImageDTO imageDTO = new ImageDTO(); |
|||
imageDTO.setType(1); |
|||
imageDTO.setColor(color); |
|||
imageDTO.setX(x); |
|||
imageDTO.setY(y); |
|||
imageDTO.setRectWidth(rectWidth); |
|||
imageDTO.setRectHeight(rectHeight); |
|||
return imageDTO; |
|||
} |
|||
} |
@ -0,0 +1,62 @@ |
|||
package com.zc.business.enums; |
|||
|
|||
/** |
|||
* 情报板车道图标枚举 |
|||
* @author |
|||
*/ |
|||
public enum BoardIconEnum { |
|||
|
|||
// 直行标志
|
|||
STRAIGHT_TRAVEL(1,"/zhixing.png"), |
|||
|
|||
// 左侧绕行标志
|
|||
LEFT_DETOUR(2,"/raozuo.png"), |
|||
|
|||
// 右侧绕行标志
|
|||
RIGHT_DETOUR(3,"/raoyou.png"), |
|||
|
|||
// 禁行标志
|
|||
LANE_PROHIBITION(4,"/jinxing.png"), |
|||
|
|||
// 货车禁行
|
|||
TRUCK_PROHIBITION(5,"/huochejinxing.png"), |
|||
|
|||
// 应急车道标志
|
|||
EMERGENCY_LANE(6,"/yingji.png"), |
|||
|
|||
// 限速120
|
|||
SPEED_LIMIT_120(7,"/xiansu120.png"), |
|||
|
|||
// 限速100
|
|||
SPEED_LIMIT_100(8,"/xiansu100.png"), |
|||
|
|||
// 限速80
|
|||
SPEED_LIMIT_80(9,"/xiansu80.png"), |
|||
|
|||
// 限速60
|
|||
SPEED_LIMIT_60(10,"/xiansu60.png"), |
|||
|
|||
// 限速40
|
|||
SPEED_LIMIT_40(11,"/xiansu40.png"), |
|||
|
|||
// 限速30
|
|||
SPEED_LIMIT_30(12,"/xiansu30.png"); |
|||
|
|||
|
|||
private final int value; |
|||
|
|||
private final String filePath; |
|||
|
|||
BoardIconEnum(int value,String filePath) { |
|||
this.value = value; |
|||
this.filePath = filePath; |
|||
} |
|||
|
|||
public int getValue() { |
|||
return this.value; |
|||
} |
|||
|
|||
public String getFilePath() { |
|||
return this.filePath; |
|||
} |
|||
} |
@ -0,0 +1,195 @@ |
|||
package com.zc.business.utils; |
|||
|
|||
import com.ruoyi.common.config.RuoYiConfig; |
|||
import com.ruoyi.common.core.domain.AjaxResult; |
|||
import com.zc.business.domain.DcBoardImgLane; |
|||
import com.zc.business.domain.ImageDTO; |
|||
import com.zc.business.enums.BoardIconEnum; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import javax.imageio.ImageIO; |
|||
import java.awt.*; |
|||
import java.awt.image.BufferedImage; |
|||
import java.io.File; |
|||
import java.io.FileOutputStream; |
|||
import java.io.IOException; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 情报板生成图片工具 |
|||
*/ |
|||
public class BoardImageUtils { |
|||
|
|||
private static final Logger log = LoggerFactory.getLogger(BoardImageUtils.class); |
|||
|
|||
//分辨率 宽度
|
|||
private static final int width = 768; |
|||
|
|||
//分辨率高度
|
|||
private static final int height = 64; |
|||
|
|||
//图标地址
|
|||
private static final String templatePath = "D:\\ruoyi\\uploadPath\\boardTemplate"; |
|||
// private static final String templatePath = RuoYiConfig.getBoardPath();
|
|||
|
|||
/** |
|||
* 事件场景 |
|||
* |
|||
* @param list |
|||
*/ |
|||
public static AjaxResult writeEventImage(List<ImageDTO> list) { |
|||
|
|||
// String filePath = RuoYiConfig.getBoardPath() + "/boardImg.png";
|
|||
String filePath = "C:/Users/Lenovo/Desktop/event.png"; |
|||
|
|||
FileOutputStream outImgStream = null; |
|||
try { |
|||
|
|||
//创建图片
|
|||
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); |
|||
Graphics2D g = bufImg.createGraphics(); |
|||
//背景颜色
|
|||
g.setBackground(Color.BLACK); |
|||
|
|||
//编辑图片,插入要素
|
|||
for (ImageDTO imgDTO : list) { |
|||
if (imgDTO.getType() == 0) { |
|||
//插入文本
|
|||
g.setColor(imgDTO.getColor()); //根据图片的背景设置水印颜色
|
|||
g.setFont(imgDTO.getFont()); //设置字体
|
|||
g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY()); //画出水印
|
|||
} else if (imgDTO.getType() == 1){ |
|||
//插入矩形
|
|||
g.setColor(imgDTO.getColor()); |
|||
g.fillRect(imgDTO.getX(),imgDTO.getY(),imgDTO.getRectWidth(),imgDTO.getRectHeight()); |
|||
} |
|||
} |
|||
//事故图标
|
|||
File srcImgFile = new File(templatePath + "/jinzhi.png");//得到文件
|
|||
Image jinzhi = ImageIO.read(srcImgFile);//文件转化为图片
|
|||
g.drawImage(jinzhi,534,17,30,30,null); |
|||
g.dispose(); |
|||
|
|||
// 输出图片
|
|||
outImgStream = new FileOutputStream(filePath); |
|||
ImageIO.write(bufImg, "jpg", outImgStream); |
|||
} catch (Exception e) { |
|||
log.error("==== 系统异常::{} ====",e); |
|||
} finally { |
|||
try { |
|||
if (null != outImgStream){ |
|||
outImgStream.flush(); |
|||
outImgStream.close(); |
|||
} |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return AjaxResult.success(filePath); |
|||
} |
|||
|
|||
|
|||
|
|||
/** |
|||
* 车道通行场景 |
|||
* |
|||
* @param dcBoardImgLane |
|||
*/ |
|||
public static AjaxResult writeLaneImage(DcBoardImgLane dcBoardImgLane) { |
|||
|
|||
// String filePath = RuoYiConfig.getBoardPath() + "/boardImg.png";
|
|||
String filePath = "C:/Users/Lenovo/Desktop/lane.png"; |
|||
|
|||
FileOutputStream outImgStream = null; |
|||
try { |
|||
|
|||
//创建图片
|
|||
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); |
|||
Graphics2D g = bufImg.createGraphics(); |
|||
//背景颜色
|
|||
g.setBackground(Color.BLACK); |
|||
|
|||
//分割线图标
|
|||
Image fenge = ImageIO.read(new File(templatePath + "/fenge.png"));//文件转化为图片
|
|||
g.drawImage(fenge,150,4,8,56,null); |
|||
g.drawImage(fenge,304,4,8,56,null); |
|||
g.drawImage(fenge,458,4,8,56,null); |
|||
g.drawImage(fenge,612,4,8,56,null); |
|||
|
|||
//第一车道
|
|||
Image icon = ImageIO.read(new File(templatePath + dcBoardImgLane.getFirstLane().getFilePath())); |
|||
g.drawImage(icon,49,4,56,56,null); |
|||
|
|||
//第二车道
|
|||
icon = ImageIO.read(new File(templatePath + dcBoardImgLane.getSecondLane().getFilePath())); |
|||
g.drawImage(icon,203,4,56,56,null); |
|||
|
|||
//第三车道
|
|||
icon = ImageIO.read(new File(templatePath + dcBoardImgLane.getThirdLane().getFilePath())); |
|||
g.drawImage(icon,357,4,56,56,null); |
|||
|
|||
//第四车道
|
|||
icon = ImageIO.read(new File(templatePath + dcBoardImgLane.getFourthLane().getFilePath())); |
|||
g.drawImage(icon,511,4,56,56,null); |
|||
|
|||
//应急车道
|
|||
icon = ImageIO.read(new File(templatePath + dcBoardImgLane.getEmergencyLane().getFilePath())); |
|||
g.drawImage(icon,665,4,56,56,null); |
|||
|
|||
g.dispose(); |
|||
|
|||
// 输出图片
|
|||
outImgStream = new FileOutputStream(filePath); |
|||
ImageIO.write(bufImg, "jpg", outImgStream); |
|||
} catch (Exception e) { |
|||
log.error("==== 系统异常::{} ====",e); |
|||
} finally { |
|||
try { |
|||
if (null != outImgStream){ |
|||
outImgStream.flush(); |
|||
outImgStream.close(); |
|||
} |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return AjaxResult.success(filePath); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* main方法: |
|||
* @param args |
|||
*/ |
|||
public static void main(String[] args) { |
|||
|
|||
|
|||
//获取数据集合;
|
|||
/*ArrayList<ImageDTO> list = new ArrayList<>(); |
|||
|
|||
list.add(ImageDTO.createRectImageDTO(new Color(0,255,0), 34, 26, 300,16)); |
|||
list.add(ImageDTO.createRectImageDTO(new Color(255,255,0), 334, 26, 150,16)); |
|||
list.add(ImageDTO.createRectImageDTO(new Color(255,0,0),484, 26,50,16)); |
|||
list.add(ImageDTO.createRectImageDTO(new Color(0,255,0),534, 26,200,16)); |
|||
list.add(ImageDTO.createImageDTO("前方5公里发生事故缓行10分钟",new Color(255,0,0),new Font("Default", Font.BOLD, 22), 34, 0)); |
|||
list.add(ImageDTO.createImageDTO("长清收费站约5分钟到达",new Color(255,255,255),new Font("Default", Font.BOLD, 12 ), 296, 51)); |
|||
|
|||
//事件场景
|
|||
BoardImageUtils.writeEventImage(list);*/ |
|||
|
|||
|
|||
DcBoardImgLane boardImgLane = new DcBoardImgLane(BoardIconEnum.SPEED_LIMIT_120,BoardIconEnum.SPEED_LIMIT_120,BoardIconEnum.SPEED_LIMIT_100,BoardIconEnum.SPEED_LIMIT_100,BoardIconEnum.EMERGENCY_LANE); |
|||
//车道通行场景
|
|||
BoardImageUtils.writeLaneImage(boardImgLane); |
|||
|
|||
|
|||
boardImgLane = new DcBoardImgLane(BoardIconEnum.STRAIGHT_TRAVEL,BoardIconEnum.LEFT_DETOUR,BoardIconEnum.LANE_PROHIBITION,BoardIconEnum.RIGHT_DETOUR,BoardIconEnum.EMERGENCY_LANE); |
|||
//车道通行场景
|
|||
BoardImageUtils.writeLaneImage(boardImgLane); |
|||
//这句代码,自己项目中可以不用加,在这里防止main方法报错的;
|
|||
System.exit(0); |
|||
} |
|||
} |
|||
|
Loading…
Reference in new issue