/
Sturon
/
Diplom
Обзор
Документация
Войти
/
Sturon
/
Diplom
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/src/main/java/ru/diplom/vision/service/MockCameraCaptureService.java
138 строк
6 KB
Sturon
Initial
03 июн 2026, 15:01
03 июн 2026, 15:01
17b44a2
Код
Авторство
О чём код?
package ru.diplom.vision.service; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import javax.imageio.ImageIO; import org.springframework.stereotype.Service; import ru.diplom.vision.domain.CameraSource; import ru.diplom.vision.domain.InspectionProfile; @Service public class MockCameraCaptureService { private final StorageService storageService; private final ConcurrentHashMap<Long, AtomicInteger> counters = new ConcurrentHashMap<>(); public MockCameraCaptureService(StorageService storageService) { this.storageService = storageService; } public CapturedFrame capture(InspectionProfile profile) { BufferedImage image = captureImage(profile); String storedPath = storageService.storeBufferedImage( "inspection-items/raw", image, profile.getName() + "-capture" ); return new CapturedFrame(image, storedPath); } public BufferedImage captureImage(InspectionProfile profile) { CameraSource cameraSource = profile.getCameraSource(); return switch (cameraSource.getType()) { case MOCK_FOLDER -> captureFromFolder(cameraSource, profile); case MOCK_REFERENCE -> captureFromReference(profile); }; } private BufferedImage captureFromFolder(CameraSource cameraSource, InspectionProfile profile) { if (cameraSource.getLocation() != null && !cameraSource.getLocation().isBlank()) { Path sourceFolder = Path.of(cameraSource.getLocation()).normalize(); if (Files.exists(sourceFolder) && Files.isDirectory(sourceFolder)) { try (Stream<Path> stream = Files.list(sourceFolder)) { List<Path> images = stream .filter(Files::isRegularFile) .filter(path -> { String lower = path.getFileName().toString().toLowerCase(); return lower.endsWith(".png") || lower.endsWith(".jpg") || lower.endsWith(".jpeg"); }) .sorted(Comparator.comparing(path -> path.getFileName().toString())) .toList(); if (!images.isEmpty()) { AtomicInteger counter = counters.computeIfAbsent(cameraSource.getId(), key -> new AtomicInteger(0)); int index = Math.floorMod(counter.getAndIncrement(), images.size()); BufferedImage bufferedImage = ImageIO.read(images.get(index).toFile()); if (bufferedImage != null) { return bufferedImage; } } } catch (IOException ignored) { return captureFromReference(profile); } } } return captureFromReference(profile); } private BufferedImage captureFromReference(InspectionProfile profile) { BufferedImage base = storageService.readImage(profile.getReferenceImage().getStoragePath()); BufferedImage canvas = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = canvas.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.drawImage(base, 0, 0, null); graphics.setColor(new Color(15, 23, 42, 180)); graphics.fillRoundRect(18, 18, 260, 64, 20, 20); graphics.setColor(Color.WHITE); graphics.setFont(new Font("SansSerif", Font.BOLD, 22)); graphics.drawString(profile.getCameraSource().getName(), 34, 46); graphics.setFont(new Font("SansSerif", Font.PLAIN, 16)); graphics.drawString(LocalDateTime.now().withNano(0).toString(), 34, 68); graphics.dispose(); return canvas; } public BufferedImage createDemoReferenceImage() { int width = 1400; int height = 900; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = image.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.setPaint(new GradientPaint(0, 0, new Color(245, 248, 252), width, height, new Color(223, 229, 239))); graphics.fillRect(0, 0, width, height); graphics.setColor(new Color(15, 23, 42, 18)); for (int line = 0; line < width; line += 48) { graphics.drawLine(line, 0, line, height); } graphics.setPaint(new GradientPaint(0, 0, new Color(218, 163, 64), width, height, new Color(140, 97, 28))); graphics.fill(new Ellipse2D.Double(360, 180, 680, 540)); graphics.setColor(new Color(255, 224, 145, 120)); graphics.setStroke(new BasicStroke(18f)); graphics.draw(new Ellipse2D.Double(410, 220, 580, 460)); graphics.setColor(new Color(112, 75, 22, 210)); graphics.fillRoundRect(610, 280, 180, 340, 48, 48); graphics.setColor(new Color(250, 250, 252)); graphics.setFont(new Font("SansSerif", Font.BOLD, 32)); graphics.drawString("Demo brass valve reference", 60, 82); graphics.setFont(new Font("SansSerif", Font.PLAIN, 20)); graphics.setColor(new Color(15, 23, 42)); graphics.drawString("Используется для демонстрации UI и mock-проверки", 60, 116); graphics.dispose(); return image; } public record CapturedFrame(BufferedImage image, String sourceImagePath) { } }