=============== Эта часть не была точной. пожалуйста, смотрите мою часть решения ниже ====
int data [w * h * channel_num]; все в порядке, это не причина, по которой вы потерпели неудачу.
Изменить эту строку
stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);
до
stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * sizeof(int));
Вы получите то, что хотите.
По последним параметрам я считаю это шагом. Если это так, шаг означает смещение между двумя линиями. Исходя из вашего вопроса, я предполагаю, что у вас есть цвет 128 х 128 х 32 бита. Тогда шаг будет w * sizeof (int).
Если НЕТ, дайте мне знать.
Извините, я спешил на встречу.
============ Эта часть является частью решения ====
Да,
int data[w * h * channels_num];
должно быть
unsigned char data[w * h * channels_num];
Плюс,
stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);
следует изменить на
stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);
Полное решение
void save_image(int w, int h, int channels_num)
{
unsigned char data[w * h * channels_num];
int index = 0;
for (int j = h - 1; j >= 0; --j)
{
for (int i = 0; i < w; ++i)
{
data[index++] = (unsigned char)(255.0 * i / w);
data[index++] = (unsigned char)(255.0 * j / h);
data[index++] = (unsigned char)(255.0 * 0.2);
}
}
stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);
}