2014-03-05 57 views
0

我无法使用curl从URL获取图像。如果我将URL作为ImageMagick Image对象的构造函数传递,它将起作用。但使用卷曲我没有太多的运气,我需要使用卷曲。如何使用卷曲获取图像?

现在我在做......

curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlCallback); 
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
curl_easy_perform(curl); 

然后

size_t curlCallback(char* buf, size_t size, size_t nmemb, void* up) 
{                 
    ofstream out; 
    out.open("/home/name/Desktop/img.png"); 
    out.write(buf, nmemb * size); 

    return size * nmemb; 
} 

它似乎得到一个PNG的开始,而不是整个事情。它只返回251个字节(标题信息或东西可能??)。图像查看器将以png的形式打开并了解其分辨率,但图像本身是空白的。如果我将缓冲区打印到控制台,我会看到PNG和二进制数据符号。

我知道它不是与远程主机的一个问题,因为如果我使用ImageMagick的:

Image image = Image(url); 

然后我得到了它的整体形象,可以保存它,它就好了。

+1

'curlCallback'可以在下载过程中多次调用(请参阅文档[http://curl.haxx.se/libcurl/c/curl_easy_setopt.html])。使用传递FILE *的'CURLOPT_WRITEDATA'可能会更容易。 –

+0

好的电话,拥有这些新知识,我已经打败了这个问题。如果你想写这个答案,我会选择它作为解决方案。 – Aurast

+0

添加它作为评论,因为我没有工具来尝试提出的解决方案,很高兴你知道了。 –

回答

0

在下载过程中可以多次调用CURLOPT_WRITEFUNCTION(您的情况为curlCallback)所设置的功能(请参阅文档)。

使用CURLOPT_WRITEDATA通过FILE*可能会更容易。