C++使用CURL下载图片直接加载到GDI+ Image对象崩溃求助
问题:直接加载CURL下载的图片到GDI+ Image对象时程序崩溃
原有实现(先保存文件再加载绘制)
最初我通过CURL下载图片到本地文件,再加载绘制:
下载保存代码
void saveImage(string url) { CURL* curl = curl_easy_init(); FILE* file = fopen("img.png", "wb"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, save_image); curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); fclose(data); // 注:原代码存在笔误,应为fclose(file) } size_t save_image(void* ptr, size_t size, size_t nmemb, FILE* file) { size_t written = fwrite(ptr, size, nmemb, data); // 注:原代码存在笔误,应为fwrite(ptr, size, nmemb, file) return written; }
绘制代码
case WM_PAINT: PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); Graphics gf(hdc); Image img(L"img.png"); gf.DrawImage(&img, 10, 10); EndPaint(hWnd, &ps); break;
预期的无文件直接加载逻辑
我希望跳过存文件步骤,直接把下载的图片加载到Image对象中,写了一个预期的实现示例(不确定写法是否正确):
void getImage(string url, Image &img) { CURL* curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, load_image); curl_easy_setopt(curl, CURLOPT_WRITEDATA, img); CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); } size_t load_image(void* ptr, size_t size, size_t nmemb, Image &img) { // 将下载的图片数据加载到img中 }
实际尝试的代码(点击按钮后崩溃)
参考从BYTE数组加载图片的示例后,我写出了以下代码,但点击按钮触发下载后程序直接崩溃:
下载并加载到Image的代码
void getImage(string url, Image *&img) { CURL* curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, load_image); curl_easy_setopt(curl, CURLOPT_WRITEDATA, img); CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); } size_t load_image(void* ptr, size_t size, size_t nmemb, Image *&img) { IStream* stream = ::SHCreateMemStream((BYTE*)ptr, size); img = Image::FromStream(stream); return size * nmemb; }
消息处理代码
... case WM_COMMAND: switch (wp) { case onButtonClicked: getImage(url, img); draw = true; InvalidateRect(hWnd, NULL, TRUE); break; } break; case WM_PAINT: { if (draw) { hdc = BeginPaint(hWnd, &ps); Graphics gf(hdc); gf.DrawImage(img, 10, 50); EndPaint(hWnd, &ps); } break; }
请帮忙解决程序崩溃的问题。
内容的提问来源于stack exchange,提问作者Ogurchik
相关产品推荐
相关产品推荐

