SDL开发中获取屏幕平均颜色时GetPixel始终返回(0,0,0,0)怎么办
问题原因和修复方案
1. 整数除法导致计算结果恒为0
你代码里(1/3)(col.r + col.b + col.g)存在两处错误:
- C++中整数除法优先级高于乘法,
1/3是两个整数相除,结果会直接取整为0,无论后面的颜色和是多少,最终乘积都是0 - 语法上缺少乘号,部分编译器会把
(1/3)(xxx)识别为函数调用,直接编译失败
修复方案:改成浮点数运算,加上乘号:
coverage[i * height + j] = (1.0f / 3.0f) * (col.r + col.b + col.g);
2. 访问surface像素前未加锁
SDL要求访问SDL_Surface的pixels成员之前,必须先调用SDL_LockSurface锁定表面,访问结束后调用SDL_UnlockSurface解锁,否则读取pixels的行为是未定义的,很可能读到无效的0值。
修复方案:在调用SDL_RenderReadPixels之后、遍历像素之前加锁:
SDL_RenderReadPixels(renderer, NULL, format, surface->pixels, surface->pitch); SDL_LockSurface(surface); // 加锁 // 遍历像素、调用GetPixel的代码写在这里 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { // 原有逻辑 } } SDL_UnlockSurface(surface); // 解锁
3. 可选修复:二维数组索引计算错误
你当前的索引计算i * height + j在i等于width的时候会出现越界访问的问题,标准的行优先存储的索引公式应该是y * 宽度 + x,对应你的循环变量就是j * width + i:
coverage[j * width + i] = (1.0f / 3.0f) * (col.r + col.g + col.b);
4. 可选检查:函数声明顺序
如果你的GetPixel和get_pixel32函数是定义在遍历像素代码的后面,需要在调用前提前声明函数原型,否则C++会默认函数返回int类型,导致类型转换错误,读取到错误的颜色值。
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

