AWS Rekognition PHP SDK выдает недопустимую ошибку кодирования изображения

Я использую PHP SDK для загрузки локального файла (не S3) для анализа в AWS Rekognition. Однако большой двоичный объект изображения не будет работать, и я получаю сообщение: InvalidImageFormatException: "Invalid image encoding".

Я пробовал несколько изображений (документы говорят, что JPEG и PNG являются принято), но ничего не работает.

Мой код:

$client = new RekognitionClient($credentials);

$im = file_get_contents('/app/image1.png');
$imdata = base64_encode($im);

$result = $client->detectLabels(
    [
       'Image' => [
          'Bytes' => $imdata,
       ]
    ]
);

Я правильно кодирую? Документы довольно расплывчаты.

Я нашел ТАК вопросы о «Нет изображения», но не о недопустимом формате.

Любые идеи? Спасибо!


person samiles    schedule 15.12.2016    source источник
comment
Убедитесь, что base64_encode() не возвращает FALSE. Кроме того, попробуйте массив в старом стиле:   -  person Sergey Kovalev    schedule 15.12.2016
comment
@SergeyKovalev Да, base64_encode() действительно возвращает данные, как и ожидалось, и, к сожалению, изменение стиля массива тоже не сработало:/   -  person samiles    schedule 15.12.2016
comment
Что, если вы пропустите base64_encode() часть?   -  person Sergey Kovalev    schedule 15.12.2016
comment
Вы не должны использовать base64_encode(). Без него работает.   -  person nibty    schedule 21.12.2016
comment
@nibty Тогда что мне передать в запрос? Ничего не работает, кроме блоба Imagick?   -  person samiles    schedule 21.12.2016
comment
Я отправляю данные непосредственно из file_get_contents(). Я использую тот же код, что и вы, но передаю $im напрямую как Bytes. До сих пор это работало с несколькими jpg, которые я использовал. Можете ли вы поделиться одним из изображений, которые вы используете?   -  person nibty    schedule 21.12.2016


Ответы (3)


В итоге я использовал Imagick вместо маршрута base64_encode. Я подозреваю, что это не лучший способ, но он отлично работает!

$client = new RekognitionClient($credentials);

$image = new Imagick('/app/image1.png');
$imdata = $image->getImageBlob();

$result = $client->detectLabels(
    [
       'Image' => [
          'Bytes' => $imdata,
       ]
    ]
);
person samiles    schedule 15.12.2016
comment
Для этого вам не нужна никакая библиотека. Это точно так же, как просто позвонить file_get_contents('/app/image1.png'). - person Robo Robok; 31.12.2020

Похоже, вам не следует применять кодировку base64. SDK делает это для больших двоичных объектов.

https://github.com/aws/aws-sdk-php/blob/master/src/Api/Serializer/JsonBody.php:

        case 'blob':
            return base64_encode($value);
person Sergey Kovalev    schedule 15.12.2016
comment
Я не смог заставить это работать, у меня выдает ту же ошибку... - person samiles; 20.12.2016
comment
Похоже, документы запутались. Они должны сказать, что вы не можете, а не, возможно, не нужно. - person Robo Robok; 31.12.2020

    $s3 = new \Aws\Rekognition\RekognitionClient([
        'version' => 'latest',
        'region'  => 'us-east-1',
        'credentials' => [
            'key'    => 'BKxxxxxxxx',
            'secret' => 'GYxxxxxxxxxxxxxxxxxx'
        ]
    ]);

    $result = $s3->detectLabels([
        'Image' => [ // REQUIRED
            'Bytes' => file_get_contents("http://img13.deviantart.net/5a3b/i/2010/249/b/a/__michelangelo__s_flying_horse___by_dark_oak_trails-d2y5iej.jpg"),
        ],
        'MaxLabels' => 10,
        'MinConfidence' => 90,
    ]);

Вам не нужно кодировать изображение base64_enconde при использовании их SDK.

http://docs.aws.amazon.com/rekognition/latest/dg/API_Image.html

Вашему коду может не потребоваться кодировать байты изображения, если вы используете AWS SDK...

person Armesh Singh    schedule 22.06.2017