c++ - 从服务器下载图像(cUrl,但采纳建议)C++

标签 c++ c image curl download

我试图通过从服务器(网站)下载图像来设置旋转背景图像,并尝试使用 curl 来执行此操作,但在这方面取得了 0 次成功。我的代码的(缩短)版本如下。我没有收到错误,但是,如何“临时”保存此图像以将其显示为我的背景?有没有图片(-type 变量)之类的?

这只是一次学习经历,因此我们将不胜感激任何图书馆或建议。

#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...?
}

谢谢, 詹姆斯

编辑:对不起,我错误地将 () 添加到回调函数。

最佳答案

您的代码甚至无法编译! 急!

应该实现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 的文件。

关于c++ - 从服务器下载图像(cUrl,但采纳建议)C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10112959/

相关文章:

c - 如何使用第二个参数设置 0xFACE 的 ioctl 来调用特定函数?

c - 无法使用 sizeof() 检查内存分配大小

c - cairo 上下文对象 cr 在哪里声明?

css - IE CSS 覆盖帮助

javascript - 使用 lazySizes 插件立即加载所有图像

jquery - 让2张图片动起来,类似 "marquee"风格

c++ - 试图在 C++ 中对一个简单的字符串进行排序

c++ - 在 C++ 中使用从 C 库返回的指针

c++ - 通过多个函数调用初始化局部静态变量

c++ - STL 中的 acos、atan 函数是否使用大量 cpu 周期