2017-04-19 92 views
4

AWS Rekognition Javascript api指出,对于rekognition.compareFaces(params,...)方法,'SourceImage'和'TargetImage'可以采用'Bytes'或S3。我想用“字节”,可“(缓冲区,类型数组,斑点,字符串)” compareFaces JS APIAWS Rekognition Javascript SDK使用字节

当我通过图像的Base64编码字符串,在JS SDK再次重新编码(即双编码)。因此服务器错误响应说

{ “__type”: “InvalidImageFormatException”, “消息”: “无效图像 编码”}

没有人管理使用Base64使用JS API SDK编码图片? (而不是s3)或任何使用'Bytes'参数的JS示例都会有所帮助。

+1

我也在寻找如何做到这一点的答案,因为我一直无法做到这一点。我曾尝试使用Base64编码的字符串,其结果与上面相同,并尝试将其转换为Uint8array,Blob和ArrayBuffer,但仍未取得成功。有没有人有一个可行的例子?我的源数据位于HTML5 Canvas对象中。 –

回答

0

从这个AWS Rekognition JS SDK Invalid image encoding error线程的技术工作。

转换中的Base64图像编码到一个ArrayBuffer:

function getBinary(base64Image) { 

    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); 
    } 

    return ab; 
} 

进入rekognition为字节参数:

var data = canvas.toDataURL('image/jpeg'); 
    var base64Image = data.replace(/^data:image\/(png|jpeg|jpg);base64,/, "") 
    var imageBytes = getBinary(base64Image); 

    var rekognitionRequest = { 
     CollectionId: collectionId, 
     Image: { 
     Bytes: imageBytes 
     } 
    }; 
0

在节点中的一个文件中读取的时候,我遇到了类似的问题字节数组缓冲区并将其发送给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 buffer out of the string passed to us by fs.readFile() 
    const buffer = new Buffer(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消息。

0

似乎将字符串转换为缓冲区的工作更加一致,但文档很难找到。

为节点,您可以使用此向PARAMS从字符串(请确保您的数据...直到起飞了“”转换。

var params = { 
       CollectionId: collectionId, 
       Image: { 
        Bytes: new Buffer(imageBytes, 'base64') 
        } 
}; 

在正常的JS,你会希望能与ATOB转换并使用此代码传递的数组缓冲区。

function getBinary(base64Image) { 

    var binaryImg = Buffer.from(base64Image, 'base64').toString(); 
    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); 
    } 

    return ab; 
} 
0

我同样的问题,你有,我要告诉你我是如何解决它

亚马逊Rekognition支持图像类型的JPEG and PNG

这意味着如果你输入的图像文件与其他格式如webp编码,你总是会得到相同的错误。

在将不使用jpeg或png编码为jpeg的图像格式更改后,我可以解决该问题。

希望你能解决这个问题!