feat: 阿里生图自动模式使用输入图片的原始比例
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

- auto 模式不传递 size 参数,让 API 根据输入图片自动决定比例
- 根据阿里云文档:默认时宽高比与输入图(多图时为最后一张)一致
- 只有用户明确选择具体比例(如 4:3、16:9)时才传递 size 参数
- 避免图片被压扁变形
This commit is contained in:
Your Name 2026-01-18 11:22:19 +08:00
parent f46ee10eba
commit 59eff93109

View File

@ -382,10 +382,15 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) {
// 根据宽高比计算实际分辨率
// 阿里云 API 要求宽高在 512-2048 之间
const calculateSize = (ratio: string, base: number): string => {
const calculateSize = (ratio: string, base: number): string | null => {
// 如果是 auto 模式,返回 null,让 API 根据输入图片自动决定
// 根据阿里云文档:默认(不指定时):总像素接近 1024*1024,宽高比与输入图(多图输入时为最后一张)一致
if (ratio === "auto") {
return null;
}
// 解析宽高比
const ratioMap: Record<string, [number, number]> = {
"auto": [1, 1],
"1:1": [1, 1],
"16:9": [16, 9],
"9:16": [9, 16],
@ -446,16 +451,25 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) {
return `${width}*${height}`;
};
// 如果用户直接指定了 size,使用用户指定的
// 处理 size 参数
// 1. 如果用户直接指定了 size,使用用户指定的
// 2. 如果是 auto 模式,不传 size,让 API 根据输入图片自动决定比例
// 3. 如果指定了具体比例,根据 aspectRatio 和 imageSize 计算
if (options.imageParams?.size) {
params.size = options.imageParams.size;
console.log(`[Alibaba Image] Using user-specified size: ${params.size}`);
} else {
// 否则根据 aspectRatio 和 imageSize 计算
params.size = calculateSize(aspectRatio, baseSize);
const calculatedSize = calculateSize(aspectRatio, baseSize);
if (calculatedSize) {
params.size = calculatedSize;
console.log(`[Alibaba Image] Calculated size: aspectRatio=${aspectRatio}, imageSize=${imageSize} => size=${params.size}`);
} else {
// auto 模式:不设置 size,让 API 根据输入图片自动决定
// 阿里云会保持输入图片的宽高比,总像素接近 1024*1024
console.log(`[Alibaba Image] Auto mode: not setting size, API will use input image's aspect ratio`);
}
}
console.log(`[Alibaba Image] Calculated size: aspectRatio=${aspectRatio}, imageSize=${imageSize} => size=${params.size}`);
// 根据图片数量确定编辑模式
const editMode = imageUrls.length === 1 ? "单图编辑" : `多图融合 (${imageUrls.length}张)`;
console.log("[Alibaba Image] 编辑模式:", editMode);