2016-04-25 7 views
1

REST APIコールからjpegイメージを取得する必要があります。リクエストでは認証ヘッダーが必要なためXMLHttpRequestを使用しています(つまり、画像を作成してユーザーにURLを送信することはできません:passwd @ url)。レスポンスからXmlHttpRequest(REST)へのQMLイメージの表示

私はCanvasを使用し、drawImageを呼び出すには、RESTデータをCanvasImageDataオブジェクトに設定することができると考えました。ただし、何も描画されず、エラーも発生しません。 REST呼び出しはContent-Type:image/jpegを返し、Transfer-Encoding:チャンクを返します。

このアプローチはうまくいくのでしょうか、それとも他に何か不足していますか?より良い提案はありますか?

// map_request.imageBytes is a property that holds the binary response from the REST query 
Canvas { 
id: location_map 
width: 2400 
height: 1500 
contextType: '2d' 

onPaint: { 
    if (context && map_request.imageBytes) 
    { 
    var cid = context.createImageData(width, height); 
    cid.data = map_request.imageBytes; 
    context.drawImage(cid, 0, 0); 
    } 
} 
+2

'cid.data'は、生の画像データではなくRGBA順の画像ピクセルデータでなければなりません。サーバーからbase64でエンコードされた文字列としてイメージを受け取ることはできますか?この場合、イメージを 'img.source = 'data:image/png; base64、...ここでコード化されたデータとして作成することができます。別の回避策は、カスタムイメージプロバイダを使用することです。 – folibis

+0

あなたが知っているのは、アップルの@folibisに対する答えです。 – BaCaRoZzo

+0

base64でエンコードされた画像データを取得できないため、カスタム画像プロバイダに切り替える必要があります。 CanvasImageDataのフォーマットを明確にしていただきありがとうございます。私の質問に対する回答を自由に作成してください。私はあなたのためにそれをマークします。 – Bargonaut

答えて

0

適切な解決策は、指示された@folibisとしてQQuickImageProviderを作成することです。しかし、私はQt5.5を使用しているので、私は(Qt5.6で導入された)QQuickAsyncImageProviderを作ることはできません。代わりに、QQuickImageProviderを構築するときに、QQmlImageProviderBase :: ForceAsynchronousImageLoadingにフラグを設定する必要があります。このフラグは、requestImageの呼び出しがメインのGUIスレッドをブロックしないようにします。

しかし、requestImageはImageが返されることを期待しており、そのスレッドをブロックせずにネットワークからイメージデータを取得することに挑戦しています。 QNetworkAccessManagerは信号で状態を返します.QQuickImageProviderはQObjectではないため、QNetworkReplyの信号を監視するヘルパークラスを作成しました。

class ReplyMonitor : public QObject 
{ 
    Q_OBJECT 
public: 
    ReplyMonitor(QNetworkAccessManager *); 

public Q_SLOTS: 
    void handleReplyFinished(); 
    void handleSslErrors(QNetworkReply *, const QList<QSslError> &); 
    void handleAuthenticationRequired(QNetworkReply *, QAuthenticator *); 

public: 
    bool finished; 
}; 

ReplyMonitor::ReplyMonitor(QNetworkAccessManager *mgr) 
    : finished(false) 
{ 
    connect(mgr, SIGNAL(finished(QNetworkReply *)), this, SLOT(handleReplyFinished())); 
    connect(mgr, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)), 
      this, SLOT(handleSslErrors(QNetworkReply*, const QList<QSslError> &))); 
    connect(mgr, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)), 
      this, SLOT(handleAuthenticationRequired(QNetworkReply*, QAuthenticator*))); 
} 

void ReplyMonitor::handleReplyFinished() 
{ 
    finished = true; 
} 

次にrequestImage()に私はOM finishedをチェックして、私は

if (reply->error() == QNetworkReply::NoError) 
    { 
    image.loadFromData(reply->readAll()); 
    } 

を返すようにイメージを作成する前に

while (!monitor->finished) 
    { 
    QCoreApplication::processEvents(QEventLoop::AllEvents, 1000); 
    } 

を呼び出しますQNetworkRequestを作成する詳細がよく書かれています。

関連する問題