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

C++中实现SDL_Texture转SDL_Surface以保存USB接收的安卓相机帧

问题场景与解决方法

我开发了一款通过USB接收安卓手机相机视频的C++程序,目前可实现每秒接收30帧画面。程序中设置了保存单帧图片的按钮,但遇到了将SDL_Texture转换为SDL_Surface以使用IMG_SaveJPG保存图片的问题。

初始代码

if (isImageCompleted) {
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 50);
    SDL_RenderClear(renderer);
    isImageCompleted = false;
    totalReadBytes = 0;
    sdlRWops = SDL_RWFromMem(&imgData[0], imgData.size());
    if (sdlRWops != NULL) {
        texture = IMG_LoadTexture_RW(renderer, sdlRWops, 0);
        SDL_RenderCopyEx(renderer, texture, NULL, &rect, 0, NULL, SDL_FLIP_NONE);
        // 点击按钮后isSavingImage变为true
        if (isSavingImage) {
            isSavingImage = false;
            // TODO 保存图片文件
        }
        drawButtonPic();
        SDL_DestroyTexture(texture);
        SDL_RenderPresent(renderer);
    }
    SDL_FreeRW(sdlRWops);
    imgData.clear();
}

解决方法及更新后代码

感谢@HolyBlackCat的建议,问题已解决。调整思路:先将图片数据加载为SDL_Surface,再基于该Surface创建SDL_Texture,即可直接使用IMG_SaveJPG保存图片。

更新后代码:

if (isImageCompleted) {
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 50);
    SDL_RenderClear(renderer);
    isImageCompleted = false;
    totalReadBytes = 0;
    sdlRWops = SDL_RWFromMem(&imgData[0], imgData.size());
    if (sdlRWops != NULL) {
        // texture = IMG_LoadTexture_RW(renderer, sdlRWops, 0);
        mSurface = IMG_Load_RW(sdlRWops, 0);
        texture = SDL_CreateTextureFromSurface(renderer, mSurface);
        SDL_RenderCopyEx(renderer, texture, NULL, &rect, 0, NULL, SDL_FLIP_NONE);
        if (isSavingImage) {
            isSavingImage = false;
            IMG_SaveJPG(mSurface, "test.jpg", 100);          
        }
        drawButtonPic();
        SDL_DestroyTexture(texture);
        SDL_RenderPresent(renderer);
    }
    SDL_FreeRW(sdlRWops);
    imgData.clear();
}

内容的提问来源于Stack Exchange,提问作者obeid salem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:45:07