Sorry for resurrecting the old stream, but I got here after searching on Google to write 16-bit grayscale images. I ran into similar problems and I thought it would be helpful to post how I solved the problem.
TL DR:
a) Bytes must first be provided to the MSB library, so it works if you flip the lines above:
*row++ = (png_byte)(color >> 8); *row++ = (png_byte)(color & 0xFF);
b) To see a 16-bit value on an 8-bit screen, any values ββbelow 256 will simply be cropped to black. In practice, values ββthat are multiple of 256 must be used to see anything at all. The color code = x + y above probably did not give enough bright values.
As I came to the conclusions above:
I started with the code above, using only "x" as the color, not "x + y".
The goal was for the gradient, which disappeared from black on the left, to the point where max x was on the right.
However, instead of having one long gradient, I got a few narrow gradients. It shouted "WRONG FIND!"
I tried to invert the bits, but then I got a black image. It took some time to understand, but since the screen is only displayed in 8 bits, even the maximum value (in my case) of 968 was too dark. This displays 2 or 3 on an 8-bit screen, and even with high gamma I do not see the difference.
Since I knew that my max X was about 1000, and the maximum value for the 16-bit value is 65000 ish, so I used (x * 60) as my color. This led to a visible result.
Thanks for the original post. It was a great example to start with.