2016-04-18 22 views
0

私はプロジェクトをやっています。まず、URLから画像をダウンロードして保存します。後の段階で画像を処理します。この目的のために、私はopencvと一緒にビジュアルスタジオでcurlライブラリを使用しています。curlライブラリを使用するのは初めてです。私は答えhereを見ました。しかし、私は理解できないit.Hereは私のコードURLからカールを使って画像をダウンロードするC++で

#include <stdio.h> 
 
#include <curl/curl.h> 
 
#include <curl/types.h> 
 
#include <curl/easy.h> 
 
#include <string> 
 

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

 
int main(void) 
 
{ 
 
    CURL* curl; 
 
    FILE* fp; 
 
    CURLcode res; 
 
    char* url = "http://pimg.tradeindia.com/01063301/b/1/CRO-Oscilloscope.jpg"; 
 
    char outfilename[FILENAME_MAX] = "C:\\bbb.jpg"; 
 
    curl = curl_easy_init(); 
 
    if (curl) 
 
    { 
 
     fp = fopen(outfilename, "wb"); 
 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
 
     res = curl_easy_perform(curl); 
 
     /* always cleanup */ 
 
     curl_easy_cleanup(curl); 
 
     fclose(fp); 
 
    } 
 
    return 0; 
 
}

助けてくれてありがとうです。

答えて

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

+0

私はargcとargvに関してコードを理解していません。あなたはそれらを使わずに説明できますか? –

+0

上記のコードをコンパイルすると、-1が返されます。argc <1のようなものです –

0

私はargcとargvに関してコードを理解していません。あなたはそれらを使わずに説明できますか? - john smith

プログラムの起動時にコマンドライン引数を渡すために使用されます。 argvはcstringの配列へのダブルポインタで、argcはcstringの数です。この場合のargv [0]は実行可能ファイルの名前になり、argv [1]はダウンロードするイメージのURLになります。すなわちfoo.exe http://path/to/image.jpg

関連する問題