Win10下SDL2搭配Cairo绘图RGB颜色显示失真问题求助
问题核心原因
颜色异常是多重配置错误共同导致的,按优先级修复如下:
1. 像素格式字节序不匹配
Cairo的CAIRO_FORMAT_ARGB32在Windows小端架构下,内存存储顺序为B-G-R-A,而你当前创建SDL纹理用的SDL_PIXELFORMAT_ARGB8888存储顺序为R-G-B-A,红蓝色通道完全颠倒,是你设置红色实际显示为蓝色的直接原因。
2. 混合模式配置错误
你设置的SDL_BLENDMODE_MUL是乘法混合模式,会将纹理颜色和下层的品红色清屏颜色做乘法运算,进一步导致色偏。
3. Cairo表面未初始化清屏
Cairo创建的新表面默认是未初始化的脏数据,透明区域像素值异常会和色键逻辑冲突。
4. 表面参数传参错误
创建Cairo表面时高度参数误写为窗口宽度,会导致绘图区域变形、内存越界。
修复步骤
修改#if 1分支下的代码如下:
// 方式一修改后代码 int windowWidth = 640, windowHeight = 480; // 修复第三个参数为窗口高度 surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, windowWidth, windowHeight); cr = cairo_create(surface); // 新增:先给Cairo表面填充色键对应的品红色,匹配窗口透明配置 cairo_set_source_rgb(cr, 1.0, 0, 1.0); cairo_paint(cr); cairo_set_line_width(cr, 1); // cairo设置红色 cairo_set_source_rgb(cr, .9, 0, 0); cairo_rectangle(cr, 100, 100, 180, 90); cairo_stroke(cr); unsigned char *data = cairo_image_surface_get_data(surface); SDL_Texture *texture; SDL_Rect rect = {.x=0, .y=0, .w=windowWidth, .h=windowHeight}; // 修复1:纹理格式改为BGRA8888匹配Cairo的字节序 texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA8888, SDL_TEXTUREACCESS_STREAMING, windowWidth, windowHeight); // 修复2:改为正常alpha混合 SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); int widthPitch = windowWidth << 2; SDL_UpdateTexture(texture, &rect, data, widthPitch);
如果使用方式二的逻辑,同步修改纹理格式为SDL_PIXELFORMAT_BGRA8888,并在绘图前给Cairo表面填充色键颜色即可。
内容的提问来源于stack exchange,提问作者majiao
相关产品推荐
相关产品推荐

