With the last parameter to stbi_load, you're telling it that you only want a 3-channel result, regardless of the source data. That parameter should be zero to say that you want however many are in the file.

At the moment, you're branching based on how many channels were in the file, but your pixel data is always being converted to 3-channel for all cases (leading to GL trying to interpret RGB as RGBA -- giving you pixels containing RGBR GBRG BRGB...)