修改绘图算法

dev_xd
lj7788 2026-03-25 17:22:25 +08:00
parent 0790d48df2
commit 70de0ffc14
1 changed files with 56 additions and 32 deletions

View File

@ -14,6 +14,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* *
@ -24,7 +25,6 @@ public class UniAttendanceStartAndEndDrawer {
String ledSavePath=ledProperties.getSavePath()+ledScreen.getDeviceSn()+"/"; String ledSavePath=ledProperties.getSavePath()+ledScreen.getDeviceSn()+"/";
//检查目录及子目录是否已存在,不存在创建目 //检查目录及子目录是否已存在,不存在创建目
LedFileUtils.createDir(ledSavePath); LedFileUtils.createDir(ledSavePath);
//获取在场人数 //获取在场人数
long count = attendanceDataList.stream().filter(d -> d.getOutDate() == null).count(); long count = attendanceDataList.stream().filter(d -> d.getOutDate() == null).count();
//日志打印在场人数 //日志打印在场人数
@ -36,17 +36,35 @@ public class UniAttendanceStartAndEndDrawer {
List<String> imagePaths = new ArrayList<>(); List<String> imagePaths = new ArrayList<>();
//根据dataLine来对list进行分页调用绘制方法 //根据dataLine来对list进行分页调用绘制方法
if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0 if (!attendanceDataList.isEmpty() && dataLine > 0) { // 检查列表不为空且dataLine大于0
//按进场时间排序
attendanceDataList=attendanceDataList.stream()
.sorted((a,b) -> {
if (a.getInDate() == null && b.getInDate() == null) return 0;
if (a.getInDate() == null) return 1;
if (b.getInDate() == null) return -1;
return a.getInDate().compareTo(b.getInDate());
})
.collect(Collectors.toList());
int totalPages = (int) Math.ceil((double) attendanceDataList.size() / dataLine);
for (int i = 0; i < attendanceDataList.size(); i += dataLine) { for (int i = 0; i < attendanceDataList.size(); i += dataLine) {
List<UniAttendanceStartEndInfo> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size())); List<UniAttendanceStartEndInfo> subList = attendanceDataList.subList(i, Math.min(i + dataLine, attendanceDataList.size()));
String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp"; String imagePath=ledSavePath + "image" + (i / dataLine + 1) + ".bmp";
drawImage(ledScreen, subList, imagePath, dataLine, count); int currentPage = i / dataLine + 1;
drawImage(ledScreen, subList, imagePath, dataLine, count, currentPage, totalPages);
imagePaths.add(imagePath); imagePaths.add(imagePath);
} }
} }
return imagePaths; return imagePaths;
} }
private static void drawImage(SysLedscreen ledScreen, List<UniAttendanceStartEndInfo> subList, String imagePath, int maxRows, long count) { private static void drawStringByChar(Graphics2D g2d, String text, int x, int y, FontMetrics fm) {
for (int i = 0; i < text.length(); i++) {
g2d.drawString(text.substring(i, i + 1), x, y);
x += fm.charWidth(text.charAt(i));
}
}
private static void drawImage(SysLedscreen ledScreen, List<UniAttendanceStartEndInfo> subList, String imagePath, int maxRows, long count, int currentPage, int totalPages) {
int screenWidth=ledScreen.getWidth().intValue(); int screenWidth=ledScreen.getWidth().intValue();
int screenHeight=ledScreen.getHeight().intValue(); int screenHeight=ledScreen.getHeight().intValue();
int lineHeight = 18; int lineHeight = 18;
@ -61,10 +79,19 @@ public class UniAttendanceStartAndEndDrawer {
int imageWidth = screenWidth; int imageWidth = screenWidth;
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY); BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2d = image.createGraphics(); Graphics2D g2d = image.createGraphics();
try { try {
// g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
// g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
// g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
// g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
@ -74,31 +101,37 @@ public class UniAttendanceStartAndEndDrawer {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2d.setColor(Color.BLACK);
g2d.setColor(new Color(0, 0, 0));
g2d.fillRect(0, 0, imageWidth, imageHeight); g2d.fillRect(0, 0, imageWidth, imageHeight);
Font font = new Font("宋体", Font.PLAIN, 13); Font font = new Font("微软雅黑", Font.PLAIN, 13);
g2d.setFont(font); g2d.setFont(font);
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
FontMetrics fm = g2d.getFontMetrics();
String[] headers = {"姓名", "班组", "进入时间", "离开时间"}; String[] headers = {"姓名", "班组", "进入时间", "离开时间"};
int[] columnWidths = {drawWidth / 5, drawWidth * 3 / 10, drawWidth / 4, drawWidth / 4}; int[] columnWidths = {drawWidth / 5, drawWidth * 3 / 10, drawWidth / 4, drawWidth / 4};
int currentY = margin; drawStringByChar(g2d, "当前在场人数:" + count + "人", 2, 14, fm);
g2d.drawString("当前在场人数:" + count + "人", margin + 2, currentY + countRowHeight - 4);
currentY += countRowHeight;
int x = margin; String pageText = currentPage + "/" + totalPages;
int pageTextWidth = fm.stringWidth(pageText);
drawStringByChar(g2d, pageText, screenWidth - pageTextWidth - 2, 14, fm);
int currentY = margin + countRowHeight;
int xPos = margin;
for (int i = 0; i < headers.length; i++) { for (int i = 0; i < headers.length; i++) {
g2d.drawString(headers[i], x + 2, currentY + headerHeight - 4); drawStringByChar(g2d, headers[i], xPos + 2, currentY + headerHeight - 4, fm);
x += columnWidths[i]; xPos += columnWidths[i];
} }
currentY += headerHeight; currentY += headerHeight;
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
g2d.drawLine(margin, currentY, margin + drawWidth, currentY); g2d.drawLine(margin, currentY, margin + drawWidth, currentY);
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
for (int i = 0; i < maxRows; i++) { for (int i = 0; i < maxRows; i++) {
int rowY = currentY + i * rowHeight; int rowY = currentY + i * rowHeight;
int lineY = rowY + rowHeight; int lineY = rowY + rowHeight;
@ -125,30 +158,21 @@ public class UniAttendanceStartAndEndDrawer {
outTime = sdf.format(data.getOutDate()); outTime = sdf.format(data.getOutDate());
} }
x = margin; int x = margin;
g2d.drawString(userName, x + 2, rowY + rowHeight - 4); drawStringByChar(g2d, userName, x + 2, rowY + rowHeight - 4, fm);
x += columnWidths[0]; x += columnWidths[0];
g2d.drawString(subDeptGroupName, x + 2, rowY + rowHeight - 4); drawStringByChar(g2d, subDeptGroupName, x + 2, rowY + rowHeight - 4, fm);
x += columnWidths[1]; x += columnWidths[1];
g2d.drawString(inTime, x + 2, rowY + rowHeight - 4); drawStringByChar(g2d, inTime, x + 2, rowY + rowHeight - 4, fm);
x += columnWidths[2]; x += columnWidths[2];
g2d.drawString(outTime, x + 2, rowY + rowHeight - 4); drawStringByChar(g2d, outTime, x + 2, rowY + rowHeight - 4, fm);
} else {
x = margin;
g2d.drawString("", x + 2, rowY + rowHeight - 4);
x += columnWidths[0];
g2d.drawString("", x + 2, rowY + rowHeight - 4);
x += columnWidths[1];
g2d.drawString("", x + 2, rowY + rowHeight - 4);
x += columnWidths[2];
g2d.drawString("", x + 2, rowY + rowHeight - 4);
} }
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
g2d.drawLine(margin, lineY, margin + drawWidth, lineY); g2d.drawLine(margin, lineY, margin + drawWidth, lineY);
} }
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
int x1 = margin + columnWidths[0]; int x1 = margin + columnWidths[0];
int x2 = margin + columnWidths[0] + columnWidths[1]; int x2 = margin + columnWidths[0] + columnWidths[1];
int x3 = margin + columnWidths[0] + columnWidths[1] + columnWidths[2]; int x3 = margin + columnWidths[0] + columnWidths[1] + columnWidths[2];
@ -156,7 +180,7 @@ public class UniAttendanceStartAndEndDrawer {
g2d.drawLine(x2, margin + countRowHeight, x2, margin + totalHeight); g2d.drawLine(x2, margin + countRowHeight, x2, margin + totalHeight);
g2d.drawLine(x3, margin + countRowHeight, x3, margin + totalHeight); g2d.drawLine(x3, margin + countRowHeight, x3, margin + totalHeight);
g2d.setColor(Color.WHITE); g2d.setColor(new Color(255, 255, 255));
g2d.drawRect(margin, margin + countRowHeight, drawWidth, totalHeight - countRowHeight); g2d.drawRect(margin, margin + countRowHeight, drawWidth, totalHeight - countRowHeight);
File outputFile = new File(imagePath); File outputFile = new File(imagePath);