reactjs AWS Rekognition JS SDK无效图像编码错误

bn31dyow  于 2022-12-18  发布在  React
关注(0)|答案(3)|浏览(106)

使用<input type="file">,通过React构建简单的AWS Rekognition演示
获取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/
GitHub问题:https://github.com/html5cat/vision-test/issues/1

eni9jsuy

eni9jsuy1#

您可以尝试将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设置上述方法的响应:

Bytes: getBinary(reader.result),
oaxa6hgo

oaxa6hgo2#

如果有人在节点端这样做,我在将文件作为字节数组缓冲区阅读入并将其发送到Rekognition时也遇到了类似的问题。
我解决这个问题的方法是阅读base64表示,然后将其转换为如下缓冲区:

const aws = require('aws-sdk');
const fs = require('fs');

const 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消息。

ckocjqey

ckocjqey3#

ReadAsDataUrl的返回值包括一个前缀,用于指示数据的MIME类型和编码。(“**image/png; base64、**IVBOR数据库数据库数据库数据库...”)。
但是,Rekognition API只需要图像的编码字节,而不需要任何前缀。
尝试reader.result.split(',')[1]过滤掉前缀,只传递请求中的编码字节。

相关问题