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
相关产品推荐
相关产品推荐

