C++ 在SDL2中垂直翻转曲面

C++ 在SDL2中垂直翻转曲面,c++,sdl-2,sdl-image,C++,Sdl 2,Sdl Image,我得到的最接近的结果是: void Engine::flipSurfaceVertically(SDL_Surface* surface) { SDL_LockSurface(surface); Uint8* pixels = reinterpret_cast<Uint8*>(surface->pixels); for (int k = 0; k < sizeof(Uint32); ++k) { for (int i =

我得到的最接近的结果是:

void Engine::flipSurfaceVertically(SDL_Surface* surface)
{
    SDL_LockSurface(surface);

    Uint8* pixels = reinterpret_cast<Uint8*>(surface->pixels);
    for (int k = 0; k < sizeof(Uint32); ++k)
    {
        for (int i = 0; i < surface->w; ++i)
        {
            for (int j = 0; j < surface->h / 2; ++j)
            {
                Uint32 currentPos = (j * surface->pitch) + (i * sizeof(Uint32)) + k;
                Uint32 target = ((surface->h - j - 1) * surface->pitch) + (i * sizeof(Uint32)) + k;
                Uint8 temp = pixels[target];
                pixels[target] = pixels[currentPos];
                pixels[currentPos] = temp;
            }
        }
    }

    SDL_UnlockSurface(surface);
}
void引擎::翻转曲面(SDL_曲面*曲面)
{
SDL_锁面(表面);
Uint8*像素=重新解释投影(表面->像素);
对于(int k=0;kw;++i)
{
对于(int j=0;jh/2;++j)
{
Uint32 currentPos=(j*表面->节距)+(i*尺寸f(Uint32))+k;
Uint32目标=((曲面->h-j-1)*曲面->俯仰)+(i*sizeof(Uint32))+k;
Uint8 temp=像素[目标];
像素[目标]=像素[当前位置];
像素[currentPos]=温度;
}
}
}
SDL_解锁表面(表面);
}

但它不能保持透明度。我怎样才能真正做到这一点呢?

我不知道错误到底出在哪里,我在我的机器上尝试了你的代码,它在我使用的图像上运行良好。我怀疑您的代码确实保持了透明性,但在以后的实现中它会被删除

无论如何,如果我可以建议对代码进行改进的话:垂直翻转曲面不需要如此复杂的操作。该结构以行主顺序存储像素数据,这意味着
像素
数组是一个行序列,其中每一行的大小都为
节距
字节。因此,要垂直翻转曲面,只需在行上迭代并交换它们。这种方法的优点是,它不需要像素格式的知识,因此可以实现所有图像类型(alpha通道或非alpha通道),而且实现起来非常简单

下面是一个您可以编译和试验的最小示例:

#包括
#包括
无效翻转曲面(SDL曲面*曲面)
{
SDL_锁面(表面);
int pitch=曲面->节距;//行大小
char*temp=new char[pitch];//中间缓冲区
字符*像素=(字符*)表面->像素;
对于(int i=0;ih/2;++i){
//获取指向要交换的两行的指针
char*row1=像素+i*间距;
字符*行2=像素+(表面->h-i-1)*间距;
//交换行
memcpy(临时、第1行、节距);
memcpy(第1行、第2行、音高);
memcpy(第2排、温度、节距);
}
删除[]临时;
SDL_解锁表面(表面);
}
int main(int argc,char*argv[])
{
SDL_Init(SDL_Init_视频);
SDL_Surface*Surface=IMG_Load(“image.png”);
翻转曲面(曲面);
IMG_SavePNG(surface,“result.png”);
SDL_退出();
返回0;
}

我不知道错误的确切位置,我在我的机器上尝试了你的代码,它在我使用的图像上运行良好。我怀疑您的代码确实保持了透明性,但在以后的实现中它会被删除

无论如何,如果我可以建议对代码进行改进的话:垂直翻转曲面不需要如此复杂的操作。该结构以行主顺序存储像素数据,这意味着
像素
数组是一个行序列,其中每一行的大小都为
节距
字节。因此,要垂直翻转曲面,只需在行上迭代并交换它们。这种方法的优点是,它不需要像素格式的知识,因此可以实现所有图像类型(alpha通道或非alpha通道),而且实现起来非常简单

下面是一个您可以编译和试验的最小示例:

#包括
#包括
无效翻转曲面(SDL曲面*曲面)
{
SDL_锁面(表面);
int pitch=曲面->节距;//行大小
char*temp=new char[pitch];//中间缓冲区
字符*像素=(字符*)表面->像素;
对于(int i=0;ih/2;++i){
//获取指向要交换的两行的指针
char*row1=像素+i*间距;
字符*行2=像素+(表面->h-i-1)*间距;
//交换行
memcpy(临时、第1行、节距);
memcpy(第1行、第2行、音高);
memcpy(第2排、温度、节距);
}
删除[]临时;
SDL_解锁表面(表面);
}
int main(int argc,char*argv[])
{
SDL_Init(SDL_Init_视频);
SDL_Surface*Surface=IMG_Load(“image.png”);
翻转曲面(曲面);
IMG_SavePNG(surface,“result.png”);
SDL_退出();
返回0;
}

是的,我意识到有些事情需要尝试。首先,我决定重新调整stb_image对sdl2加载翻转功能的实现;然后我意识到它正在进行透视,我只是没有意识到,因为我还不太熟悉着色器。非常好@wanpelt!很遗憾,这个功能不是库的一部分。我想类似的东西可以用来翻转图像horizontally@AntonioCS可悲的是,水平翻转图像的操作不同,不。在我的代码中,我使用了一个事实,即行存储在连续的内存块中,因此,我可以在单个操作中安全地读写行。列不是这种情况,因此如果要水平翻转图像,需要逐像素交换图像。@wanpelt Right,您不能完全使用代码,但交换的原则仍然可以。我想水平翻转可能会有问题。谢天谢地,我意识到有些事情需要尝试。首先,我决定重新调整stb_image对sdl2加载翻转功能的实现;然后我意识到它正在进行透视,我只是没有意识到,因为我还不太熟悉着色器。非常好@wanpelt!很遗憾,这个功能不是库的一部分。我想类似的东西可以用来翻转图像horizontally@AntonioCS遗憾的是,水平翻转图像的操作不同,不。在我的代码中,我使用的是行是