我从AWS S3存储桶中获取了一张图片,然后将其传递给Dall E/OpenAI API。当我尝试时,得到的错误响应是:
message: "Invalid input image - format must be in ['RGBA', 'LA', 'L'], got RGB.",
我了解到RGB(我试图上传的图像文件类型)包含一个alpha通道,这意味着图像上有透明区域。在将图像发送到API之前,是否可以/容易在NodeJS中验证图像类型以捕获不良图像?
我的S3获取.png文件的方式如下:
const data = await s3Client.send( new GetObjectCommand({ ...bucketParams, // Bucket: <bucket name> Key: `public/dalle/${inputParams.Key}`, }) );
然后我通过openai库将数据传递给API:
const response = await openai.createImageEdit( data.Body as unknown as File, (maskImageBuffer as unknown as File) || data.Body, prompt, 1, "256x256" );
回答:
你可以使用Jimp
let jImage = await Jimp.read(ImageBuffer); const w = jImage.bitmap.width; const h = jImage.bitmap.height; if ((w / h) != 1) { throw new functions.https. HttpsError("invalid-argument", "图像必须是正方形。当前比例 = " + (w/h)); } if (!jImage.hasAlpha()) { //检查图像是否有透明度 jImage = jImage.opacity(1); //如果没有则添加 } const jsize = (await jImage.getBufferAsync(Jimp.AUTO)).byteLength; if (jsize >= 4000000) { //检查大小 throw new functions.https. HttpsError("invalid-argument", "图像必须小于4MB,当前图像大小为 " + jsize + " 字节,包含Alpha通道"); } jImage.write("/tmp/fileName.png"); //生成PNG
https://www.npmjs.com/package/jimp
https://www.tutorialspoint.com/how-to-change-the-opacity-of-an-image-in-node-jimp