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

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;
}

使用的图像

黑字白底的BMP图像


问题原因

SDL_SetTextureColorMod的原理是对纹理中每个像素的RGB值进行乘法运算。黑色像素的RGB值为(0, 0, 0),乘以任何颜色值结果还是(0, 0, 0),所以黑色部分不会产生颜色变化。

解决方法

方案1:修改图像底色+颜色键+颜色调制

  1. 将图像中的黑色字符改为白色,保留白色背景;
  2. 在加载Surface后添加颜色键设置,将白色背景设为透明:
SDL_SetColorKey(surface, SDL_TRUE, SDL_MapRGB(surface->format, 255, 255, 255));
  1. 此时调用SDL_SetTextureColorMod(texture, 255, 0, 0),白色字符会被调制为红色。

方案2:混合模式+颜色调制(无需修改原图)

  1. 创建纹理后设置混合模式为加法混合:
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_ADD);
  1. 再调用SDL_SetTextureColorMod(texture, 255, 0, 0),黑色像素会与红色叠加,呈现出红色效果。

注意:该方法可能会让背景也带上淡红色,建议配合颜色键去除白色背景后使用。


内容的提问来源于stack exchange,提问作者Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:19