You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:43:24