SDL_SetTextureColorMod无法生效,无法将黑色字符改为红色求排查
SDL_SetTextureColorMod无法将黑色字符改为红色的问题排查
我尝试修改图像中黑色字符的显示颜色为红色,使用SDL_SetTextureColorMod函数设置后,渲染结果仍为黑色,怀疑代码存在问题,请求排查。
代码示例
#include "SDL.h" #include <stdio.h> int main(int argc, char **argv) { SDL_Init(SDL_INIT_VIDEO); SDL_Window *window; SDL_Renderer *renderer; SDL_CreateWindowAndRenderer(640, 480, 0, &window, &renderer); SDL_Surface *surface = SDL_LoadBMP("font.bmp"); SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); int keep_going = 1; while (keep_going) { SDL_Event e; while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { keep_going = 0; } } SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); int ret = SDL_SetTextureColorMod(texture, 255, 0, 0); if(ret != 0){ printf("%s",SDL_GetError()); } SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); } SDL_Quit(); return 0; }
使用的图像

问题原因
SDL_SetTextureColorMod的原理是对纹理中每个像素的RGB值进行乘法运算。黑色像素的RGB值为(0, 0, 0),乘以任何颜色值结果还是(0, 0, 0),所以黑色部分不会产生颜色变化。
解决方法
方案1:修改图像底色+颜色键+颜色调制
- 将图像中的黑色字符改为白色,保留白色背景;
- 在加载Surface后添加颜色键设置,将白色背景设为透明:
SDL_SetColorKey(surface, SDL_TRUE, SDL_MapRGB(surface->format, 255, 255, 255));
- 此时调用
SDL_SetTextureColorMod(texture, 255, 0, 0),白色字符会被调制为红色。
方案2:混合模式+颜色调制(无需修改原图)
- 创建纹理后设置混合模式为加法混合:
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_ADD);
- 再调用
SDL_SetTextureColorMod(texture, 255, 0, 0),黑色像素会与红色叠加,呈现出红色效果。
注意:该方法可能会让背景也带上淡红色,建议配合颜色键去除白色背景后使用。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

