feat: 拼图质量改为分辨率缩放,高清80%/标准50%/流畅30%

This commit is contained in:
Developer
2026-05-12 23:05:35 +08:00
parent 5ae2a05a3d
commit 8d54f1c9dc
3 changed files with 27 additions and 9 deletions

View File

@@ -51,10 +51,10 @@ enum class LocationMode {
/** /**
* 图片质量 * 图片质量
*/ */
enum class ImageQuality(val quality: Int, val displayName: String) { enum class ImageQuality(val quality: Int, val displayName: String, val scaleFactor: Float) {
High(100, "高清"), High(100, "高清", 0.8f),
Standard(85, "标准"), Standard(85, "标准", 0.5f),
Low(70, "流畅") Low(70, "流畅", 0.3f)
} }
/** /**

View File

@@ -520,7 +520,7 @@ fun MergeScreen(
context, context,
imageItems, imageItems,
layoutType, layoutType,
imageQuality, ImageQuality.High,
title, title,
content, content,
titleStyle, titleStyle,

View File

@@ -231,10 +231,28 @@ object ImageProcessor {
val cols = layoutType.cols val cols = layoutType.cols
val rows = layoutType.rows val rows = layoutType.rows
val outputWidth = 1920 val cellSpacing = 16
val cellSpacing = 16 // 单元格间距 16px (约 4dp * 4) val maxCellDimension = 800
val cellWidth = (outputWidth - cellSpacing * (cols + 1)) / cols
val cellHeight = cellWidth // 保持正方形格子 // 根据第一张图片的原始尺寸确定单元格宽高比
val firstBitmap = images.firstOrNull()?.let { tryLoadBitmap(context, it) }
val (srcW, srcH) = if (firstBitmap != null) {
Pair(firstBitmap.width, firstBitmap.height).also { firstBitmap.recycle() }
} else {
Pair(1, 1)
}
// 基准单元格大小限制不超过maxCellDimension
val longer = maxOf(srcW, srcH)
val baseScale = if (longer > maxCellDimension) maxCellDimension.toFloat() / longer else 1.0f
val baseCellWidth = (srcW * baseScale).toInt()
val baseCellHeight = (srcH * baseScale).toInt()
// 根据质量等级缩放
val cellWidth = (baseCellWidth * quality.scaleFactor).toInt().coerceAtLeast(1)
val cellHeight = (baseCellHeight * quality.scaleFactor).toInt().coerceAtLeast(1)
val outputWidth = (cellWidth * cols + cellSpacing * (cols + 1)).coerceAtLeast(480)
// 底部文字区域高度 - 动态计算 // 底部文字区域高度 - 动态计算
val textAreaHeight = if (bottomTitle.isNotBlank() || bottomContent.isNotBlank()) { val textAreaHeight = if (bottomTitle.isNotBlank() || bottomContent.isNotBlank()) {