Извините за воскрешение старого потока, но я попал сюда после поиска в Google, как писать 16-битные изображения в градациях серого. Я столкнулся с похожими проблемами и подумал, что было бы полезно опубликовать, как я решил проблему.
TL; DR:
a) Сначала байты должны быть переданы в библиотеку MSB, поэтому она работает, если перевернуть строки выше к этому:
*row++ = (png_byte)(color >> 8);
*row++ = (png_byte)(color & 0xFF);
b) Чтобы увидеть 16-битное значение на 8-битном экране, любые значения ниже 256 будут просто обрезаны до черного. Практически говоря, значения, которые кратны 256, должны использоваться, чтобы увидеть что-либо вообще. Приведенный выше код color = x + y, вероятно, не дал достаточно ярких значений.
Как я пришел к выводам выше:
Я начал с приведенного выше кода, используя в качестве цвета только «x», а не «x + y».
Намерение состояло в том, чтобы иметь градиент, который постепенно исчезал от черного слева до любого максимального значения x справа.
Однако вместо одного длинного градиента я получил несколько узких градиентов. Это кричало "НЕПРАВИЛЬНАЯ КОНЕЧНОСТЬ!"
Я попытался инвертировать биты, но затем я получил черное изображение. Мне потребовалось некоторое время, чтобы понять, но, поскольку экран отображается только в 8 битах, даже максимальное значение (в моем случае) 968 было слишком темным. Это соответствует 2 или 3 на 8-битном экране, и даже с высокой гаммой я не мог видеть разницу.
Так как я знал, что мой максимальный X был примерно 1000, и что максимальное значение для 16-битного значения составляет 65000 иш, поэтому я использовал (x * 60) в качестве моего цвета. Это закончилось тем, что дало видимый результат.
Спасибо за оригинальный пост. Это был отличный пример для начала.