梯度生成产生奇怪的伪影
Gradient generation produces strange artifacts
本文关键字:伪影 更新时间:2023-10-16
当我使用以下代码生成渐变时,它会在图像中心附近产生一个奇怪的裂缝状渐变。
生成代码:void getRgb(GLfloat* pixels1,GLubyte* out)//convert fractional values into color
{
for (int i = 0;i < 90*90;i++)
{
out[(i*3)+0] = pixels1[i]*255;
out[(i*3)+1] = pixels1[i]*255;
out[(i*3)+2] = pixels1[i]*255;
}
}
//gradient generation
multiplier = new GLfloat[90*90];// calc multiplier map
for(int i = 0;i < 90;i++)//2d to 1d
{
for (int j = 0;j < 90;j++)
multiplier[i*90 + j] = cos((j)*(3.14/180));
}
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
std::string path = "map.bmp";
SDL_SaveBMP(image, path.c_str());
delete save;
image->pixels = NULL;
SDL_FreeSurface(image);
生成的工件。
这是因为余弦值是负值。这些不能很好地处理无符号整数像素值,该像素值应该在[0,255]范围内。
问题是您创建了一个89x89的图像,并用90x90的数组填充它。在每行的末尾都有一个不匹配,并且由于每个像素是奇数字节,它将下一行移动一个字节。你的大部分像素几乎是灰色的,所以你看不到差异,但它显示在明暗之间的过渡。
好的,可以通过替换:
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, 89, 89, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
image->pixels = save;
:
GLubyte* save = new GLubyte[90*90*3];
getRgb(multiplier,save);
SDL_Surface* image = SDL_CreateRGBSurfaceFrom(save,
90,
90,
24,
90*3,
0x000000FF, 0x0000FF00, 0x00FF0000, 0);
相关文章:
- 使用 cblas_dgemm 计算伪逆的问题
- 如何找到C++的伪拷贝操作
- 如何实现此伪代码?
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 实现伪多项式DP子集和
- GPS伪范围到纬度/纬度坐标
- 假定 Windows 伪句柄的值是否安全/定义?
- Qt 4.8.7 内存伪影
- 如何轻松生成伪随机数?
- 有人可以为此提供伪代码吗?
- C++ 和 Python 实现之间的不同伪随机数
- MEX文件实现特征库伪内函数崩溃
- 使用来自更好的随机源的随机数播种伪随机生成器
- C++/C FFmpeg 伪影跨视频帧构建
- 在原点附近对实数进行舍入会导致旋转伪影
- 光线追踪网格上的伪影黑线(使用Embree)
- 直方图均衡化的性质?增强对比度,无伪影
- c++/OpenGL/GLSL,带有"random"伪影的纹理
- 梯度生成产生奇怪的伪影
- 从深度分析仪中去除伪影/噪声