2016-04-18 4 views
0

Ich mache ein Projekt und es ist der erste Schritt beinhaltet ein Bild von einer URL herunterladen und speichern Sie es an einem bestimmten Ort. Weitere Verarbeitung wird auf das Bild in der späteren Phase getan werden. Zu diesem Zweck verwende ich Curl-Bibliotheken im Visual Studio zusammen mit opencv.Ich bin neu in der Verwendung von Curl-Bibliotheken. Ich sah eine Antwort here. Aber ich kann nicht verstehen, it.Here ist mein CodeLaden Sie ein Bild von einer URL mit curl in 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; 
 
}

Danke für die Hilfe.

Antwort

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

Was ist damit?

+0

Ich verstehe den Code in Bezug auf Argc und Argv nicht. Kannst du es erklären, ohne sie zu benutzen? –

+0

Wenn ich den obigen Code kompiliert habe, gibt er -1.Sie wie argc <1 zurück –

0

Ich verstehe den Code nicht in Bezug auf Argc und Argv. Kannst du es erklären, ohne sie zu benutzen? - John Smith

Sie werden verwendet, um Befehlszeilenargumente zu übergeben, wenn Sie das Programm starten. argv ist ein doppelter Zeiger auf ein Array von cstrings und argc ist die Anzahl der cstrings. argv [0] wäre in diesem Fall der Name der ausführbaren Datei und argv [1] wäre die URL des zu ladenden Bildes. d. h. foo.exe http://path/to/image.jpg