AWS Rekognition JS SDK 无效图像编码错误
AWS Rekognition JS SDK Invalid image encoding error
使用 React 构建一个简单的 AWS Rekognition 演示,使用 <input type="file">
出现 Invalid image encoding
错误。
let file = e.target.files[0];
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = () => {
let rekognition = new aws.Rekognition();
var params = {
Image: { /* required */
Bytes: reader.result,
},
MaxLabels: 0,
MinConfidence: 0.0
};
rekognition.detectLabels(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
GitHub 回购:https://github.com/html5cat/vision-test/
ReadAsDataUrl 中的 return 值包含一个前缀,表示数据的 MIME-TYPE 和编码。 (“image/png;base64, IVBORsdafasdfasf...”)。
但是,Rekognition API 只需要图像的编码字节,没有任何前缀。
尝试 reader.result.split(',')[1]
过滤掉前缀并仅传递请求中的编码字节。
您可以尝试将 reader.result 转换为二进制字节。
function getBinary(encodedFile) {
var base64Image = encodedFile.split("data:image/jpeg;base64,")[1];
var binaryImg = atob(base64Image);
var length = binaryImg.length;
var ab = new ArrayBuffer(length);
var ua = new Uint8Array(ab);
for (var i = 0; i < length; i++) {
ua[i] = binaryImg.charCodeAt(i);
}
var blob = new Blob([ab], {
type: "image/jpeg"
});
return ab;
}
您基本上可以为字节设置上述方法的响应:
Bytes: getBinary(reader.result),
万一有人在节点端执行此操作,我 运行 在以字节数组缓冲区形式读取文件并将其发送到 Rekognition 时遇到了类似的问题。
我通过读取 base64 表示形式解决了这个问题,然后将其转换为这样的缓冲区:
const aws = require('aws-sdk');
const fs = require('fs');
var rekognition = new aws.Rekognition({
apiVersion: '2016-06-27'
});
// pull base64 representation of image from file system (or somewhere else)
fs.readFile('./test.jpg', 'base64', (err, data) => {
// create a new base64 buffer out of the string passed to us by fs.readFile()
const buffer = Buffer.from(data, 'base64');
// now that we have things in the right type, send it to rekognition
rekognition.detectLabels({
Image: {
Bytes: buffer
}
}).promise()
.then((res) => {
// print out the labels that rekognition sent back
console.log(res);
});
});
这也可能与收到以下消息的人有关:Expected params.Image.Bytes to be a string, Buffer, Stream, Blob, or typed array object
。
使用 React 构建一个简单的 AWS Rekognition 演示,使用 <input type="file">
出现 Invalid image encoding
错误。
let file = e.target.files[0];
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = () => {
let rekognition = new aws.Rekognition();
var params = {
Image: { /* required */
Bytes: reader.result,
},
MaxLabels: 0,
MinConfidence: 0.0
};
rekognition.detectLabels(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
GitHub 回购:https://github.com/html5cat/vision-test/
ReadAsDataUrl 中的 return 值包含一个前缀,表示数据的 MIME-TYPE 和编码。 (“image/png;base64, IVBORsdafasdfasf...”)。
但是,Rekognition API 只需要图像的编码字节,没有任何前缀。
尝试 reader.result.split(',')[1]
过滤掉前缀并仅传递请求中的编码字节。
您可以尝试将 reader.result 转换为二进制字节。
function getBinary(encodedFile) {
var base64Image = encodedFile.split("data:image/jpeg;base64,")[1];
var binaryImg = atob(base64Image);
var length = binaryImg.length;
var ab = new ArrayBuffer(length);
var ua = new Uint8Array(ab);
for (var i = 0; i < length; i++) {
ua[i] = binaryImg.charCodeAt(i);
}
var blob = new Blob([ab], {
type: "image/jpeg"
});
return ab;
}
您基本上可以为字节设置上述方法的响应:
Bytes: getBinary(reader.result),
万一有人在节点端执行此操作,我 运行 在以字节数组缓冲区形式读取文件并将其发送到 Rekognition 时遇到了类似的问题。
我通过读取 base64 表示形式解决了这个问题,然后将其转换为这样的缓冲区:
const aws = require('aws-sdk');
const fs = require('fs');
var rekognition = new aws.Rekognition({
apiVersion: '2016-06-27'
});
// pull base64 representation of image from file system (or somewhere else)
fs.readFile('./test.jpg', 'base64', (err, data) => {
// create a new base64 buffer out of the string passed to us by fs.readFile()
const buffer = Buffer.from(data, 'base64');
// now that we have things in the right type, send it to rekognition
rekognition.detectLabels({
Image: {
Bytes: buffer
}
}).promise()
.then((res) => {
// print out the labels that rekognition sent back
console.log(res);
});
});
这也可能与收到以下消息的人有关:Expected params.Image.Bytes to be a string, Buffer, Stream, Blob, or typed array object
。