fix: 优化阿里生图分辨率计算,确保宽高比和分辨率正确配合

- 改进 clamp 逻辑:超出范围时按比例缩放而非直接截断
- 确保在缩放后仍保持正确的宽高比
- 分辨率等级(1K/2K/4K)和宽高比(4:3/16:9等)可以正确组合
This commit is contained in:
Your Name 2026-01-18 11:19:51 +08:00
parent 086fb70eb2
commit f46ee10eba

View File

@ -399,20 +399,45 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) {
};
const [w, h] = ratioMap[ratio] || [1, 1];
const aspectValue = w / h;
// 计算宽高,保持总像素接近 base*base
const totalPixels = base * base;
const aspectValue = w / h;
// height = sqrt(totalPixels / aspectValue)
// width = height * aspectValue
let height = Math.round(Math.sqrt(totalPixels / aspectValue));
let width = Math.round(height * aspectValue);
// 确保宽高在 512-2048 范围内
const clamp = (val: number) => Math.max(512, Math.min(2048, val));
width = clamp(width);
height = clamp(height);
// 阿里云 API 限制:宽高在 512-2048 之间
const MIN_SIZE = 512;
const MAX_SIZE = 2048;
// 如果超出范围,按比例缩放,同时保持宽高比
if (width > MAX_SIZE) {
const scale = MAX_SIZE / width;
width = MAX_SIZE;
height = Math.round(height * scale);
}
if (height > MAX_SIZE) {
const scale = MAX_SIZE / height;
height = MAX_SIZE;
width = Math.round(width * scale);
}
if (width < MIN_SIZE) {
const scale = MIN_SIZE / width;
width = MIN_SIZE;
height = Math.round(height * scale);
}
if (height < MIN_SIZE) {
const scale = MIN_SIZE / height;
height = MIN_SIZE;
width = Math.round(width * scale);
}
// 最终 clamp 确保在范围内
width = Math.max(MIN_SIZE, Math.min(MAX_SIZE, width));
height = Math.max(MIN_SIZE, Math.min(MAX_SIZE, height));
// 确保是偶数(某些图像处理可能需要)
width = Math.round(width / 2) * 2;