2017-04-25 1 views
1

Construire une simple démo AWS Rekognition avec React, en utilisant <input type="file">AWS SDK Rekognition JS erreur de codage d'image non valide

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

enter image description here

repo GitHub: https://github.com/html5cat/vision-test/

GitHub Issue: https://github.com/html5cat/vision-test/issues/1

Répondre

2

Vous pouvez essayer de convertir le fichier reader.result en octets binaires.

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

Vous pouvez définir essentiellement la réponse de la méthode ci-dessus pour Octets:

Bytes: getBinary(reader.result), 
+0

Cela a fonctionné. Je vous remercie! –

+0

Merci beaucoup! –

0

La valeur de retour de ReadAsDataUrl inclut un préfixe indiquant type MIME de données et le codage. ("image/png; base64, IVBORsdafasdfasf ..."). Cependant, l'API Rekognition attend uniquement les octets codés de l'image, sans aucun préfixe.

Essayez reader.result.split(',')[1] en filtrant le préfixe et en transmettant uniquement les octets codés dans votre requête.

+0

Ne semble pas fonctionner non plus. –

0

Dans le cas où quelqu'un fait cela sur le côté du nœud, je courais un problème similaire lors de la lecture dans un fichier en tant que tampon de tableau d'octets et en l'envoyant à Rekognition.

Je l'ai résolu en lisant la place dans la représentation base64, puis le transformer en un tampon comme celui-ci:

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

    }); 

}); 

Cela pourrait être aussi utile pour les gens obtenir le: un message Expected params.Image.Bytes to be a string, Buffer, Stream, Blob, or typed array object.