fix: 修复阿里生图模型 aspectRatio 参数不生效问题
- 将 aspectRatio(如 4:3)转换为阿里云 API 需要的 size 格式(如 1365*1024) - 结合 imageSize(1K/2K/4K)确定基准分辨率 - 自动计算保持总像素数接近目标分辨率的宽高 - 确保宽高在阿里云 API 要求的 512-2048 范围内
This commit is contained in:
parent
68abf3e3fa
commit
086fb70eb2
@ -368,19 +368,69 @@ export function createAlibabaImage({ apiKey, baseURL }: AlibabaImageConfig) {
|
|||||||
seed: options.imageParams?.seed,
|
seed: options.imageParams?.seed,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理分辨率
|
// 处理分辨率:结合 aspectRatio(宽高比)和 imageSize(分辨率等级)
|
||||||
|
const aspectRatio = options.imageParams?.aspectRatio || "auto";
|
||||||
|
const imageSize = options.imageParams?.imageSize || "2K";
|
||||||
|
|
||||||
|
// 根据分辨率等级确定基准像素
|
||||||
|
const baseSizeMap: Record<string, number> = {
|
||||||
|
"1K": 1024,
|
||||||
|
"2K": 1536,
|
||||||
|
"4K": 2048,
|
||||||
|
};
|
||||||
|
const baseSize = baseSizeMap[imageSize] || 1536;
|
||||||
|
|
||||||
|
// 根据宽高比计算实际分辨率
|
||||||
|
// 阿里云 API 要求宽高在 512-2048 之间
|
||||||
|
const calculateSize = (ratio: string, base: number): string => {
|
||||||
|
// 解析宽高比
|
||||||
|
const ratioMap: Record<string, [number, number]> = {
|
||||||
|
"auto": [1, 1],
|
||||||
|
"1:1": [1, 1],
|
||||||
|
"16:9": [16, 9],
|
||||||
|
"9:16": [9, 16],
|
||||||
|
"4:3": [4, 3],
|
||||||
|
"3:4": [3, 4],
|
||||||
|
"3:2": [3, 2],
|
||||||
|
"2:3": [2, 3],
|
||||||
|
"5:4": [5, 4],
|
||||||
|
"4:5": [4, 5],
|
||||||
|
"21:9": [21, 9],
|
||||||
|
};
|
||||||
|
|
||||||
|
const [w, h] = ratioMap[ratio] || [1, 1];
|
||||||
|
|
||||||
|
// 计算宽高,保持总像素接近 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);
|
||||||
|
|
||||||
|
// 确保是偶数(某些图像处理可能需要)
|
||||||
|
width = Math.round(width / 2) * 2;
|
||||||
|
height = Math.round(height / 2) * 2;
|
||||||
|
|
||||||
|
return `${width}*${height}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 如果用户直接指定了 size,使用用户指定的
|
||||||
if (options.imageParams?.size) {
|
if (options.imageParams?.size) {
|
||||||
params.size = options.imageParams.size;
|
params.size = options.imageParams.size;
|
||||||
} else if (options.imageParams?.imageSize) {
|
} else {
|
||||||
// 从 imageSize (如 "2K") 转换为具体分辨率
|
// 否则根据 aspectRatio 和 imageSize 计算
|
||||||
const sizeMap: Record<string, string> = {
|
params.size = calculateSize(aspectRatio, baseSize);
|
||||||
"1K": "1024*1024",
|
|
||||||
"2K": "1536*1536",
|
|
||||||
"4K": "2048*2048",
|
|
||||||
};
|
|
||||||
params.size = sizeMap[options.imageParams.imageSize] || "1024*1024";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(`[Alibaba Image] Calculated size: aspectRatio=${aspectRatio}, imageSize=${imageSize} => size=${params.size}`);
|
||||||
|
|
||||||
// 根据图片数量确定编辑模式
|
// 根据图片数量确定编辑模式
|
||||||
const editMode = imageUrls.length === 1 ? "单图编辑" : `多图融合 (${imageUrls.length}张)`;
|
const editMode = imageUrls.length === 1 ? "单图编辑" : `多图融合 (${imageUrls.length}张)`;
|
||||||
console.log("[Alibaba Image] 编辑模式:", editMode);
|
console.log("[Alibaba Image] 编辑模式:", editMode);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user