3

サーバー(Webサイト)から画像をダウンロードして回転する背景画像を設定しようとしていますが、curlでこれを実行しようとしましたが、これは成功しませんでした. 私のコードの(短縮された)バージョンは以下のとおりです。エラーは発生していませんが、この画像を「一時的に」保存して背景として表示するにはどうすればよいですか? 画像(型変数)とかあるの?

これは単なる学習体験であるため、ライブラリや提案は大歓迎です。

#include <curl/curl.h>
CURL *curlCtx = curl_easy_init();
curl_easy_setopt(curlCtx, CURLOPT_URL, "http://www.examplesite.com/testimage.jpeg");
curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, this);
curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction);
const CURLcode rc = curl_easy_perform(curlCtx);
if(rc == CURLE_OK){
    //it worked
}


size_t callbackfunction(char *data, size_t size, size_t nmemb, void *stream){
    //do something here with image...?
}

ありがとう、ジェームズ

編集:申し訳ありませんが、誤ってコールバック関数に () を追加しました。

4

1 に答える 1

7

あなたのコードはコンパイルできません! うーん!

callbackfunction()受信データ ストリームを処理するには、 を実装する必要があります。この場合、データをファイルに書き込みたいと思いますよね?

呼び出しの戻りを確認することは常に良い習慣なので、私が共有しているソース コードを注意深く調べてください。以下のプログラムは、あなたがやろうとしていたことを達成します。

dw.cpp :

#include <stdio.h>
#include <curl/curl.h>

size_t callbackfunction(void *ptr, size_t size, size_t nmemb, void* userdata)
{
    FILE* stream = (FILE*)userdata;
    if (!stream)
    {
        printf("!!! No stream\n");
        return 0;
    }

    size_t written = fwrite((FILE*)ptr, size, nmemb, stream);
    return written;
}

bool download_jpeg(char* url)
{
    FILE* fp = fopen("out.jpg", "wb");
    if (!fp)
    {
        printf("!!! Failed to create file on the disk\n");
        return false;
    }

    CURL* curlCtx = curl_easy_init();
    curl_easy_setopt(curlCtx, CURLOPT_URL, url);
    curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, fp);
    curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction);
    curl_easy_setopt(curlCtx, CURLOPT_FOLLOWLOCATION, 1);

    CURLcode rc = curl_easy_perform(curlCtx);
    if (rc)
    {
        printf("!!! Failed to download: %s\n", url);
        return false;
    }

    long res_code = 0;
    curl_easy_getinfo(curlCtx, CURLINFO_RESPONSE_CODE, &res_code);
    if (!((res_code == 200 || res_code == 201) && rc != CURLE_ABORTED_BY_CALLBACK))
    {
        printf("!!! Response code: %d\n", res_code);
        return false;
    }

    curl_easy_cleanup(curlCtx);

    fclose(fp);

    return true;
}

int main(int argc, char** argv)
{
    if (argc < 2)
    {
       printf("Usage: %s <url>\n", argv[0]);
       return -1;
    }

    if (!download_jpeg(argv[1]))
    {
        printf("!! Failed to download file: %s\n", argv[1]);
        return -1;
    }

    return 0;
}

コンパイル済み:g++ dw.cpp -o dw -lcurlおよびテスト済み:

./dw http://unicornify.appspot.com/avatar/51d623f33f8b83095db84ff35e15dbe8?s=128

このアプリケーションは、out.jpgダウンロードしたデータで指定されたディスクにファイルを作成します。

于 2012-04-11T20:33:41.330 に答える