import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** dingkun* 全景图切片*/
@Slf4j
public class CorrectCubeTiler {private static final int baseTileSize = 512;private static final int maxLevel = 4;private static final String outputFormat = "jpg";private static final String[] cubeFaces = {"l", "f", "r", "b", "u", "d"};private static final String[] faceNames = {"左", "前", "右", "后", "上", "下"};/*** 球面到立方体映射生成切片*/public static void generateCorrectCubeTiles(String inputPath, String outputDir) throws IOException {File file = new File(inputPath);if (!file.exists()) {System.out.println("全景图不存在...");return;}BufferedImage equirectangular = ImageIO.read(file);System.out.println("开始生成立方体切片...");System.out.println("源图像尺寸: " + equirectangular.getWidth() + "x" + equirectangular.getHeight());// 计算合适的立方体面尺寸(基于等柱全景图尺寸)int cubeSize = calculateOptimalCubeSize(equirectangular);System.out.println("立方体面尺寸: " + cubeSize + "x" + cubeSize);// 使用球面映射生成立方体面Map<String, BufferedImage> cubeFaces = generateCorrectCubeFaces(equirectangular, cubeSize);// 为每个面生成多分辨率切片for (int i = 0; i < CorrectCubeTiler.cubeFaces.length; i++) {String face = CorrectCubeTiler.cubeFaces[i];String faceName = faceNames[i];System.out.println("\n=== 处理 " + faceName + "面 (" + face + ") ===");BufferedImage faceImage = cubeFaces.get(face);generateFaceTiles(faceImage, outputDir, face, faceName, cubeSize);}// 清理资源for (BufferedImage img : cubeFaces.values()) {img.flush();}generateFrontendConfig(outputDir);System.out.println("\n=== 所有面切片生成完成 ===");}/*** 计算最优的立方体面尺寸*/private static int calculateOptimalCubeSize(BufferedImage equirectangular) {// 立方体面尺寸应该是2的幂次方,且不超过原图宽度/4int maxCubeSize = equirectangular.getWidth() / 4;int optimalSize = 1024; // 默认尺寸// 找到最接近的2的幂次方while (optimalSize * 2 <= maxCubeSize) {optimalSize *= 2;}return M